From dde5c1852d0089f2b47acfd7dbf77d2f6d39ae19 Mon Sep 17 00:00:00 2001 From: cxxxr Date: Mon, 25 Sep 2023 21:40:30 +0900 Subject: [PATCH] Delete bundled directory language-server-protocol as it is not used. --- language-server-protocol/.gitattributes | 4 - language-server-protocol/.gitignore | 4 - .../.vscode/settings.json | 38 - .../.vscode/spellright.dict | 19 - language-server-protocol/.vscode/tasks.json | 13 - language-server-protocol/404.html | 8 - language-server-protocol/Gemfile | 20 - language-server-protocol/Gemfile.lock | 288 - language-server-protocol/License.txt | 8 - language-server-protocol/SECURITY.md | 41 - .../ThirdPartyNotices.txt | 83 - language-server-protocol/_config.yml | 65 - .../_data/linkableTypes.yml | 860 - .../_data/lsif-0-4-0-toc.yml | 61 - .../_data/lsif-0-5-0-toc.yml | 65 - .../_data/lsif-0-6-0-toc.yml | 65 - language-server-protocol/_data/overviews.yml | 4 - .../_data/specification-3-14-toc.yml | 160 - .../_data/specification-3-15-toc.yml | 238 - .../_data/specification-3-16-toc.yml | 268 - .../_data/specification-3-17-toc.yml | 325 - .../_data/specification-3-18-toc.yml | 327 - .../_data/specifications.yml | 19 - .../_implementors/sdks.md | 36 - .../_implementors/servers.md | 215 - .../_implementors/tools.md | 59 - .../_includes/cookie_notice.html | 1 - .../_includes/footer.html | 46 - language-server-protocol/_includes/head.html | 18 - .../_includes/js_files.html | 72 - .../_includes/topnav.html | 29 - .../_layouts/default.html | 20 - .../_layouts/implementors.html | 42 - .../_layouts/overview.html | 37 - .../_layouts/redirect.html | 11 - .../_layouts/singlePage.html | 16 - .../_layouts/specifications.html | 105 - .../_overviews/lsif/img/foldingRange.png | Bin 11616 -> 0 bytes .../_overviews/lsif/img/hover.png | Bin 4721 -> 0 bytes .../_overviews/lsif/img/hoverResult.png | Bin 13606 -> 0 bytes .../_overviews/lsif/overview.md | 135 - .../lsp/img/language-server-sequence.png | Bin 69691 -> 0 bytes .../_overviews/lsp/img/language-server.png | Bin 57716 -> 0 bytes .../_overviews/lsp/overview.md | 94 - .../lsif/0.4.0/img/definitionResult.png | Bin 59343 -> 0 bytes .../lsif/0.4.0/img/foldingRange.png | Bin 11616 -> 0 bytes .../lsif/0.4.0/img/hoverResult.png | Bin 13606 -> 0 bytes .../lsif/0.4.0/img/referenceResult.png | Bin 55741 -> 0 bytes .../lsif/0.4.0/img/resultSet.png | Bin 50539 -> 0 bytes .../lsif/0.4.0/implementation.md | 114 - .../lsif/0.4.0/specification.md | 1078 -- .../lsif/0.5.0/img/definitionResult.png | Bin 59343 -> 0 bytes .../lsif/0.5.0/img/foldingRange.png | Bin 11616 -> 0 bytes .../lsif/0.5.0/img/hoverResult.png | Bin 13606 -> 0 bytes .../lsif/0.5.0/img/referenceResult.png | Bin 55741 -> 0 bytes .../lsif/0.5.0/img/resultSet.png | Bin 50539 -> 0 bytes .../lsif/0.5.0/implementation.md | 114 - .../lsif/0.5.0/specification.md | 1490 -- .../lsif/0.6.0/img/definitionResult.png | Bin 59343 -> 0 bytes .../lsif/0.6.0/img/foldingRange.png | Bin 11616 -> 0 bytes .../lsif/0.6.0/img/hoverResult.png | Bin 13606 -> 0 bytes .../lsif/0.6.0/img/referenceResult.png | Bin 55741 -> 0 bytes .../lsif/0.6.0/img/resultSet.png | Bin 50539 -> 0 bytes .../lsif/0.6.0/implementation.md | 114 - .../lsif/0.6.0/specification.md | 1497 -- .../lsp/3.17/client/registerCapability.md | 107 - .../lsp/3.17/client/unregisterCapability.md | 59 - .../_specifications/lsp/3.17/general/exit.md | 8 - .../lsp/3.17/general/initialize.md | 931 - .../lsp/3.17/general/initialized.md | 12 - .../lsp/3.17/general/logTrace.md | 27 - .../lsp/3.17/general/setTrace.md | 16 - .../lsp/3.17/general/shutdown.md | 13 - .../lsp/3.17/language/callHierarchy.md | 209 - .../lsp/3.17/language/codeAction.md | 459 - .../lsp/3.17/language/codeLens.md | 144 - .../lsp/3.17/language/colorPresentation.md | 67 - .../lsp/3.17/language/completion.md | 850 - .../lsp/3.17/language/declaration.md | 67 - .../lsp/3.17/language/definition.md | 65 - .../lsp/3.17/language/documentColor.md | 114 - .../lsp/3.17/language/documentHighlight.md | 108 - .../lsp/3.17/language/documentLink.md | 121 - .../lsp/3.17/language/documentSymbol.md | 295 - .../lsp/3.17/language/foldingRange.md | 195 - .../lsp/3.17/language/formatting.md | 108 - .../lsp/3.17/language/hover.md | 107 - .../lsp/3.17/language/implementation.md | 70 - .../lsp/3.17/language/inlayHint.md | 321 - .../lsp/3.17/language/inlineValue.md | 252 - .../lsp/3.17/language/linkedEditingRange.md | 85 - .../lsp/3.17/language/moniker.md | 162 - .../lsp/3.17/language/onTypeFormatting.md | 88 - .../lsp/3.17/language/publishDiagnostics.md | 92 - .../lsp/3.17/language/pullDiagnostics.md | 502 - .../lsp/3.17/language/rangeFormatting.md | 69 - .../lsp/3.17/language/references.md | 67 - .../lsp/3.17/language/rename.md | 132 - .../lsp/3.17/language/selectionRange.md | 94 - .../lsp/3.17/language/semanticTokens.md | 533 - .../lsp/3.17/language/signatureHelp.md | 300 - .../lsp/3.17/language/typeDefinition.md | 70 - .../lsp/3.17/language/typeHierarchy.md | 172 - .../lsp/3.17/metaModel/metaModel.json | 14373 ---------------- .../lsp/3.17/metaModel/metaModel.schema.json | 783 - .../lsp/3.17/metaModel/metaModel.ts | 551 - .../lsp/3.17/notebookDocument/notebook.md | 617 - .../_specifications/lsp/3.17/specification.md | 869 - .../lsp/3.17/telemetry/event.md | 7 - .../lsp/3.17/textDocument/didChange.md | 93 - .../lsp/3.17/textDocument/didClose.md | 26 - .../lsp/3.17/textDocument/didOpen.md | 28 - .../lsp/3.17/textDocument/didRename.md | 5 - .../lsp/3.17/textDocument/didSave.md | 61 - .../lsp/3.17/textDocument/willSave.md | 68 - .../3.17/textDocument/willSaveWaitUntil.md | 25 - .../_specifications/lsp/3.17/types/command.md | 21 - .../lsp/3.17/types/diagnostic.md | 158 - .../lsp/3.17/types/documentFilter.md | 48 - .../lsp/3.17/types/enumerations.md | 5 - .../lsp/3.17/types/location.md | 9 - .../lsp/3.17/types/locationLink.md | 36 - .../lsp/3.17/types/markupContent.md | 106 - .../lsp/3.17/types/partialResultParams.md | 13 - .../lsp/3.17/types/partialResults.md | 33 - .../lsp/3.17/types/position.md | 67 - .../_specifications/lsp/3.17/types/range.md | 23 - .../_specifications/lsp/3.17/types/regexp.md | 47 - .../lsp/3.17/types/resourceChanges.md | 160 - .../lsp/3.17/types/textDocumentEdit.md | 22 - .../lsp/3.17/types/textDocumentIdentifier.md | 11 - .../lsp/3.17/types/textDocumentItem.md | 90 - .../3.17/types/textDocumentPositionParams.md | 19 - .../lsp/3.17/types/textDocuments.md | 13 - .../lsp/3.17/types/textEdit.md | 81 - .../lsp/3.17/types/textEditArray.md | 5 - .../lsp/3.17/types/traceValue.md | 8 - .../_specifications/lsp/3.17/types/uri.md | 29 - .../types/versionedTextDocumentIdentifier.md | 36 - .../lsp/3.17/types/workDoneProgress.md | 205 - .../lsp/3.17/types/workspaceEdit.md | 174 - .../lsp/3.17/window/logMessage.md | 23 - .../lsp/3.17/window/showDocument.md | 88 - .../lsp/3.17/window/showMessage.md | 48 - .../lsp/3.17/window/showMessageRequest.md | 68 - .../lsp/3.17/window/workDoneProgressCancel.md | 17 - .../lsp/3.17/window/workDoneProgressCreate.md | 26 - .../lsp/3.17/workspace/applyEdit.md | 61 - .../lsp/3.17/workspace/configuration.md | 43 - .../3.17/workspace/didChangeConfiguration.md | 33 - .../3.17/workspace/didChangeWatchedFiles.md | 210 - .../workspace/didChangeWorkspaceFolders.md | 45 - .../lsp/3.17/workspace/didCreateFiles.md | 19 - .../lsp/3.17/workspace/didDeleteFiles.md | 19 - .../lsp/3.17/workspace/didRenameFiles.md | 19 - .../lsp/3.17/workspace/executeCommand.md | 72 - .../lsp/3.17/workspace/symbol.md | 176 - .../lsp/3.17/workspace/willCreateFiles.md | 179 - .../lsp/3.17/workspace/willDeleteFiles.md | 60 - .../lsp/3.17/workspace/willRenameFiles.md | 66 - .../lsp/3.17/workspace/workspaceFolders.md | 62 - .../lsp/3.18/client/registerCapability.md | 107 - .../lsp/3.18/client/unregisterCapability.md | 59 - .../_specifications/lsp/3.18/general/exit.md | 8 - .../lsp/3.18/general/initialize.md | 931 - .../lsp/3.18/general/initialized.md | 12 - .../lsp/3.18/general/logTrace.md | 27 - .../lsp/3.18/general/setTrace.md | 16 - .../lsp/3.18/general/shutdown.md | 13 - .../lsp/3.18/language/callHierarchy.md | 209 - .../lsp/3.18/language/codeAction.md | 472 - .../lsp/3.18/language/codeLens.md | 144 - .../lsp/3.18/language/colorPresentation.md | 67 - .../lsp/3.18/language/completion.md | 849 - .../lsp/3.18/language/declaration.md | 67 - .../lsp/3.18/language/definition.md | 65 - .../lsp/3.18/language/documentColor.md | 114 - .../lsp/3.18/language/documentHighlight.md | 108 - .../lsp/3.18/language/documentLink.md | 121 - .../lsp/3.18/language/documentSymbol.md | 295 - .../lsp/3.18/language/foldingRange.md | 195 - .../lsp/3.18/language/formatting.md | 108 - .../lsp/3.18/language/hover.md | 107 - .../lsp/3.18/language/implementation.md | 70 - .../lsp/3.18/language/inlayHint.md | 321 - .../lsp/3.18/language/inlineValue.md | 252 - .../lsp/3.18/language/linkedEditingRange.md | 85 - .../lsp/3.18/language/moniker.md | 162 - .../lsp/3.18/language/onTypeFormatting.md | 88 - .../lsp/3.18/language/publishDiagnostics.md | 92 - .../lsp/3.18/language/pullDiagnostics.md | 502 - .../lsp/3.18/language/rangeFormatting.md | 69 - .../lsp/3.18/language/references.md | 67 - .../lsp/3.18/language/rename.md | 132 - .../lsp/3.18/language/selectionRange.md | 94 - .../lsp/3.18/language/semanticTokens.md | 533 - .../lsp/3.18/language/signatureHelp.md | 300 - .../lsp/3.18/language/typeDefinition.md | 70 - .../lsp/3.18/language/typeHierarchy.md | 172 - .../lsp/3.18/metaModel/metaModel.json | 14373 ---------------- .../lsp/3.18/metaModel/metaModel.schema.json | 783 - .../lsp/3.18/metaModel/metaModel.ts | 551 - .../lsp/3.18/notebookDocument/notebook.md | 617 - .../_specifications/lsp/3.18/specification.md | 866 - .../lsp/3.18/telemetry/event.md | 7 - .../lsp/3.18/textDocument/didChange.md | 93 - .../lsp/3.18/textDocument/didClose.md | 26 - .../lsp/3.18/textDocument/didOpen.md | 28 - .../lsp/3.18/textDocument/didRename.md | 5 - .../lsp/3.18/textDocument/didSave.md | 61 - .../lsp/3.18/textDocument/willSave.md | 68 - .../3.18/textDocument/willSaveWaitUntil.md | 25 - .../_specifications/lsp/3.18/types/command.md | 21 - .../lsp/3.18/types/diagnostic.md | 158 - .../lsp/3.18/types/documentFilter.md | 48 - .../lsp/3.18/types/enumerations.md | 5 - .../lsp/3.18/types/location.md | 9 - .../lsp/3.18/types/locationLink.md | 36 - .../lsp/3.18/types/markupContent.md | 106 - .../lsp/3.18/types/partialResultParams.md | 13 - .../lsp/3.18/types/partialResults.md | 33 - .../lsp/3.18/types/position.md | 67 - .../_specifications/lsp/3.18/types/range.md | 23 - .../_specifications/lsp/3.18/types/regexp.md | 47 - .../lsp/3.18/types/resourceChanges.md | 160 - .../lsp/3.18/types/textDocumentEdit.md | 22 - .../lsp/3.18/types/textDocumentIdentifier.md | 11 - .../lsp/3.18/types/textDocumentItem.md | 91 - .../3.18/types/textDocumentPositionParams.md | 19 - .../lsp/3.18/types/textDocuments.md | 13 - .../lsp/3.18/types/textEdit.md | 81 - .../lsp/3.18/types/textEditArray.md | 5 - .../lsp/3.18/types/traceValue.md | 8 - .../_specifications/lsp/3.18/types/uri.md | 29 - .../types/versionedTextDocumentIdentifier.md | 36 - .../lsp/3.18/types/workDoneProgress.md | 205 - .../lsp/3.18/types/workspaceEdit.md | 174 - .../lsp/3.18/window/logMessage.md | 23 - .../lsp/3.18/window/showDocument.md | 88 - .../lsp/3.18/window/showMessage.md | 48 - .../lsp/3.18/window/showMessageRequest.md | 68 - .../lsp/3.18/window/workDoneProgressCancel.md | 17 - .../lsp/3.18/window/workDoneProgressCreate.md | 26 - .../lsp/3.18/workspace/applyEdit.md | 61 - .../lsp/3.18/workspace/configuration.md | 43 - .../3.18/workspace/didChangeConfiguration.md | 33 - .../3.18/workspace/didChangeWatchedFiles.md | 210 - .../workspace/didChangeWorkspaceFolders.md | 45 - .../lsp/3.18/workspace/didCreateFiles.md | 19 - .../lsp/3.18/workspace/didDeleteFiles.md | 19 - .../lsp/3.18/workspace/didRenameFiles.md | 19 - .../lsp/3.18/workspace/executeCommand.md | 72 - .../lsp/3.18/workspace/symbol.md | 176 - .../lsp/3.18/workspace/willCreateFiles.md | 179 - .../lsp/3.18/workspace/willDeleteFiles.md | 60 - .../lsp/3.18/workspace/willRenameFiles.md | 66 - .../lsp/3.18/workspace/workspaceFolders.md | 62 - .../_specifications/specification-3-14.md | 4461 ----- .../_specifications/specification-3-15.md | 5897 ------- .../_specifications/specification-3-16.md | 8277 --------- .../css/bootswatch/cosmo/bootstrap.min.css | 12 - .../css/fontawesome-all.min.css | 5 - language-server-protocol/css/main.scss | 515 - .../img/atom-css-code-complete.png | Bin 49279 -> 0 bytes .../img/eclipse-css-code-complete.png | Bin 44275 -> 0 bytes language-server-protocol/img/favicon.svg | 15 - .../img/microsoft-logo-inverted.png | Bin 3151 -> 0 bytes .../img/microsoft-logo.png | Bin 3151 -> 0 bytes .../img/vs-rust-code-complete.png | Bin 8550 -> 0 bytes .../img/vscode-css-code-complete.png | Bin 64331 -> 0 bytes .../img/vscode-ps-hover.png | Bin 61886 -> 0 bytes language-server-protocol/index.html | 109 - .../inspector/css/app.39c3645b.css | 1 - .../inspector/css/chunk-vendors.c05bff2f.css | 1 - .../inspector/img/search.237d6f6a.svg | 1 - language-server-protocol/inspector/index.html | 24 - .../inspector/js/app.2dac2b37.js | 1 - .../inspector/js/chunk-vendors.3486d69f.js | 27 - language-server-protocol/js/page.js | 47 - language-server-protocol/resources/notes.md | 15 - .../webfonts/fa-brands-400.eot | Bin 95636 -> 0 bytes .../webfonts/fa-brands-400.svg | 978 -- .../webfonts/fa-brands-400.ttf | Bin 95400 -> 0 bytes .../webfonts/fa-brands-400.woff | Bin 61780 -> 0 bytes .../webfonts/fa-brands-400.woff2 | Bin 52848 -> 0 bytes .../webfonts/fa-regular-400.eot | Bin 31004 -> 0 bytes .../webfonts/fa-regular-400.svg | 363 - .../webfonts/fa-regular-400.ttf | Bin 30776 -> 0 bytes .../webfonts/fa-regular-400.woff | Bin 14556 -> 0 bytes .../webfonts/fa-regular-400.woff2 | Bin 12132 -> 0 bytes .../webfonts/fa-solid-900.eot | Bin 97636 -> 0 bytes .../webfonts/fa-solid-900.svg | 1410 -- .../webfonts/fa-solid-900.ttf | Bin 97416 -> 0 bytes .../webfonts/fa-solid-900.woff | Bin 46188 -> 0 bytes .../webfonts/fa-solid-900.woff2 | Bin 36708 -> 0 bytes 295 files changed, 85195 deletions(-) delete mode 100644 language-server-protocol/.gitattributes delete mode 100644 language-server-protocol/.gitignore delete mode 100644 language-server-protocol/.vscode/settings.json delete mode 100644 language-server-protocol/.vscode/spellright.dict delete mode 100644 language-server-protocol/.vscode/tasks.json delete mode 100644 language-server-protocol/404.html delete mode 100644 language-server-protocol/Gemfile delete mode 100644 language-server-protocol/Gemfile.lock delete mode 100644 language-server-protocol/License.txt delete mode 100644 language-server-protocol/SECURITY.md delete mode 100644 language-server-protocol/ThirdPartyNotices.txt delete mode 100644 language-server-protocol/_config.yml delete mode 100644 language-server-protocol/_data/linkableTypes.yml delete mode 100644 language-server-protocol/_data/lsif-0-4-0-toc.yml delete mode 100644 language-server-protocol/_data/lsif-0-5-0-toc.yml delete mode 100644 language-server-protocol/_data/lsif-0-6-0-toc.yml delete mode 100644 language-server-protocol/_data/overviews.yml delete mode 100644 language-server-protocol/_data/specification-3-14-toc.yml delete mode 100644 language-server-protocol/_data/specification-3-15-toc.yml delete mode 100644 language-server-protocol/_data/specification-3-16-toc.yml delete mode 100644 language-server-protocol/_data/specification-3-17-toc.yml delete mode 100644 language-server-protocol/_data/specification-3-18-toc.yml delete mode 100644 language-server-protocol/_data/specifications.yml delete mode 100644 language-server-protocol/_implementors/sdks.md delete mode 100644 language-server-protocol/_implementors/servers.md delete mode 100644 language-server-protocol/_implementors/tools.md delete mode 100644 language-server-protocol/_includes/cookie_notice.html delete mode 100644 language-server-protocol/_includes/footer.html delete mode 100644 language-server-protocol/_includes/head.html delete mode 100644 language-server-protocol/_includes/js_files.html delete mode 100644 language-server-protocol/_includes/topnav.html delete mode 100644 language-server-protocol/_layouts/default.html delete mode 100644 language-server-protocol/_layouts/implementors.html delete mode 100644 language-server-protocol/_layouts/overview.html delete mode 100644 language-server-protocol/_layouts/redirect.html delete mode 100644 language-server-protocol/_layouts/singlePage.html delete mode 100644 language-server-protocol/_layouts/specifications.html delete mode 100644 language-server-protocol/_overviews/lsif/img/foldingRange.png delete mode 100644 language-server-protocol/_overviews/lsif/img/hover.png delete mode 100644 language-server-protocol/_overviews/lsif/img/hoverResult.png delete mode 100644 language-server-protocol/_overviews/lsif/overview.md delete mode 100644 language-server-protocol/_overviews/lsp/img/language-server-sequence.png delete mode 100644 language-server-protocol/_overviews/lsp/img/language-server.png delete mode 100644 language-server-protocol/_overviews/lsp/overview.md delete mode 100644 language-server-protocol/_specifications/lsif/0.4.0/img/definitionResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.4.0/img/foldingRange.png delete mode 100644 language-server-protocol/_specifications/lsif/0.4.0/img/hoverResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.4.0/img/referenceResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.4.0/img/resultSet.png delete mode 100644 language-server-protocol/_specifications/lsif/0.4.0/implementation.md delete mode 100644 language-server-protocol/_specifications/lsif/0.4.0/specification.md delete mode 100644 language-server-protocol/_specifications/lsif/0.5.0/img/definitionResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.5.0/img/foldingRange.png delete mode 100644 language-server-protocol/_specifications/lsif/0.5.0/img/hoverResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.5.0/img/referenceResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.5.0/img/resultSet.png delete mode 100644 language-server-protocol/_specifications/lsif/0.5.0/implementation.md delete mode 100644 language-server-protocol/_specifications/lsif/0.5.0/specification.md delete mode 100644 language-server-protocol/_specifications/lsif/0.6.0/img/definitionResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.6.0/img/foldingRange.png delete mode 100644 language-server-protocol/_specifications/lsif/0.6.0/img/hoverResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.6.0/img/referenceResult.png delete mode 100644 language-server-protocol/_specifications/lsif/0.6.0/img/resultSet.png delete mode 100644 language-server-protocol/_specifications/lsif/0.6.0/implementation.md delete mode 100644 language-server-protocol/_specifications/lsif/0.6.0/specification.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/client/registerCapability.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/client/unregisterCapability.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/general/exit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/general/initialize.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/general/initialized.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/general/logTrace.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/general/setTrace.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/general/shutdown.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/callHierarchy.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/codeAction.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/codeLens.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/colorPresentation.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/completion.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/declaration.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/definition.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/documentColor.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/documentHighlight.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/documentLink.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/documentSymbol.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/foldingRange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/formatting.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/hover.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/implementation.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/inlayHint.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/inlineValue.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/linkedEditingRange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/moniker.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/onTypeFormatting.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/publishDiagnostics.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/pullDiagnostics.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/rangeFormatting.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/references.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/rename.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/selectionRange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/semanticTokens.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/signatureHelp.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/typeDefinition.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/language/typeHierarchy.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.json delete mode 100644 language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.schema.json delete mode 100644 language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.ts delete mode 100644 language-server-protocol/_specifications/lsp/3.17/notebookDocument/notebook.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/specification.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/telemetry/event.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/textDocument/didChange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/textDocument/didClose.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/textDocument/didOpen.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/textDocument/didRename.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/textDocument/didSave.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/textDocument/willSave.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/textDocument/willSaveWaitUntil.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/command.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/diagnostic.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/documentFilter.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/enumerations.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/location.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/locationLink.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/markupContent.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/partialResultParams.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/partialResults.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/position.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/range.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/regexp.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/resourceChanges.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/textDocumentEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/textDocumentIdentifier.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/textDocumentItem.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/textDocumentPositionParams.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/textDocuments.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/textEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/textEditArray.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/traceValue.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/uri.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/versionedTextDocumentIdentifier.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/workDoneProgress.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/types/workspaceEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/window/logMessage.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/window/showDocument.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/window/showMessage.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/window/showMessageRequest.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCancel.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCreate.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/applyEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/configuration.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/didChangeConfiguration.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWatchedFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWorkspaceFolders.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/didCreateFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/didDeleteFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/didRenameFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/executeCommand.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/symbol.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/willCreateFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/willDeleteFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/willRenameFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.17/workspace/workspaceFolders.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/client/registerCapability.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/client/unregisterCapability.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/general/exit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/general/initialize.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/general/initialized.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/general/logTrace.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/general/setTrace.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/general/shutdown.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/callHierarchy.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/codeAction.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/codeLens.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/colorPresentation.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/completion.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/declaration.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/definition.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/documentColor.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/documentHighlight.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/documentLink.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/documentSymbol.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/foldingRange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/formatting.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/hover.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/implementation.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/inlayHint.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/inlineValue.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/linkedEditingRange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/moniker.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/onTypeFormatting.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/publishDiagnostics.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/pullDiagnostics.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/rangeFormatting.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/references.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/rename.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/selectionRange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/semanticTokens.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/signatureHelp.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/typeDefinition.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/language/typeHierarchy.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.json delete mode 100644 language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.schema.json delete mode 100644 language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.ts delete mode 100644 language-server-protocol/_specifications/lsp/3.18/notebookDocument/notebook.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/specification.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/telemetry/event.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/textDocument/didChange.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/textDocument/didClose.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/textDocument/didOpen.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/textDocument/didRename.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/textDocument/didSave.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/textDocument/willSave.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/textDocument/willSaveWaitUntil.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/command.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/diagnostic.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/documentFilter.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/enumerations.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/location.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/locationLink.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/markupContent.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/partialResultParams.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/partialResults.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/position.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/range.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/regexp.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/resourceChanges.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/textDocumentEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/textDocumentIdentifier.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/textDocumentItem.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/textDocumentPositionParams.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/textDocuments.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/textEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/textEditArray.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/traceValue.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/uri.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/versionedTextDocumentIdentifier.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/workDoneProgress.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/types/workspaceEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/window/logMessage.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/window/showDocument.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/window/showMessage.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/window/showMessageRequest.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCancel.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCreate.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/applyEdit.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/configuration.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/didChangeConfiguration.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWatchedFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWorkspaceFolders.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/didCreateFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/didDeleteFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/didRenameFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/executeCommand.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/symbol.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/willCreateFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/willDeleteFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/willRenameFiles.md delete mode 100644 language-server-protocol/_specifications/lsp/3.18/workspace/workspaceFolders.md delete mode 100644 language-server-protocol/_specifications/specification-3-14.md delete mode 100644 language-server-protocol/_specifications/specification-3-15.md delete mode 100644 language-server-protocol/_specifications/specification-3-16.md delete mode 100644 language-server-protocol/css/bootswatch/cosmo/bootstrap.min.css delete mode 100644 language-server-protocol/css/fontawesome-all.min.css delete mode 100644 language-server-protocol/css/main.scss delete mode 100644 language-server-protocol/img/atom-css-code-complete.png delete mode 100644 language-server-protocol/img/eclipse-css-code-complete.png delete mode 100644 language-server-protocol/img/favicon.svg delete mode 100644 language-server-protocol/img/microsoft-logo-inverted.png delete mode 100644 language-server-protocol/img/microsoft-logo.png delete mode 100644 language-server-protocol/img/vs-rust-code-complete.png delete mode 100644 language-server-protocol/img/vscode-css-code-complete.png delete mode 100644 language-server-protocol/img/vscode-ps-hover.png delete mode 100644 language-server-protocol/index.html delete mode 100644 language-server-protocol/inspector/css/app.39c3645b.css delete mode 100644 language-server-protocol/inspector/css/chunk-vendors.c05bff2f.css delete mode 100644 language-server-protocol/inspector/img/search.237d6f6a.svg delete mode 100644 language-server-protocol/inspector/index.html delete mode 100644 language-server-protocol/inspector/js/app.2dac2b37.js delete mode 100644 language-server-protocol/inspector/js/chunk-vendors.3486d69f.js delete mode 100644 language-server-protocol/js/page.js delete mode 100644 language-server-protocol/resources/notes.md delete mode 100644 language-server-protocol/webfonts/fa-brands-400.eot delete mode 100644 language-server-protocol/webfonts/fa-brands-400.svg delete mode 100644 language-server-protocol/webfonts/fa-brands-400.ttf delete mode 100644 language-server-protocol/webfonts/fa-brands-400.woff delete mode 100644 language-server-protocol/webfonts/fa-brands-400.woff2 delete mode 100644 language-server-protocol/webfonts/fa-regular-400.eot delete mode 100644 language-server-protocol/webfonts/fa-regular-400.svg delete mode 100644 language-server-protocol/webfonts/fa-regular-400.ttf delete mode 100644 language-server-protocol/webfonts/fa-regular-400.woff delete mode 100644 language-server-protocol/webfonts/fa-regular-400.woff2 delete mode 100644 language-server-protocol/webfonts/fa-solid-900.eot delete mode 100644 language-server-protocol/webfonts/fa-solid-900.svg delete mode 100644 language-server-protocol/webfonts/fa-solid-900.ttf delete mode 100644 language-server-protocol/webfonts/fa-solid-900.woff delete mode 100644 language-server-protocol/webfonts/fa-solid-900.woff2 diff --git a/language-server-protocol/.gitattributes b/language-server-protocol/.gitattributes deleted file mode 100644 index ab9df4632..000000000 --- a/language-server-protocol/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -* text=auto - -License.txt eol=crlf -ThirdPartyNotices.txt eol=crlf \ No newline at end of file diff --git a/language-server-protocol/.gitignore b/language-server-protocol/.gitignore deleted file mode 100644 index 6ea49ca74..000000000 --- a/language-server-protocol/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -npm-debug.log -_site/ -.bundle/ -vendor/ diff --git a/language-server-protocol/.vscode/settings.json b/language-server-protocol/.vscode/settings.json deleted file mode 100644 index 6241a1884..000000000 --- a/language-server-protocol/.vscode/settings.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "editor.rulers": [ - 80 - ], - "cSpell.words": [ - "ABAP", - "EBNF", - "LSIF", - "Naur", - "RGBA", - "Retriggers", - "Struct", - "Sublime's", - "Unregistration", - "bibtex", - "diagnostic's", - "downcase", - "hover's", - "lightbulbs", - "queryable", - "quickfix", - "refactorings", - "retrigger", - "sectionid", - "textedit", - "transactionally", - "uhhhh", - "uinteger", - "unregister", - "unregisterations", - "unregistrations", - "upcase", - "workspaceedit" - ], - "git.branchProtection": [ - "gh-pages" - ] -} \ No newline at end of file diff --git a/language-server-protocol/.vscode/spellright.dict b/language-server-protocol/.vscode/spellright.dict deleted file mode 100644 index 6be2ae892..000000000 --- a/language-server-protocol/.vscode/spellright.dict +++ /dev/null @@ -1,19 +0,0 @@ -params -BibTeX -Coffeescript -Dockerfile -Ini -LaTeX -Makefile -Powershell -cshtml -ShaderLab -TeX -TextDocumentPositionParams -sectionid -vscode -vscode-jsonrpc -vscode-languageserver-protocol -boolean -npm -inlined diff --git a/language-server-protocol/.vscode/tasks.json b/language-server-protocol/.vscode/tasks.json deleted file mode 100644 index bbaca7a1c..000000000 --- a/language-server-protocol/.vscode/tasks.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "label": "Jekyll", - "type": "shell", - "command": "bundle exec jekyll serve", - "problemMatcher": [] - } - ] -} \ No newline at end of file diff --git a/language-server-protocol/404.html b/language-server-protocol/404.html deleted file mode 100644 index 2c68768ef..000000000 --- a/language-server-protocol/404.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: default ---- - -
-

The page you are looking for cannot be found.

-

404

-
diff --git a/language-server-protocol/Gemfile b/language-server-protocol/Gemfile deleted file mode 100644 index 6f7ebc58f..000000000 --- a/language-server-protocol/Gemfile +++ /dev/null @@ -1,20 +0,0 @@ -source "https://rubygems.org" -ruby RUBY_VERSION - -# gem "jekyll", "3.6.2" - -# to use GitHub Pages -# gem "github-pages", group: :jekyll_plugins - -gem "github-pages", "~> 225", group: :jekyll_plugins - -# If you have any plugins, put them here! -group :jekyll_plugins do - gem "jemoji" - gem 'jekyll-redirect-from' - gem "jekyll-remote-theme" -end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] - diff --git a/language-server-protocol/Gemfile.lock b/language-server-protocol/Gemfile.lock deleted file mode 100644 index 7afedf932..000000000 --- a/language-server-protocol/Gemfile.lock +++ /dev/null @@ -1,288 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (6.0.4.7) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) - colorator (1.1.0) - commonmarker (0.23.6) - concurrent-ruby (1.1.10) - dnsruby (1.61.9) - simpleidn (~> 0.1) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - ethon (0.15.0) - ffi (>= 1.15.0) - eventmachine (1.2.7) - execjs (2.8.1) - faraday (1.10.0) - faraday-em_http (~> 1.0) - faraday-em_synchrony (~> 1.0) - faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0) - faraday-multipart (~> 1.0) - faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.0) - faraday-patron (~> 1.0) - faraday-rack (~> 1.0) - faraday-retry (~> 1.0) - ruby2_keywords (>= 0.0.4) - faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) - faraday-excon (1.1.0) - faraday-httpclient (1.0.1) - faraday-multipart (1.0.3) - multipart-post (>= 1.2, < 3) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.2.0) - faraday-patron (1.0.0) - faraday-rack (1.0.0) - faraday-retry (1.0.3) - ffi (1.15.5) - forwardable-extended (2.6.0) - gemoji (3.0.1) - github-pages (225) - github-pages-health-check (= 1.17.9) - jekyll (= 3.9.0) - jekyll-avatar (= 0.7.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.2.0) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.15.1) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.13.0) - jekyll-include-cache (= 0.2.1) - jekyll-mentions (= 1.6.0) - jekyll-optional-front-matter (= 0.3.2) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.3.0) - jekyll-redirect-from (= 0.16.0) - jekyll-relative-links (= 0.6.1) - jekyll-remote-theme (= 0.4.3) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.8.0) - jekyll-sitemap (= 1.4.0) - jekyll-swiss (= 1.0.0) - jekyll-theme-architect (= 0.2.0) - jekyll-theme-cayman (= 0.2.0) - jekyll-theme-dinky (= 0.2.0) - jekyll-theme-hacker (= 0.2.0) - jekyll-theme-leap-day (= 0.2.0) - jekyll-theme-merlot (= 0.2.0) - jekyll-theme-midnight (= 0.2.0) - jekyll-theme-minimal (= 0.2.0) - jekyll-theme-modernist (= 0.2.0) - jekyll-theme-primer (= 0.6.0) - jekyll-theme-slate (= 0.2.0) - jekyll-theme-tactile (= 0.2.0) - jekyll-theme-time-machine (= 0.2.0) - jekyll-titles-from-headings (= 0.5.3) - jemoji (= 0.12.0) - kramdown (= 2.3.1) - kramdown-parser-gfm (= 1.1.0) - liquid (= 4.0.3) - mercenary (~> 0.3) - minima (= 2.5.1) - nokogiri (>= 1.12.5, < 2.0) - rouge (= 3.26.0) - terminal-table (~> 1.4) - github-pages-health-check (1.17.9) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (>= 3.0, < 5.0) - typhoeus (~> 1.3) - html-pipeline (2.14.0) - activesupport (>= 2) - nokogiri (>= 1.4) - http_parser.rb (0.8.0) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - jekyll (3.9.0) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 2.0) - kramdown (>= 1.17, < 3) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 4) - safe_yaml (~> 1.0) - jekyll-avatar (0.7.0) - jekyll (>= 3.0, < 5.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.4.0) - commonmarker (~> 0.22) - jekyll-commonmark-ghpages (0.2.0) - commonmarker (~> 0.23.4) - jekyll (~> 3.9.0) - jekyll-commonmark (~> 1.4.0) - rouge (>= 2.0, < 4.0) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.15.1) - jekyll (>= 3.7, < 5.0) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.13.0) - jekyll (>= 3.4, < 5.0) - octokit (~> 4.0, != 4.4.0) - jekyll-include-cache (0.2.1) - jekyll (>= 3.7, < 5.0) - jekyll-mentions (1.6.0) - html-pipeline (~> 2.3) - jekyll (>= 3.7, < 5.0) - jekyll-optional-front-matter (0.3.2) - jekyll (>= 3.0, < 5.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.3.0) - jekyll (>= 3.0, < 5.0) - jekyll-redirect-from (0.16.0) - jekyll (>= 3.3, < 5.0) - jekyll-relative-links (0.6.1) - jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.3) - addressable (~> 2.0) - jekyll (>= 3.5, < 5.0) - jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) - rubyzip (>= 1.3.0, < 3.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.8.0) - jekyll (>= 3.8, < 5.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-swiss (1.0.0) - jekyll-theme-architect (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.6.0) - jekyll (> 3.5, < 5.0) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.3) - jekyll (>= 3.3, < 5.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - jemoji (0.12.0) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0, < 5.0) - kramdown (2.3.1) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) - minima (2.5.1) - jekyll (>= 3.5, < 5.0) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minitest (5.15.0) - multipart-post (2.1.1) - nokogiri (1.13.10-x86_64-linux) - racc (~> 1.4) - octokit (4.22.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (4.0.6) - racc (1.6.1) - rb-fsevent (0.11.1) - rb-inotify (0.10.1) - ffi (~> 1.0) - rexml (3.2.5) - rouge (3.26.0) - ruby2_keywords (0.0.5) - rubyzip (2.3.2) - safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.2) - addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) - simpleidn (0.2.1) - unf (~> 0.1.4) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (1.2.10) - thread_safe (~> 0.1) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.1) - unicode-display_width (1.8.0) - zeitwerk (2.5.4) - -PLATFORMS - x86_64-linux - -DEPENDENCIES - github-pages (~> 225) - jekyll-redirect-from - jekyll-remote-theme - jemoji - tzinfo-data - -RUBY VERSION - ruby 2.7.0p0 - -BUNDLED WITH - 2.3.10 diff --git a/language-server-protocol/License.txt b/language-server-protocol/License.txt deleted file mode 100644 index 12cc64569..000000000 --- a/language-server-protocol/License.txt +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) Microsoft Corporation. - -All rights reserved. - -Distributed under the following terms: - -1. Documentation is licensed under the Creative Commons Attribution 3.0 United States License. Code is licensed under the MIT License. -2. This license does not grant you rights to use any trademarks or logos of Microsoft. For Microsoft’s general trademark guidelines, go to http://go.microsoft.com/fwlink/?LinkID=254653 \ No newline at end of file diff --git a/language-server-protocol/SECURITY.md b/language-server-protocol/SECURITY.md deleted file mode 100644 index 869fdfe2b..000000000 --- a/language-server-protocol/SECURITY.md +++ /dev/null @@ -1,41 +0,0 @@ - - -## Security - -Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). - -If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. - -## Reporting Security Issues - -**Please do not report security vulnerabilities through public GitHub issues.** - -Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). - -If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). - -You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). - -Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: - - * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) - * Full paths of source file(s) related to the manifestation of the issue - * The location of the affected source code (tag/branch/commit or direct URL) - * Any special configuration required to reproduce the issue - * Step-by-step instructions to reproduce the issue - * Proof-of-concept or exploit code (if possible) - * Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. - -## Preferred Languages - -We prefer all communications to be in English. - -## Policy - -Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). - - diff --git a/language-server-protocol/ThirdPartyNotices.txt b/language-server-protocol/ThirdPartyNotices.txt deleted file mode 100644 index eb62e14da..000000000 --- a/language-server-protocol/ThirdPartyNotices.txt +++ /dev/null @@ -1,83 +0,0 @@ -THIRD-PARTY SOFTWARE NOTICES AND INFORMATION -For Microsoft language-server-protocol - -This project incorporates material from the project(s) listed below (collectively, “Third Party Code”). -Microsoft is not the original author of the Third Party Code. The original copyright notice and license -under which Microsoft received such Third Party Code are set out below. This Third Party Code is licensed -to you under their original license terms set forth below. Microsoft reserves all other rights not expressly -granted, whether by implication, estoppel or otherwise. - -1. Jekyll (https://jekyllrb.com/) - -The MIT License (MIT) - -Copyright (c) 2008-2017 Tom Preston-Werner and Jekyll contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -2. Bootstrap (http://getbootstrap.com/) - -The MIT License (MIT) - -Copyright (c) 2011-2016 Twitter, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -3. Font Awesome (https://fontawesome.com) - -License: https://fontawesome.com/license - -4. jemoji (https://github.com/jekyll/jemoji) - -The MIT License (MIT) - -Copyright (c) 2014-2017 GitHub, Inc. and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/language-server-protocol/_config.yml b/language-server-protocol/_config.yml deleted file mode 100644 index 54e1bae44..000000000 --- a/language-server-protocol/_config.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Site settings -title: Official page for Language Server Protocol -description: > - Language Server Protocol documentation and specification page. - -baseurl: /language-server-protocol # the subpath of your site, e.g. /blog/ -url: https://microsoft.github.io # the base hostname & protocol for your site -git_address: https://github.com/Microsoft/language-server-protocol -git_edit_address: https://github.com/Microsoft/language-server-protocol/blob/gh-pages - -# Build settings -markdown: kramdown -highlighter: rouge - -plugins: - - github-pages - - jemoji - - jekyll-redirect-from - - -exclude: - - Gemfile - - Gemfile.lock - - .idea/ - - .gitignore - - README.md - - resources/ - - vendor/ - -timezone: Europe/Zurich - -defaults: - -- scope: - path: _implementors - type: implementors - values: - layout: implementors - sectionid: implementors - -- scope: - path: _specifications - type: specifications - values: - layout: specifications - sectionid: specifications - -- scope: - path: _overviews - type: overviews - values: - layout: overviews - sectionid: overviews - -collections: - implementors: - permalink: /:collection/:path/ - output: true - specifications: - permalink: /:collection/:path/ - output: true - overviews: - permalink: /:collection/:path/ - output: true - diff --git a/language-server-protocol/_data/linkableTypes.yml b/language-server-protocol/_data/linkableTypes.yml deleted file mode 100644 index f07eb8f11..000000000 --- a/language-server-protocol/_data/linkableTypes.yml +++ /dev/null @@ -1,860 +0,0 @@ -- name: "Linkable Types" - children: - - type: 'integer' - link: '#integer' - - type: 'uinteger' - link: '#uinteger' - - type: 'decimal' - link: '#decimal' - - type: 'LSPAny' - link: '#lspAny' - - type: 'LSPObject' - link: '#lspObject' - - type: 'LSPArray' - link: '#lspArray' - - type: 'Message' - link: '#message' - - type: 'RequestMessage' - link: '#requestMessage' - - type: 'ResponseMessage' - link: '#responseMessage' - - type: 'ResponseError' - link: '#responseError' - - type: 'ErrorCodes' - link: '#errorCodes' - - type: 'NotificationMessage' - link: '#notificationMessage' - - type: 'CancelParams' - link: '#cancelRequest' - - type: 'ProgressParams' - link: '#progress' - - type: 'ProgressToken' - link: '#progress' - - type: 'Uri' - link: '#uri' - - type: 'URI' - link: '#uri' - - type: 'DocumentUri' - link: '#documentUri' - - type: 'RegularExpressionsClientCapabilities' - link: '#regExp' - - type: 'TextDocument' - link: '#textDocuments' - - type: 'EOL' - link: '#textDocuments' - - type: 'Position' - link: '#position' - - type: 'PositionEncodingKind' - link: '#positionEncodingKind' - - type: 'Range' - link: '#range' - - type: 'Location' - link: '#location' - - type: 'LocationLink' - link: '#locationLink' - - type: 'Diagnostic' - link: '#diagnostic' - - type: 'DiagnosticSeverity' - link: '#diagnosticSeverity' - - type: 'DiagnosticTag' - link: '#diagnosticTag' - - type: 'DiagnosticRelatedInformation' - link: '#diagnosticRelatedInformation' - - type: 'CodeDescription' - link: '#codeDescription' - - type: 'Command' - link: '#command' - - type: 'TextEdit' - link: '#textEdit' - - type: 'ChangeAnnotation' - link: '#changeAnnotation' - - type: 'ChangeAnnotationIdentifier' - link: '#changeAnnotationIdentifier' - - type: 'AnnotatedTextEdit' - link: '#annotatedTextEdit' - - type: 'TextDocumentEdit' - link: '#textDocumentEdit' - - type: 'CreateFileOptions' - link: '#createFileOptions' - - type: 'CreateFile' - link: '#createFile' - - type: 'RenameFileOptions' - link: '#renameFileOptions' - - type: 'RenameFile' - link: '#renameFile' - - type: 'DeleteFileOptions' - link: '#deleteFileOptions' - - type: 'DeleteFile' - link: '#deleteFile' - - type: 'WorkspaceEdit' - link: '#workspaceEdit' - - type: 'WorkspaceEditClientCapabilities' - link: '#workspaceEditClientCapabilities' - - type: 'ResourceOperationKind' - link: '#resourceOperationKind' - - type: 'FailureHandlingKind' - link: '#failureHandlingKind' - - type: 'TextDocumentIdentifier' - link: '#textDocumentIdentifier' - - type: 'TextDocumentItem' - link: '#textDocumentItem' - - type: 'VersionedTextDocumentIdentifier' - link: '#versionedTextDocumentIdentifier' - - type: 'OptionalVersionedTextDocumentIdentifier' - link: '#optionalVersionedTextDocumentIdentifier' - - type: 'TextDocumentPositionParams' - link: '#textDocumentPositionParams' - - type: 'DocumentFilter' - link: '#documentFilter' - - type: 'DocumentSelector' - link: '#documentSelector' - - type: 'StaticRegistrationOptions' - link: '#staticRegistrationOptions' - - type: 'TextDocumentRegistrationOptions' - link: '#textDocumentRegistrationOptions' - - type: 'MarkupKind' - link: '#markupContent' - - type: 'MarkupContent' - link: '#markupContentInnerDefinition' - - type: 'MarkdownClientCapabilities' - link: '#markdownClientCapabilities' - - type: 'WorkDoneProgressBegin' - link: '#workDoneProgressBegin' - - type: '$/progress' - link: '#workDoneProgressBegin' - - type: 'WorkDoneProgressReport' - link: '#workDoneProgressReport' - - type: 'WorkDoneProgressEnd' - link: '#workDoneProgressEnd' - - type: 'WorkDoneProgressParams' - link: '#workDoneProgressParams' - - type: 'WorkDoneProgressOptions' - link: '#workDoneProgressOptions' - - type: 'PartialResultParams' - link: '#partialResultParams' - - type: 'TraceValue' - link: '#traceValue' - - type: 'InitializeParams' - link: '#initializeParams' - - type: 'InitializeResult' - link: '#initializeResult' - - type: 'InitializedParams' - link: '#initialized' - - type: 'InitializeErrorCodes' - link: '#initializeErrorCodes' - - type: 'InitializeError' - link: '#initializeError' - - type: 'TextDocumentClientCapabilities' - link: '#textDocumentClientCapabilities' - - type: 'NotebookDocumentClientCapabilities' - link: '#notebookDocumentClientCapabilities' - - type: 'ClientCapabilities' - link: '#clientCapabilities' - - type: 'ServerCapabilities' - link: '#serverCapabilities' - - type: 'LogTraceParams' - link: '#logTrace' - - type: 'SetTraceParams' - link: '#setTrace' - - type: 'ShowMessageParams' - link: '#window_showMessage' - - type: 'MessageType' - link: '#messageType' - - type: 'ShowMessageRequestClientCapabilities' - link: '#window_showMessageRequest' - - type: 'ShowMessageRequestParams' - link: '#showMessageRequestParams' - - type: 'MessageActionItem' - link: '#messageActionItem' - - type: 'ShowDocumentClientCapabilities' - link: '#window_showDocument' - - type: 'ShowDocumentParams' - link: '#showDocumentParams' - - type: 'ShowDocumentResult' - link: '#showDocumentResult' - - type: 'LogMessageParams' - link: '#logMessageParams' - - type: 'WorkDoneProgressCreateParams' - link: '#window_workDoneProgress_create' - - type: 'WorkDoneProgressCancelParams' - link: '#window_workDoneProgress_cancel' - - type: 'telemetry/event' - link: '#telemetry_event' - - type: 'Registration' - link: '#registration' - - type: 'RegistrationParams' - link: '#registrationParams' - - type: 'Unregistration' - link: '#unregistration' - - type: 'UnregistrationParams' - link: '#unregistrationParams' - - type: 'WorkspaceFoldersServerCapabilities' - link: '#workspaceFoldersServerCapabilities' - - type: 'WorkspaceFolder' - link: '#workspaceFolder' - - type: 'workspace/workspaceFolders' - link: '#workspace_workspaceFolders' - - type: 'DidChangeWorkspaceFoldersParams' - link: '#didChangeWorkspaceFoldersParams' - - type: 'WorkspaceFoldersChangeEvent' - link: '#workspaceFoldersChangeEvent' - - type: 'DidChangeConfigurationClientCapabilities' - link: '#didChangeConfigurationClientCapabilities' - - type: 'DidChangeConfigurationParams' - link: '#didChangeConfigurationParams' - - type: 'ConfigurationParams' - link: '#configurationParams' - - type: 'ConfigurationItem' - link: '#configurationItem' - - type: 'DidChangeWatchedFilesClientCapabilities' - link: '#didChangeWatchedFilesClientCapabilities' - - type: 'DidChangeWatchedFilesRegistrationOptions' - link: '#didChangeWatchedFilesRegistrationOptions' - - type: 'Pattern' - link: '#pattern' - - type: 'RelativePattern' - link: '#relativePattern' - - type: 'GlobPattern' - link: '#globPattern' - - type: 'FileSystemWatcher' - link: '#fileSystemWatcher' - - type: 'WatchKind' - link: '#watchKind' - - type: 'DidChangeWatchedFilesParams' - link: '#didChangeWatchedFilesParams' - - type: 'FileEvent' - link: '#fileEvent' - - type: 'FileChangeType' - link: '#fileChangeType' - - type: 'WorkspaceSymbolClientCapabilities' - link: '#workspace_symbol' - - type: 'WorkspaceSymbolOptions' - link: '#workspaceSymbolOptions' - - type: 'WorkspaceSymbolRegistrationOptions' - link: '#workspaceSymbolRegistrationOptions' - - type: 'WorkspaceSymbolParams' - link: '#workspaceSymbolParams' - - type: 'WorkspaceSymbol' - link: '#workspaceSymbol' - - type: 'workspace/executeCommand' - link: '#workspace_executeCommand' - - type: 'ExecuteCommandClientCapabilities' - link: '#executeCommandClientCapabilities' - - type: 'ExecuteCommandOptions' - link: '#executeCommandOptions' - - type: 'ExecuteCommandRegistrationOptions' - link: '#executeCommandRegistrationOptions' - - type: 'ExecuteCommandParams' - link: '#executeCommandParams' - - type: 'workspace/applyEdit' - link: '#workspace_applyEdit' - - type: 'ApplyWorkspaceEditParams' - link: '#applyWorkspaceEditParams' - - type: 'ApplyWorkspaceEditResult' - link: '#applyWorkspaceEditResult' - - type: 'ApplyWorkspaceEditResponse' - link: '#applyWorkspaceEditResponse' - - type: 'workspace/willCreateFiles' - link: '#workspace_willCreateFiles' - - type: 'FileOperationRegistrationOptions' - link: '#fileOperationRegistrationOptions' - - type: 'FileOperationPatternKind' - link: '#fileOperationPatternKind' - - type: 'FileOperationPatternOptions' - link: '#fileOperationPatternOptions' - - type: 'FileOperationPattern' - link: '#fileOperationPattern' - - type: 'FileOperationFilter' - link: '#fileOperationFilter' - - type: 'CreateFilesParams' - link: '#createFilesParams' - - type: 'FileCreate' - link: '#fileCreate' - - type: 'workspace/didCreateFiles' - link: '#workspace_didCreateFiles' - - type: 'workspace/willRenameFiles' - link: '#workspace_willRenameFiles' - - type: 'RenameFilesParams' - link: '#renameFilesParams' - - type: 'FileRename' - link: '#fileRename' - - type: 'workspace/didRenameFiles' - link: '#workspace_didRenameFiles' - - type: 'workspace/willDeleteFiles' - link: '#workspace_willDeleteFiles' - - type: 'DeleteFilesParams' - link: '#deleteFilesParams' - - type: 'FileDelete' - link: '#fileDelete' - - type: 'workspace/didDeleteFiles' - link: '#workspace_didDeleteFiles' - - type: 'TextDocumentSyncKind' - link: '#textDocumentSyncKind' - - type: 'TextDocumentSyncOptions' - link: '#textDocumentSyncOptions' - - type: 'textDocument/didOpen' - link: '#textDocument_didOpen' - - type: 'DidOpenTextDocumentParams' - link: '#didOpenTextDocumentParams' - - type: 'textDocument/didChange' - link: '#textDocument_didChange' - - type: 'TextDocumentChangeRegistrationOptions' - link: '#textDocumentChangeRegistrationOptions' - - type: 'DidChangeTextDocumentParams' - link: '#didChangeTextDocumentParams' - - type: 'TextDocumentContentChangeEvent' - link: '#textDocumentContentChangeEvent' - - type: 'textDocument/willSave' - link: '#textDocument_willSave' - - type: 'WillSaveTextDocumentParams' - link: '#willSaveTextDocumentParams' - - type: 'TextDocumentSaveReason' - link: '#textDocumentSaveReason' - - type: 'textDocument/willSaveWaitUntil' - link: '#textDocument_willSaveWaitUntil' - - type: 'textDocument/didSave' - link: '#textDocument_didSave' - - type: 'SaveOptions' - link: '#saveOptions' - - type: 'TextDocumentSaveRegistrationOptions' - link: '#textDocumentSaveRegistrationOptions' - - type: 'DidSaveTextDocumentParams' - link: '#didSaveTextDocumentParams' - - type: 'textDocument/didClose' - link: '#textDocument_didClose' - - type: 'DidCloseTextDocumentParams' - link: '#didCloseTextDocumentParams' - - type: 'TextDocumentSyncClientCapabilities' - link: '#textDocumentSyncClientCapabilities' - - type: 'TextDocumentSyncKind' - link: '#textDocumentSyncKind' - - type: 'TextDocumentSyncOptions' - link: '#textDocumentSyncOptions' - - type: 'textDocument/publishDiagnostics' - link: '#textDocument_publishDiagnostics' - - type: 'PublishDiagnosticsClientCapabilities' - link: '#publishDiagnosticsClientCapabilities' - - type: 'PublishDiagnosticsParams' - link: '#publishDiagnosticsParams' - - type: 'textDocument/completion' - link: '#textDocument_completion' - - type: 'CompletionClientCapabilities' - link: '#completionClientCapabilities' - - type: 'CompletionOptions' - link: '#completionOptions' - - type: 'CompletionRegistrationOptions' - link: '#completionRegistrationOptions' - - type: 'CompletionParams' - link: '#completionParams' - - type: 'CompletionTriggerKind' - link: '#completionTriggerKind' - - type: 'CompletionContext' - link: '#completionContext' - - type: 'CompletionList' - link: '#completionList' - - type: 'InsertTextFormat' - link: '#insertTextFormat' - - type: 'CompletionItemTag' - link: '#completionItemTag' - - type: 'InsertReplaceEdit' - link: '#insertReplaceEdit' - - type: 'InsertTextMode' - link: '#insertTextMode' - - type: 'CompletionItemLabelDetails' - link: '#completionItemLabelDetails' - - type: 'CompletionItem' - link: '#completionItem' - - type: 'CompletionItemKind' - link: '#completionItemKind' - - type: 'completionItem/resolve' - link: '#completionItem_resolve' - - type: 'textDocument/hover' - link: '#textDocument_hover' - - type: 'HoverClientCapabilities' - link: '#hoverClientCapabilities' - - type: 'HoverOptions' - link: '#hoverOptions' - - type: 'HoverRegistrationOptions' - link: '#hoverRegistrationOptions' - - type: 'HoverParams' - link: '#hoverParams' - - type: 'Hover' - link: '#hover' - - type: 'MarkedString' - link: '#markedString' - - type: 'textDocument/signatureHelp' - link: '#textDocument_signatureHelp' - - type: 'SignatureHelpClientCapabilities' - link: '#signatureHelpClientCapabilities' - - type: 'SignatureHelpOptions' - link: '#signatureHelpOptions' - - type: 'SignatureHelpRegistrationOptions' - link: '#signatureHelpRegistrationOptions' - - type: 'SignatureHelpParams' - link: '#signatureHelpParams' - - type: 'SignatureHelpTriggerKind' - link: '#signatureHelpTriggerKind' - - type: 'SignatureHelpContext' - link: '#signatureHelpContext' - - type: 'SignatureHelp' - link: '#signatureHelp' - - type: 'SignatureInformation' - link: '#signatureInformation' - - type: 'ParameterInformation' - link: '#parameterInformation' - - type: 'textDocument/declaration' - link: '#textDocument_declaration' - - type: 'DeclarationClientCapabilities' - link: '#declarationClientCapabilities' - - type: 'DeclarationOptions' - link: '#declarationOptions' - - type: 'DeclarationRegistrationOptions' - link: '#declarationRegistrationOptions' - - type: 'DeclarationParams' - link: '#declarationParams' - - type: 'textDocument/definition' - link: '#textDocument_definition' - - type: 'DefinitionClientCapabilities' - link: '#definitionClientCapabilities' - - type: 'DefinitionOptions' - link: '#definitionOptions' - - type: 'DefinitionRegistrationOptions' - link: '#definitionRegistrationOptions' - - type: 'DefinitionParams' - link: '#definitionParams' - - type: 'textDocument/typeDefinition' - link: '#textDocument_typeDefinition' - - type: 'TypeDefinitionClientCapabilities' - link: '#typeDefinitionClientCapabilities' - - type: 'TypeDefinitionOptions' - link: '#typeDefinitionOptions' - - type: 'TypeDefinitionRegistrationOptions' - link: '#typeDefinitionRegistrationOptions' - - type: 'TypeDefinitionParams' - link: '#typeDefinitionParams' - - type: 'textDocument/implementation' - link: '#textDocument_implementation' - - type: 'ImplementationClientCapabilities' - link: '#implementationClientCapabilities' - - type: 'ImplementationOptions' - link: '#implementationOptions' - - type: 'ImplementationRegistrationOptions' - link: '#implementationRegistrationOptions' - - type: 'ImplementationParams' - link: '#implementationParams' - - type: 'textDocument/references' - link: '#textDocument_references' - - type: 'ReferenceClientCapabilities' - link: '#referenceClientCapabilities' - - type: 'ReferenceOptions' - link: '#referenceOptions' - - type: 'ReferenceRegistrationOptions' - link: '#referenceRegistrationOptions' - - type: 'ReferenceParams' - link: '#referenceParams' - - type: 'ReferenceContext' - link: '#referenceContext' - - type: 'textDocument/documentHighlight' - link: '#textDocument_documentHighlight' - - type: 'DocumentHighlightClientCapabilities' - link: '#documentHighlightClientCapabilities' - - type: 'DocumentHighlightOptions' - link: '#documentHighlightOptions' - - type: 'DocumentHighlightRegistrationOptions' - link: '#documentHighlightRegistrationOptions' - - type: 'DocumentHighlightParams' - link: '#documentHighlightParams' - - type: 'DocumentHighlight' - link: '#documentHighlight' - - type: 'DocumentHighlightKind' - link: '#documentHighlightKind' - - type: 'textDocument/documentSymbol' - link: '#textDocument_documentSymbol' - - type: 'DocumentSymbolClientCapabilities' - link: '#documentSymbolClientCapabilities' - - type: 'DocumentSymbolOptions' - link: '#documentSymbolOptions' - - type: 'DocumentSymbolRegistrationOptions' - link: '#documentSymbolRegistrationOptions' - - type: 'DocumentSymbolParams' - link: '#documentSymbolParams' - - type: 'SymbolKind' - link: '#symbolKind' - - type: 'SymbolTag' - link: '#symbolTag' - - type: 'DocumentSymbol' - link: '#documentSymbol' - - type: 'SymbolInformation' - link: '#symbolInformation' - - type: 'textDocument/codeAction' - link: '#textDocument_codeAction' - - type: 'CodeActionClientCapabilities' - link: '#codeActionClientCapabilities' - - type: 'CodeActionOptions' - link: '#codeActionOptions' - - type: 'CodeActionRegistrationOptions' - link: '#codeActionRegistrationOptions' - - type: 'CodeActionParams' - link: '#codeActionParams' - - type: 'CodeActionKind' - link: '#codeActionKind' - - type: 'CodeActionContext' - link: '#codeActionContext' - - type: 'CodeActionTriggerKind' - link: '#codeActionTriggerKind' - - type: 'CodeAction' - link: '#codeAction' - - type: 'codeAction/resolve' - link: '#codeAction_resolve' - - type: 'textDocument/codeLens' - link: '#textDocument_codeLens' - - type: 'CodeLensClientCapabilities' - link: '#codeLensClientCapabilities' - - type: 'CodeLensOptions' - link: '#codeLensOptions' - - type: 'CodeLensRegistrationOptions' - link: '#codeLensRegistrationOptions' - - type: 'CodeLensParams' - link: '#codeLensParams' - - type: 'CodeLens' - link: '#codeLens' - - type: 'codeLens/resolve' - link: '#codeLens_resolve' - - type: 'CodeLensWorkspaceClientCapabilities' - link: '#codeLensWorkspaceClientCapabilities' - - type: 'workspace/codeLens/refresh' - link: '#codeLens_refresh' - - type: 'DocumentLinkClientCapabilities' - link: '#documentLinkClientCapabilities' - - type: 'textDocument/documentLink' - link: '#textDocument_documentLink' - - type: 'DocumentLinkOptions' - link: '#documentLinkOptions' - - type: 'DocumentLinkRegistrationOptions' - link: '#documentLinkRegistrationOptions' - - type: 'DocumentLinkParams' - link: '#documentLinkParams' - - type: 'DocumentLink' - link: '#documentLink' - - type: 'documentLink/resolve' - link: '#documentLink_resolve' - - type: 'textDocument/documentColor' - link: '#textDocument_documentColor' - - type: 'DocumentColorClientCapabilities' - link: '#documentColorClientCapabilities' - - type: 'DocumentColorOptions' - link: '#documentColorOptions' - - type: 'DocumentColorRegistrationOptions' - link: '#documentColorRegistrationOptions' - - type: 'DocumentColorParams' - link: '#documentColorParams' - - type: 'ColorInformation' - link: '#colorInformation' - - type: 'Color' - link: '#color' - - type: 'textDocument/colorPresentation' - link: '#textDocument_colorPresentation' - - type: 'ColorPresentationParams' - link: '#colorPresentationParams' - - type: 'ColorPresentation' - link: '#colorPresentation' - - type: 'DocumentFormattingClientCapabilities' - link: '#documentFormattingClientCapabilities' - - type: 'textDocument/formatting' - link: '#textDocument_formatting' - - type: 'DocumentFormattingClientCapabilities' - link: '#documentFormattingClientCapabilities' - - type: 'DocumentFormattingOptions' - link: '#documentFormattingOptions' - - type: 'DocumentFormattingRegistrationOptions' - link: '#documentFormattingRegistrationOptions' - - type: 'DocumentFormattingParams' - link: '#documentFormattingParams' - - type: 'FormattingOptions' - link: '#formattingOptions' - - type: 'textDocument/rangeFormatting' - link: '#textDocument_rangeFormatting' - - type: 'DocumentRangeFormattingClientCapabilities' - link: '#documentRangeFormattingClientCapabilities' - - type: 'DocumentRangeFormattingOptions' - link: '#documentRangeFormattingOptions' - - type: 'DocumentRangeFormattingRegistrationOptions' - link: '#documentRangeFormattingRegistrationOptions' - - type: 'DocumentRangeFormattingParams' - link: '#documentRangeFormattingParams' - - type: 'DocumentOnTypeFormattingClientCapabilities' - link: '#documentOnTypeFormattingClientCapabilities' - - type: 'textDocument/onTypeFormatting' - link: '#textDocument_onTypeFormatting' - - type: 'DocumentOnTypeFormattingOptions' - link: '#documentOnTypeFormattingOptions' - - type: 'DocumentOnTypeFormattingRegistrationOptions' - link: '#documentOnTypeFormattingRegistrationOptions' - - type: 'DocumentOnTypeFormattingParams' - link: '#documentOnTypeFormattingParams' - - type: 'PrepareSupportDefaultBehavior' - link: '#prepareSupportDefaultBehavior' - - type: 'RenameClientCapabilities' - link: '#renameClientCapabilities' - - type: 'RenameOptions' - link: '#renameOptions' - - type: 'RenameRegistrationOptions' - link: '#renameRegistrationOptions' - - type: 'textDocument/rename' - link: '#textDocument_rename' - - type: 'RenameParams' - link: '#renameParams' - - type: 'textDocument/prepareRename' - link: '#textDocument_prepareRename' - - type: 'PrepareRenameParams' - link: '#prepareRenameParams' - - type: 'textDocument/foldingRange' - link: '#textDocument_foldingRange' - - type: 'FoldingRangeClientCapabilities' - link: '#foldingRangeClientCapabilities' - - type: 'FoldingRangeOptions' - link: '#foldingRangeOptions' - - type: 'FoldingRangeRegistrationOptions' - link: '#foldingRangeRegistrationOptions' - - type: 'FoldingRangeParams' - link: '#foldingRangeParams' - - type: 'FoldingRangeKind' - link: '#foldingRangeKind' - - type: 'FoldingRange' - link: '#foldingRange' - - type: 'textDocument/selectionRange' - link: '#textDocument_selectionRange' - - type: 'SelectionRangeClientCapabilities' - link: '#selectionRangeClientCapabilities' - - type: 'SelectionRangeOptions' - link: '#selectionRangeOptions' - - type: 'SelectionRangeRegistrationOptions' - link: '#selectionRangeRegistrationOptions' - - type: 'SelectionRangeParams' - link: '#selectionRangeParams' - - type: 'SelectionRange' - link: '#selectionRange' - - type: 'textDocument/prepareCallHierarchy' - link: '#textDocument_prepareCallHierarchy' - - type: 'CallHierarchyClientCapabilities' - link: '#callHierarchyClientCapabilities' - - type: 'CallHierarchyOptions' - link: '#callHierarchyOptions' - - type: 'CallHierarchyRegistrationOptions' - link: '#callHierarchyRegistrationOptions' - - type: 'CallHierarchyPrepareParams' - link: '#callHierarchyPrepareParams' - - type: 'CallHierarchyItem' - link: '#callHierarchyItem' - - type: 'callHierarchy/incomingCalls' - link: '#callHierarchy_incomingCalls' - - type: 'CallHierarchyIncomingCallsParams' - link: '#callHierarchyIncomingCallsParams' - - type: 'CallHierarchyIncomingCall' - link: '#callHierarchyIncomingCall' - - type: 'callHierarchy/outgoingCalls' - link: '#callHierarchy_outgoingCalls' - - type: 'CallHierarchyOutgoingCallsParams' - link: '#callHierarchyOutgoingCallsParams' - - type: 'CallHierarchyOutgoingCall' - link: '#callHierarchyOutgoingCall' - - type: 'SemanticTokenTypes' - link: '#semanticTokenTypes' - - type: 'SemanticTokenModifiers' - link: '#semanticTokenModifiers' - - type: 'TokenFormat' - link: '#tokenFormat' - - type: 'SemanticTokensLegend' - link: '#semanticTokensLegend' - - type: 'SemanticTokensClientCapabilities' - link: '#semanticTokensClientCapabilities' - - type: 'SemanticTokensOptions' - link: '#semanticTokensOptions' - - type: 'SemanticTokensRegistrationOptions' - link: '#semanticTokensRegistrationOptions' - - type: 'textDocument/semanticTokens/full' - link: '#semanticTokens_fullRequest' - - type: 'SemanticTokensParams' - link: '#semanticTokensParams' - - type: 'SemanticTokens' - link: '#semanticTokens' - - type: 'SemanticTokensPartialResult' - link: '#semanticTokensPartialResult' - - type: 'textDocument/semanticTokens/full/delta' - link: '#semanticTokens_deltaRequest' - - type: 'SemanticTokensDeltaParams' - link: '#semanticTokensDeltaParams' - - type: 'SemanticTokensDelta' - link: '#semanticTokensDelta' - - type: 'SemanticTokensEdit' - link: '#semanticTokensEdit' - - type: 'SemanticTokensDeltaPartialResult' - link: '#semanticTokensDeltaPartialResult' - - type: 'textDocument/semanticTokens/range' - link: '#semanticTokens_rangeRequest' - - type: 'SemanticTokensRangeParams' - link: '#semanticTokensRangeParams' - - type: 'SemanticTokensWorkspaceClientCapabilities' - link: '#semanticTokensWorkspaceClientCapabilities' - - type: 'workspace/semanticTokens/refresh' - link: '#semanticTokens_refreshRequest' - - type: 'textDocument/linkedEditingRange' - link: '#textDocument_linkedEditingRange' - - type: 'LinkedEditingRangeClientCapabilities' - link: '#linkedEditingRangeClientCapabilities' - - type: 'LinkedEditingRangeOptions' - link: '#linkedEditingRangeOptions' - - type: 'LinkedEditingRangeRegistrationOptions' - link: '#linkedEditingRangeRegistrationOptions' - - type: 'LinkedEditingRangeParams' - link: '#linkedEditingRangeParams' - - type: 'LinkedEditingRanges' - link: '#linkedEditingRanges' - - type: 'textDocument/moniker' - link: '#textDocument_moniker' - - type: 'MonikerClientCapabilities' - link: '#monikerClientCapabilities' - - type: 'MonikerOptions' - link: '#monikerOptions' - - type: 'MonikerRegistrationOptions' - link: '#monikerRegistrationOptions' - - type: 'MonikerParams' - link: '#monikerParams' - - type: 'UniquenessLevel' - link: '#uniquenessLevel' - - type: 'MonikerKind' - link: '#monikerKind' - - type: 'Moniker' - link: '#moniker' - - type: 'TypeHierarchyClientCapabilities' - link: '#typeHierarchyClientCapabilities' - - type: 'TypeHierarchyOptions' - link: '#typeHierarchyOptions' - - type: 'TypeHierarchyRegistrationOptions' - link: '#typeHierarchyRegistrationOptions' - - type: 'TypeHierarchyPrepareParams' - link: '#typeHierarchyPrepareParams' - - type: 'TypeHierarchyItem' - link: '#typeHierarchyItem' - - type: 'TypeHierarchySupertypesParams' - link: '#typeHierarchySupertypesParams' - - type: 'TypeHierarchySubtypesParams' - link: '#typeHierarchySubtypesParams' - - type: 'InlayHintClientCapabilities' - link: '#inlayHintClientCapabilities' - - type: 'InlayHintOptions' - link: '#inlayHintOptions' - - type: 'InlayHintRegistrationOptions' - link: '#inlayHintRegistrationOptions' - - type: 'InlayHintParams' - link: '#inlayHintParams' - - type: 'InlayHint' - link: '#inlayHint' - - type: 'InlayHintLabelPart' - link: '#inlayHintLabelPart' - - type: 'InlayHintKind' - link: '#inlayHintKind' - - type: 'InlayHintWorkspaceClientCapabilities' - link: '#inlayHintWorkspaceClientCapabilities' - - type: 'InlineValueClientCapabilities' - link: '#inlineValueClientCapabilities' - - type: 'InlineValueOptions' - link: '#inlineValueOptions' - - type: 'InlineValueRegistrationOptions' - link: '#inlineValueRegistrationOptions' - - type: 'InlineValueParams' - link: '#inlineValueParams' - - type: 'InlineValueContext' - link: '#inlineValueContext' - - type: 'InlineValueText' - link: '#inlineValueText' - - type: 'InlineValueVariableLookup' - link: '#inlineValueVariableLookup' - - type: 'InlineValueEvaluatableExpression' - link: '#inlineValueEvaluatableExpression' - - type: 'InlineValue' - link: '#inlineValue' - - type: 'InlineValueWorkspaceClientCapabilities' - link: '#inlineValueWorkspaceClientCapabilities' - - type: 'NotebookDocument' - link: '#notebookDocument' - - type: 'NotebookCell' - link: '#notebookCell' - - type: 'NotebookCellKind' - link: '#notebookCellKind' - - type: 'ExecutionSummary' - link: '#executionSummary' - - type: 'NotebookCellTextDocumentFilter' - link: '#notebookCellTextDocumentFilter' - - type: 'NotebookDocumentFilter' - link: '#notebookDocumentFilter' - - type: 'NotebookDocumentSyncClientCapabilities' - link: '#notebookDocumentSyncClientCapabilities' - - type: 'NotebookDocumentSyncOptions' - link: '#notebookDocumentSyncOptions' - - type: 'NotebookDocumentSyncRegistrationOptions' - link: '#notebookDocumentSyncRegistrationOptions' - - type: 'notebookDocument/didOpen' - link: '#notebookDocument_didOpen' - - type: 'DidOpenNotebookDocumentParams' - link: '#didOpenNotebookDocumentParams' - - type: 'notebookDocument/didChange' - link: '#notebookDocument_didChange' - - type: 'DidChangeNotebookDocumentParams' - link: '#didChangeNotebookDocumentParams' - - type: 'NotebookDocumentChangeEvent' - link: '#notebookDocumentChangeEvent' - - type: 'NotebookCellArrayChange' - link: '#notebookCellArrayChange' - - type: 'notebookDocument/didSave' - link: '#notebookDocument_didSave' - - type: 'DidSaveNotebookDocumentParams' - link: '#didSaveNotebookDocumentParams' - - type: 'notebookDocument/didClose' - link: '#notebookDocument_didClose' - - type: 'DidCloseNotebookDocumentParams' - link: '#didCloseNotebookDocumentParams' - - type: 'NotebookDocumentIdentifier' - link: '#notebookDocumentIdentifier' - - type: 'VersionedNotebookDocumentIdentifier' - link: '#versionedNotebookDocumentIdentifier' - - type: 'DiagnosticClientCapabilities' - link: '#diagnosticClientCapabilities' - - type: 'DiagnosticWorkspaceClientCapabilities' - link: '#diagnosticWorkspaceClientCapabilities' - - type: 'DiagnosticOptions' - link: '#diagnosticOptions' - - type: 'DiagnosticRegistrationOptions' - link: '#diagnosticRegistrationOptions' - - type: 'DocumentDiagnosticParams' - link: '#documentDiagnosticParams' - - type: 'DocumentDiagnosticReport' - link: '#documentDiagnosticReport' - - type: 'DocumentDiagnosticReportKind' - link: '#documentDiagnosticReportKind' - - type: 'FullDocumentDiagnosticReport' - link: '#fullDocumentDiagnosticReport' - - type: 'UnchangedDocumentDiagnosticReport' - link: '#unchangedDocumentDiagnosticReport' - - type: 'RelatedFullDocumentDiagnosticReport' - link: '#relatedFullDocumentDiagnosticReport' - - type: 'RelatedUnchangedDocumentDiagnosticReport' - link: '#relatedUnchangedDocumentDiagnosticReport' - - type: 'DocumentDiagnosticReportPartialResult' - link: '#documentDiagnosticReportPartialResult' - - type: 'DiagnosticServerCancellationData' - link: '#diagnosticServerCancellationData' - - type: 'WorkspaceDiagnosticParams' - link: '#workspaceDiagnosticParams' - - type: 'PreviousResultId' - link: '#previousResultId' - - type: 'WorkspaceDiagnosticReport' - link: '#workspaceDiagnosticReport' - - type: 'WorkspaceFullDocumentDiagnosticReport' - link: '#workspaceFullDocumentDiagnosticReport' - - type: 'WorkspaceUnchangedDocumentDiagnosticReport' - link: '#workspaceUnchangedDocumentDiagnosticReport' - - type: 'WorkspaceDocumentDiagnosticReport' - link: '#workspaceDocumentDiagnosticReport' - - type: 'WorkspaceDiagnosticReportPartialResult' - link: '#workspaceDiagnosticReportPartialResult' \ No newline at end of file diff --git a/language-server-protocol/_data/lsif-0-4-0-toc.yml b/language-server-protocol/_data/lsif-0-4-0-toc.yml deleted file mode 100644 index e0069bebf..000000000 --- a/language-server-protocol/_data/lsif-0-4-0-toc.yml +++ /dev/null @@ -1,61 +0,0 @@ -- title: Table of Contents - reveal: _general - children: - - title: General - anchor: _general - children: - - title: Introduction - anchor: lsifIntro - - title: Motivation - anchor: lsifMotivation - - title: Ranges - anchor: ranges - - title: Result Sets - anchor: resultSet - - title: Language Features - anchor: _languageFeatures - children: - - title: definition - anchor: definition - - title: declaration - anchor: declaration - - title: hover - anchor: hover - - title: references - anchor: references - - title: implementation - anchor: implementation - - title: typeDefinition - anchor: typeDefinition - - title: foldingRange - anchor: foldingRange - - title: documentLink - anchor: documentLink - - title: documentSymbol - anchor: documentSymbol - - title: diagnostic - anchor: diagnostic - - title: project - anchor: projectContext - - title: Embedding Contents - anchor: embeddingContents - - title: Advanced Concepts - anchor: _advancedConcpets - children: - - title: Events - anchor: events - - title: Exports and Imports - anchor: exportsImports - - title: Result Ranges - anchor: resultRanges - - title: Meta Data - anchor: metaData - - title: Emitting Contstraints - anchor: emittingContstraints - - title: Additional Information - anchor: _additionalInformation - children: - - title: Tools - anchor: tools - - title: Open Questions - anchor: openQuestions \ No newline at end of file diff --git a/language-server-protocol/_data/lsif-0-5-0-toc.yml b/language-server-protocol/_data/lsif-0-5-0-toc.yml deleted file mode 100644 index 25995534a..000000000 --- a/language-server-protocol/_data/lsif-0-5-0-toc.yml +++ /dev/null @@ -1,65 +0,0 @@ -- title: Table of Contents - reveal: _general - children: - - title: General - anchor: _general - children: - - title: Introduction - anchor: lsifIntro - - title: Motivation - anchor: lsifMotivation - - title: Ranges - anchor: ranges - - title: Result Sets - anchor: resultSet - - title: Language Features - anchor: _languageFeatures - children: - - title: definition - anchor: definition - - title: declaration - anchor: declaration - - title: hover - anchor: hover - - title: references - anchor: references - - title: implementation - anchor: implementation - - title: typeDefinition - anchor: typeDefinition - - title: foldingRange - anchor: foldingRange - - title: documentLink - anchor: documentLink - - title: documentSymbol - anchor: documentSymbol - - title: diagnostic - anchor: diagnostic - - title: project - anchor: projectContext - - title: Embedding Contents - anchor: embeddingContents - - title: Advanced Concepts - anchor: _advancedConcepts - children: - - title: Events - anchor: events - - title: Exports and Imports - anchor: exportsImports - - title: Multiple Projects - anchor: multiProjects - - title: Package Managers - anchor: packageManagers - - title: Result Ranges - anchor: resultRanges - - title: Meta Data - anchor: metaData - - title: Emitting Constraints - anchor: emittingConstraints - - title: Additional Information - anchor: _additionalInformation - children: - - title: Tools - anchor: tools - - title: Open Questions - anchor: openQuestions \ No newline at end of file diff --git a/language-server-protocol/_data/lsif-0-6-0-toc.yml b/language-server-protocol/_data/lsif-0-6-0-toc.yml deleted file mode 100644 index 25995534a..000000000 --- a/language-server-protocol/_data/lsif-0-6-0-toc.yml +++ /dev/null @@ -1,65 +0,0 @@ -- title: Table of Contents - reveal: _general - children: - - title: General - anchor: _general - children: - - title: Introduction - anchor: lsifIntro - - title: Motivation - anchor: lsifMotivation - - title: Ranges - anchor: ranges - - title: Result Sets - anchor: resultSet - - title: Language Features - anchor: _languageFeatures - children: - - title: definition - anchor: definition - - title: declaration - anchor: declaration - - title: hover - anchor: hover - - title: references - anchor: references - - title: implementation - anchor: implementation - - title: typeDefinition - anchor: typeDefinition - - title: foldingRange - anchor: foldingRange - - title: documentLink - anchor: documentLink - - title: documentSymbol - anchor: documentSymbol - - title: diagnostic - anchor: diagnostic - - title: project - anchor: projectContext - - title: Embedding Contents - anchor: embeddingContents - - title: Advanced Concepts - anchor: _advancedConcepts - children: - - title: Events - anchor: events - - title: Exports and Imports - anchor: exportsImports - - title: Multiple Projects - anchor: multiProjects - - title: Package Managers - anchor: packageManagers - - title: Result Ranges - anchor: resultRanges - - title: Meta Data - anchor: metaData - - title: Emitting Constraints - anchor: emittingConstraints - - title: Additional Information - anchor: _additionalInformation - children: - - title: Tools - anchor: tools - - title: Open Questions - anchor: openQuestions \ No newline at end of file diff --git a/language-server-protocol/_data/overviews.yml b/language-server-protocol/_data/overviews.yml deleted file mode 100644 index 3fa9c4c2b..000000000 --- a/language-server-protocol/_data/overviews.yml +++ /dev/null @@ -1,4 +0,0 @@ -- title: LSP - url: /overviews/lsp/overview -- title: LSIF - url: /overviews/lsif/overview \ No newline at end of file diff --git a/language-server-protocol/_data/specification-3-14-toc.yml b/language-server-protocol/_data/specification-3-14-toc.yml deleted file mode 100644 index 4d3107f14..000000000 --- a/language-server-protocol/_data/specification-3-14-toc.yml +++ /dev/null @@ -1,160 +0,0 @@ -- title: Message Overview - reveal: general - children: - - title: General - anchor: general - children: - - title: initialize - anchor: initialize - - title: initialized - anchor: initialized - - title: shutdown - anchor: shutdown - - title: exit - anchor: exit - - title: $/cancelRequest - anchor: cancelRequest - - title: Window - anchor: window - children: - - title: showMessage - anchor: window_showMessage - - title: showMessageRequest - anchor: window_showMessageRequest - - title: logMessage - anchor: window_logMessage - - title: Telemetry - anchor: telemetry - children: - - title: event - anchor: telemetry_event - - title: Client - anchor: client - children: - - title: registerCapability - anchor: client_registerCapability - - title: unregisterCapability - anchor: client_unregisterCapability - - title: Workspace - anchor: workspace - children: - - title: workspaceFolders - anchor: workspace_workspaceFolders - - title: didChangeWorkspaceFolders - anchor: workspace_didChangeWorkspaceFolders - - title: didChangeConfiguration - anchor: workspace_didChangeConfiguration - - title: configuration - anchor: workspace_configuration - - title: didChangeWatchedFiles - anchor: workspace_didChangeWatchedFiles - - title: symbol - anchor: workspace_symbol - - title: executeCommand - anchor: workspace_executeCommand - - title: applyEdit - anchor: workspace_applyEdit - - title: Text Synchronization - anchor: textSynchronization - children: - - title: didOpen - anchor: textDocument_didOpen - - title: didChange - anchor: textDocument_didChange - - title: willSave - anchor: textDocument_willSave - - title: willSaveWaitUntil - anchor: textDocument_willSaveWaitUntil - - title: didSave - anchor: textDocument_didSave - - title: didClose - anchor: textDocument_didClose - - title: Diagnostics - anchor: diagnostics - children: - - title: publishDiagnostics - anchor: textDocument_publishDiagnostics - - title: Language Features - anchor: languageFeatures - children: - - title: completion - anchor: textDocument_completion - - title: completion resolve - anchor: completionItem_resolve - - title: hover - anchor: textDocument_hover - - title: signatureHelp - anchor: textDocument_signatureHelp - - title: declaration - anchor: textDocument_declaration - - title: definition - anchor: textDocument_definition - - title: typeDefinition - anchor: textDocument_typeDefinition - - title: implementation - anchor: textDocument_implementation - - title: references - anchor: textDocument_references - - title: documentHighlight - anchor: textDocument_documentHighlight - - title: documentSymbol - anchor: textDocument_documentSymbol - - title: codeAction - anchor: textDocument_codeAction - - title: codeLens - anchor: textDocument_codeLens - - title: codeLens resolve - anchor: codeLens_resolve - - title: documentLink - anchor: textDocument_documentLink - - title: documentLink resolve - anchor: documentLink_resolve - - title: documentColor - anchor: textDocument_documentColor - - title: colorPresentation - anchor: textDocument_colorPresentation - - title: formatting - anchor: textDocument_formatting - - title: rangeFormatting - anchor: textDocument_rangeFormatting - - title: onTypeFormatting - anchor: textDocument_onTypeFormatting - - title: rename - anchor: textDocument_rename - - title: prepareRename - anchor: textDocument_prepareRename - - title: foldingRange - anchor: textDocument_foldingRange - - title: Change Log - anchor: changeLog - children: - - title: 3.14.0 - anchor: version_3_14_0 - - title: 3.13.0 - anchor: version_3_13_0 - - title: 3.12.0 - anchor: version_3_12_0 - - title: 3.11.0 - anchor: version_3_11_0 - - title: 3.10.0 - anchor: version_3_10_0 - - title: 3.9.0 - anchor: version_3_9_0 - - title: 3.8.0 - anchor: version_3_8_0 - - title: 3.7.0 - anchor: version_3_7_0 - - title: 3.6.0 - anchor: version_3_6_0 - - title: 3.5.0 - anchor: version_3_5_0 - - title: 3.4.0 - anchor: version_3_4_0 - - title: 3.3.0 - anchor: version_3_3_0 - - title: 3.2.0 - anchor: version_3_2_0 - - title: 3.1.0 - anchor: version_3_1_0 - - title: 3.0 - anchor: version_3_0_0 \ No newline at end of file diff --git a/language-server-protocol/_data/specification-3-15-toc.yml b/language-server-protocol/_data/specification-3-15-toc.yml deleted file mode 100644 index cb002eb6b..000000000 --- a/language-server-protocol/_data/specification-3-15-toc.yml +++ /dev/null @@ -1,238 +0,0 @@ -- title: Message Overview - reveal: baseProtocol - children: - - title: Base Protocol - anchor: baseProtocol - children: - - title: Header Part - anchor: headerPart - - title: Content Part - anchor: contentPart - - title: Request Message - anchor: requestMessage - - title: Response Message - anchor: responseMessage - - title: Notification Message - anchor: notificationMessage - - title: $/cancelRequest - anchor: cancelRequest - - title: $/progress - anchor: progress - - title: Basic Structures - anchor: dataTypes - children: - - title: URI - anchor: uri - - title: Text Documents - anchor: textDocuments - - title: Position - anchor: position - - title: Range - anchor: range - - title: Location - anchor: location - - title: Location Link - anchor: locationLink - - title: Diagnostic - anchor: diagnostic - - title: Command - anchor: command - - title: Text Edit - anchor: textEdit - - title: Text Document Edit - anchor: textDocumentEdit - - title: File Resource Changes - anchor: resourceChanges - - title: Workspace Edit - anchor: workspaceEdit - - title: Text Document Identifier - anchor: textDocumentIdentifier - - title: Text Document Item - anchor: textDocumentItem - - title: Versioned Text Document Identifier - anchor: versionedTextDocumentIdentifier - - title: Text Document Position Params - anchor: textDocumentPositionParams - - title: Document Filter - anchor: documentFilter - - title: Static Registration Options - anchor: staticRegistrationOptions - - title: Text Document Registration Options - anchor: textDocumentRegistrationOptions - - title: Markup Content - anchor: markupContent - - title: Work Done Progress - anchor: workDoneProgress - - title: Client Initiated Progress - anchor: clientInitiatedProgress - - title: Server Initiated Progress - anchor: serverInitiatedProgress - - title: Partial Results - anchor: partialResults - - title: Partial Result Params - anchor: partialResultParams - - title: General Messages - anchor: general - children: - - title: initialize - anchor: initialize - - title: initialized - anchor: initialized - - title: shutdown - anchor: shutdown - - title: exit - anchor: exit - - title: Window - anchor: window - children: - - title: showMessage - anchor: window_showMessage - - title: showMessageRequest - anchor: window_showMessageRequest - - title: logMessage - anchor: window_logMessage - - title: progress/create - anchor: window_workDoneProgress_create - - title: progress/cancel - anchor: window_workDoneProgress_cancel - - title: Telemetry - anchor: telemetry - children: - - title: event - anchor: telemetry_event - - title: Client - anchor: client - children: - - title: registerCapability - anchor: client_registerCapability - - title: unregisterCapability - anchor: client_unregisterCapability - - title: Workspace - anchor: workspace - children: - - title: workspaceFolders - anchor: workspace_workspaceFolders - - title: didChangeWorkspaceFolders - anchor: workspace_didChangeWorkspaceFolders - - title: didChangeConfiguration - anchor: workspace_didChangeConfiguration - - title: configuration - anchor: workspace_configuration - - title: didChangeWatchedFiles - anchor: workspace_didChangeWatchedFiles - - title: symbol - anchor: workspace_symbol - - title: executeCommand - anchor: workspace_executeCommand - - title: applyEdit - anchor: workspace_applyEdit - - title: Text Synchronization - anchor: textSynchronization - children: - - title: General Capabilities - anchor: textDocument_synchronization - - title: didOpen - anchor: textDocument_didOpen - - title: didChange - anchor: textDocument_didChange - - title: willSave - anchor: textDocument_willSave - - title: willSaveWaitUntil - anchor: textDocument_willSaveWaitUntil - - title: didSave - anchor: textDocument_didSave - - title: didClose - anchor: textDocument_didClose - - title: Diagnostics - anchor: diagnostics - children: - - title: publishDiagnostics - anchor: textDocument_publishDiagnostics - - title: Language Features - anchor: languageFeatures - children: - - title: completion - anchor: textDocument_completion - - title: completion resolve - anchor: completionItem_resolve - - title: hover - anchor: textDocument_hover - - title: signatureHelp - anchor: textDocument_signatureHelp - - title: declaration - anchor: textDocument_declaration - - title: definition - anchor: textDocument_definition - - title: typeDefinition - anchor: textDocument_typeDefinition - - title: implementation - anchor: textDocument_implementation - - title: references - anchor: textDocument_references - - title: documentHighlight - anchor: textDocument_documentHighlight - - title: documentSymbol - anchor: textDocument_documentSymbol - - title: codeAction - anchor: textDocument_codeAction - - title: codeLens - anchor: textDocument_codeLens - - title: codeLens resolve - anchor: codeLens_resolve - - title: documentLink - anchor: textDocument_documentLink - - title: documentLink resolve - anchor: documentLink_resolve - - title: documentColor - anchor: textDocument_documentColor - - title: colorPresentation - anchor: textDocument_colorPresentation - - title: formatting - anchor: textDocument_formatting - - title: rangeFormatting - anchor: textDocument_rangeFormatting - - title: onTypeFormatting - anchor: textDocument_onTypeFormatting - - title: rename - anchor: textDocument_rename - - title: prepareRename - anchor: textDocument_prepareRename - - title: foldingRange - anchor: textDocument_foldingRange - - title: selectionRange - anchor: textDocument_selectionRange - - title: Change Log - anchor: changeLog - children: - - title: 3.15.0 - anchor: version_3_15_0 - - title: 3.14.0 - anchor: version_3_14_0 - - title: 3.13.0 - anchor: version_3_13_0 - - title: 3.12.0 - anchor: version_3_12_0 - - title: 3.11.0 - anchor: version_3_11_0 - - title: 3.10.0 - anchor: version_3_10_0 - - title: 3.9.0 - anchor: version_3_9_0 - - title: 3.8.0 - anchor: version_3_8_0 - - title: 3.7.0 - anchor: version_3_7_0 - - title: 3.6.0 - anchor: version_3_6_0 - - title: 3.5.0 - anchor: version_3_5_0 - - title: 3.4.0 - anchor: version_3_4_0 - - title: 3.3.0 - anchor: version_3_3_0 - - title: 3.2.0 - anchor: version_3_2_0 - - title: 3.1.0 - anchor: version_3_1_0 - - title: 3.0 - anchor: version_3_0_0 \ No newline at end of file diff --git a/language-server-protocol/_data/specification-3-16-toc.yml b/language-server-protocol/_data/specification-3-16-toc.yml deleted file mode 100644 index 545bafb9a..000000000 --- a/language-server-protocol/_data/specification-3-16-toc.yml +++ /dev/null @@ -1,268 +0,0 @@ -- title: Message Overview - reveal: baseProtocol - children: - - title: Base Protocol - anchor: baseProtocol - children: - - title: Header Part - anchor: headerPart - - title: Content Part - anchor: contentPart - - title: Request Message - anchor: requestMessage - - title: Response Message - anchor: responseMessage - - title: Notification Message - anchor: notificationMessage - - title: $/cancelRequest - anchor: cancelRequest - - title: $/progress - anchor: progress - - title: Basic Structures - anchor: dataTypes - children: - - title: URI - anchor: uri - - title: Regular Expression - anchor: regExp - - title: Text Documents - anchor: textDocuments - - title: Position - anchor: position - - title: Range - anchor: range - - title: Location - anchor: location - - title: Location Link - anchor: locationLink - - title: Diagnostic - anchor: diagnostic - - title: Command - anchor: command - - title: Text Edit - anchor: textEdit - - title: Text Document Edit - anchor: textDocumentEdit - - title: File Resource Changes - anchor: resourceChanges - - title: Workspace Edit - anchor: workspaceEdit - - title: Text Document Identifier - anchor: textDocumentIdentifier - - title: Text Document Item - anchor: textDocumentItem - - title: Versioned Text Document Identifier - anchor: versionedTextDocumentIdentifier - - title: Text Document Position Params - anchor: textDocumentPositionParams - - title: Document Filter - anchor: documentFilter - - title: Static Registration Options - anchor: staticRegistrationOptions - - title: Text Document Registration Options - anchor: textDocumentRegistrationOptions - - title: Markup Content - anchor: markupContent - - title: Work Done Progress - anchor: workDoneProgress - - title: Client Initiated Progress - anchor: clientInitiatedProgress - - title: Server Initiated Progress - anchor: serverInitiatedProgress - - title: Partial Results - anchor: partialResults - - title: Partial Result Params - anchor: partialResultParams - - title: Trace Value - anchor: traceValue - - title: General Messages - anchor: general - children: - - title: initialize - anchor: initialize - - title: initialized - anchor: initialized - - title: shutdown - anchor: shutdown - - title: exit - anchor: exit - - title: logTrace - anchor: logTrace - - title: setTrace - anchor: setTrace - - title: Window - anchor: window - children: - - title: showMessage - anchor: window_showMessage - - title: showMessageRequest - anchor: window_showMessageRequest - - title: showDocument - anchor: window_showDocument - - title: logMessage - anchor: window_logMessage - - title: progress/create - anchor: window_workDoneProgress_create - - title: progress/cancel - anchor: window_workDoneProgress_cancel - - title: Telemetry - anchor: telemetry - children: - - title: event - anchor: telemetry_event - - title: Client - anchor: client - children: - - title: registerCapability - anchor: client_registerCapability - - title: unregisterCapability - anchor: client_unregisterCapability - - title: Workspace - anchor: workspace - children: - - title: workspaceFolders - anchor: workspace_workspaceFolders - - title: didChangeWorkspaceFolders - anchor: workspace_didChangeWorkspaceFolders - - title: didChangeConfiguration - anchor: workspace_didChangeConfiguration - - title: configuration - anchor: workspace_configuration - - title: didChangeWatchedFiles - anchor: workspace_didChangeWatchedFiles - - title: symbol - anchor: workspace_symbol - - title: executeCommand - anchor: workspace_executeCommand - - title: applyEdit - anchor: workspace_applyEdit - - title: file operations events - anchor: workspace_willCreateFiles - - title: Text Synchronization - anchor: textSynchronization - children: - - title: General Capabilities - anchor: textDocument_synchronization - - title: didOpen - anchor: textDocument_didOpen - - title: didChange - anchor: textDocument_didChange - - title: willSave - anchor: textDocument_willSave - - title: willSaveWaitUntil - anchor: textDocument_willSaveWaitUntil - - title: didSave - anchor: textDocument_didSave - - title: didClose - anchor: textDocument_didClose - - title: Diagnostics - anchor: diagnostics - children: - - title: publishDiagnostics - anchor: textDocument_publishDiagnostics - - title: Language Features - anchor: languageFeatures - children: - - title: completion - anchor: textDocument_completion - - title: completion resolve - anchor: completionItem_resolve - - title: hover - anchor: textDocument_hover - - title: signatureHelp - anchor: textDocument_signatureHelp - - title: declaration - anchor: textDocument_declaration - - title: definition - anchor: textDocument_definition - - title: typeDefinition - anchor: textDocument_typeDefinition - - title: implementation - anchor: textDocument_implementation - - title: references - anchor: textDocument_references - - title: documentHighlight - anchor: textDocument_documentHighlight - - title: documentSymbol - anchor: textDocument_documentSymbol - - title: codeAction - anchor: textDocument_codeAction - - title: codeAction resolve - anchor: codeAction_resolve - - title: codeLens - anchor: textDocument_codeLens - - title: codeLens resolve - anchor: codeLens_resolve - - title: codeLens refresh - anchor: codeLens_refresh - - title: documentLink - anchor: textDocument_documentLink - - title: documentLink resolve - anchor: documentLink_resolve - - title: documentColor - anchor: textDocument_documentColor - - title: colorPresentation - anchor: textDocument_colorPresentation - - title: formatting - anchor: textDocument_formatting - - title: rangeFormatting - anchor: textDocument_rangeFormatting - - title: onTypeFormatting - anchor: textDocument_onTypeFormatting - - title: rename - anchor: textDocument_rename - - title: prepareRename - anchor: textDocument_prepareRename - - title: foldingRange - anchor: textDocument_foldingRange - - title: selectionRange - anchor: textDocument_selectionRange - - title: prepareCallHierarchy - anchor: textDocument_prepareCallHierarchy - - title: callHierarchy incoming - anchor: callHierarchy_incomingCalls - - title: callHierarchy outgoing - anchor: callHierarchy_outgoingCalls - - title: semantic tokens - anchor: textDocument_semanticTokens - - title: linkedEditingRange - anchor: textDocument_linkedEditingRange - - title: moniker - anchor: textDocument_moniker - - title: Change Log - anchor: changeLog - children: - - title: 3.16.0 - anchor: version_3_16_0 - - title: 3.15.0 - anchor: version_3_15_0 - - title: 3.14.0 - anchor: version_3_14_0 - - title: 3.13.0 - anchor: version_3_13_0 - - title: 3.12.0 - anchor: version_3_12_0 - - title: 3.11.0 - anchor: version_3_11_0 - - title: 3.10.0 - anchor: version_3_10_0 - - title: 3.9.0 - anchor: version_3_9_0 - - title: 3.8.0 - anchor: version_3_8_0 - - title: 3.7.0 - anchor: version_3_7_0 - - title: 3.6.0 - anchor: version_3_6_0 - - title: 3.5.0 - anchor: version_3_5_0 - - title: 3.4.0 - anchor: version_3_4_0 - - title: 3.3.0 - anchor: version_3_3_0 - - title: 3.2.0 - anchor: version_3_2_0 - - title: 3.1.0 - anchor: version_3_1_0 - - title: 3.0 - anchor: version_3_0_0 \ No newline at end of file diff --git a/language-server-protocol/_data/specification-3-17-toc.yml b/language-server-protocol/_data/specification-3-17-toc.yml deleted file mode 100644 index bffff6a6c..000000000 --- a/language-server-protocol/_data/specification-3-17-toc.yml +++ /dev/null @@ -1,325 +0,0 @@ -- title: Message Overview - reveal: baseProtocol - children: - - title: Base Protocol - anchor: baseProtocol - children: - - title: Header Part - anchor: headerPart - - title: Content Part - anchor: contentPart - - title: Base Types - anchor: baseTypes - - title: Request Message - anchor: requestMessage - - title: Response Message - anchor: responseMessage - - title: Notification Message - anchor: notificationMessage - - title: Cancellation Support - anchor: cancelRequest - - title: Progress Support - anchor: progress - - title: Language Server Protocol - anchor: languageServerProtocol - children: - - title: Overview - anchor: languageServerProtocol - - title: Capabilities - anchor: capabilities - - title: Message Ordering - anchor: messageOrdering - - title: Message Documentation - anchor: messageDocumentation - - title: Basic JSON Structures - anchor: basicJsonStructures - children: - - title: URI - anchor: uri - - title: Regular Expression - anchor: regExp - - title: Enumerations - anchor: enumerations - - title: Text Documents - anchor: textDocuments - - title: Position - anchor: position - - title: Range - anchor: range - - title: Text Document Item - anchor: textDocumentItem - - title: Text Document Identifier - anchor: textDocumentIdentifier - - title: Versioned Text Document Identifier - anchor: versionedTextDocumentIdentifier - - title: Text Document Position Params - anchor: textDocumentPositionParams - - title: Document Filter - anchor: documentFilter - - title: Text Edit - anchor: textEdit - - title: Text Edit Array - anchor: textEditArray - - title: Text Document Edit - anchor: textDocumentEdit - - title: Location - anchor: location - - title: Location Link - anchor: locationLink - - title: Diagnostic - anchor: diagnostic - - title: Command - anchor: command - - title: Markup Content - anchor: markupContent - - title: File Resource Changes - anchor: resourceChanges - - title: Workspace Edit - anchor: workspaceEdit - - title: Work Done Progress - anchor: workDoneProgress - - title: Client Initiated Progress - anchor: clientInitiatedProgress - - title: Server Initiated Progress - anchor: serverInitiatedProgress - - title: Partial Results - anchor: partialResults - - title: Partial Result Params - anchor: partialResultParams - - title: Trace Value - anchor: traceValue - - title: Lifecycle Messages - anchor: lifeCycleMessages - children: - - title: Overview - anchor: lifeCycleMessages - - title: Initialize - anchor: initialize - - title: Initialized - anchor: initialized - - title: Register Capability - anchor: client_registerCapability - - title: Unregister Capability - anchor: client_unregisterCapability - - title: Set Trace - anchor: setTrace - - title: Log Trace - anchor: logTrace - - title: Shutdown - anchor: shutdown - - title: Exit - anchor: exit - - title: Document Synchronization - anchor: textSynchronization - children: - - title: Overview - Text Document - anchor: textDocument_synchronization - - title: Did Open Text Document - anchor: textDocument_didOpen - - title: Did Change Text Document - anchor: textDocument_didChange - - title: Will Save Text Document - anchor: textDocument_willSave - - title: Will Save Document Wait Until - anchor: textDocument_willSaveWaitUntil - - title: Did Save Text Document - anchor: textDocument_didSave - - title: Did Close Text Document - anchor: textDocument_didClose - - title: Rename a Text Document - anchor: textDocument_didRename - - title: Overview - Notebook Document - anchor: notebookDocument_synchronization - - title: Did Open Notebook Document - anchor: notebookDocument_didOpen - - title: Did Change Notebook Document - anchor: notebookDocument_didChange - - title: Did Save Notebook Document - anchor: notebookDocument_didSave - - title: Did Close Notebook Document - anchor: notebookDocument_didClose - - title: Language Features - anchor: languageFeatures - children: - - title: Overview - anchor: languageFeatures - - title: Go to Declaration - anchor: textDocument_declaration - - title: Go to Definition - anchor: textDocument_definition - - title: Go to Type Definition - anchor: textDocument_typeDefinition - - title: Go to Implementation - anchor: textDocument_implementation - - title: Find References - anchor: textDocument_references - - title: Prepare Call Hierarchy - anchor: textDocument_prepareCallHierarchy - - title: Call Hierarchy Incoming Calls - anchor: callHierarchy_incomingCalls - - title: Call Hierarchy Outgoing Calls - anchor: callHierarchy_outgoingCalls - - title: Prepare Type Hierarchy - anchor: textDocument_prepareTypeHierarchy - - title: Type Hierarchy Super Types - anchor: typeHierarchy_supertypes - - title: Type Hierarchy Sub Types - anchor: typeHierarchy_subtypes - - title: Document Highlight - anchor: textDocument_documentHighlight - - title: Document Link - anchor: textDocument_documentLink - - title: Document Link Resolve - anchor: documentLink_resolve - - title: Hover - anchor: textDocument_hover - - title: Code Lens - anchor: textDocument_codeLens - - title: Code Lens Refresh - anchor: codeLens_refresh - - title: Folding Range - anchor: textDocument_foldingRange - - title: Selection Range - anchor: textDocument_selectionRange - - title: Document Symbols - anchor: textDocument_documentSymbol - - title: Semantic Tokens - anchor: textDocument_semanticTokens - - title: Inline Value - anchor: textDocument_inlineValue - - title: Inline Value Refresh - anchor: workspace_inlineValue_refresh - - title: Inlay Hint - anchor: textDocument_inlayHint - - title: Inlay Hint Resolve - anchor: inlayHint_resolve - - title: Inlay Hint Refresh - anchor: workspace_inlayHint_refresh - - title: Moniker - anchor: textDocument_moniker - - title: Completion Proposals - anchor: textDocument_completion - - title: Completion Item Resolve - anchor: completionItem_resolve - - title: Publish Diagnostics - anchor: textDocument_publishDiagnostics - - title: Pull Diagnostics - anchor: textDocument_pullDiagnostics - - title: Signature Help - anchor: textDocument_signatureHelp - - title: Code Action - anchor: textDocument_codeAction - - title: Code Action Resolve - anchor: codeAction_resolve - - title: Document Color - anchor: textDocument_documentColor - - title: Color Presentation - anchor: textDocument_colorPresentation - - title: Formatting - anchor: textDocument_formatting - - title: Range Formatting - anchor: textDocument_rangeFormatting - - title: On type Formatting - anchor: textDocument_onTypeFormatting - - title: Rename - anchor: textDocument_rename - - title: Prepare Rename - anchor: textDocument_prepareRename - - title: Linked Editing Range - anchor: textDocument_linkedEditingRange - - title: Workspace Features - anchor: workspaceFeatures - children: - - title: Workspace Symbols - anchor: workspace_symbol - - title: Workspace Symbol Resolve - anchor: workspace_symbolResolve - - title: Get Configuration - anchor: workspace_configuration - - title: Did Change Configuration - anchor: workspace_didChangeConfiguration - - title: Workspace Folders - anchor: workspace_workspaceFolders - - title: Did Change Workspace Folders - anchor: workspace_didChangeWorkspaceFolders - - title: Will Create Files - anchor: workspace_willCreateFiles - - title: Did Create Files - anchor: workspace_didCreateFiles - - title: Will Rename Files - anchor: workspace_willRenameFiles - - title: Did Rename Files - anchor: workspace_didRenameFiles - - title: Will Delete Files - anchor: workspace_willDeleteFiles - - title: Did Delete Files - anchor: workspace_didDeleteFiles - - title: Did Change Watched Files - anchor: workspace_didChangeWatchedFiles - - title: Execute Command - anchor: workspace_executeCommand - - title: Apply Edit - anchor: workspace_applyEdit - - title: Window Features - anchor: windowFeatures - children: - - title: Show Message Notification - anchor: window_showMessage - - title: Show Message Request - anchor: window_showMessageRequest - - title: Log Message - anchor: window_logMessage - - title: Show Document - anchor: window_showDocument - - title: Create Work Done Progress - anchor: window_workDoneProgress_create - - title: Cancel a Work Done Progress - anchor: window_workDoneProgress_cancel - - title: Sent Telemetry - anchor: telemetry_event - - title: Miscellaneous - anchor: miscellaneous - children: - - title: Implementation Considerations - anchor: implementationConsiderations - - title: Meta Model - anchor: metaModel - - title: Change Log - anchor: changeLog - children: - - title: 3.17.0 - anchor: version_3_17_0 - - title: 3.16.0 - anchor: version_3_16_0 - - title: 3.15.0 - anchor: version_3_15_0 - - title: 3.14.0 - anchor: version_3_14_0 - - title: 3.13.0 - anchor: version_3_13_0 - - title: 3.12.0 - anchor: version_3_12_0 - - title: 3.11.0 - anchor: version_3_11_0 - - title: 3.10.0 - anchor: version_3_10_0 - - title: 3.9.0 - anchor: version_3_9_0 - - title: 3.8.0 - anchor: version_3_8_0 - - title: 3.7.0 - anchor: version_3_7_0 - - title: 3.6.0 - anchor: version_3_6_0 - - title: 3.5.0 - anchor: version_3_5_0 - - title: 3.4.0 - anchor: version_3_4_0 - - title: 3.3.0 - anchor: version_3_3_0 - - title: 3.2.0 - anchor: version_3_2_0 - - title: 3.1.0 - anchor: version_3_1_0 - - title: 3.0 - anchor: version_3_0_0 \ No newline at end of file diff --git a/language-server-protocol/_data/specification-3-18-toc.yml b/language-server-protocol/_data/specification-3-18-toc.yml deleted file mode 100644 index c196c3e5d..000000000 --- a/language-server-protocol/_data/specification-3-18-toc.yml +++ /dev/null @@ -1,327 +0,0 @@ -- title: Message Overview - reveal: baseProtocol - children: - - title: Base Protocol - anchor: baseProtocol - children: - - title: Header Part - anchor: headerPart - - title: Content Part - anchor: contentPart - - title: Base Types - anchor: baseTypes - - title: Request Message - anchor: requestMessage - - title: Response Message - anchor: responseMessage - - title: Notification Message - anchor: notificationMessage - - title: Cancellation Support - anchor: cancelRequest - - title: Progress Support - anchor: progress - - title: Language Server Protocol - anchor: languageServerProtocol - children: - - title: Overview - anchor: languageServerProtocol - - title: Capabilities - anchor: capabilities - - title: Message Ordering - anchor: messageOrdering - - title: Message Documentation - anchor: messageDocumentation - - title: Basic JSON Structures - anchor: basicJsonStructures - children: - - title: URI - anchor: uri - - title: Regular Expression - anchor: regExp - - title: Enumerations - anchor: enumerations - - title: Text Documents - anchor: textDocuments - - title: Position - anchor: position - - title: Range - anchor: range - - title: Text Document Item - anchor: textDocumentItem - - title: Text Document Identifier - anchor: textDocumentIdentifier - - title: Versioned Text Document Identifier - anchor: versionedTextDocumentIdentifier - - title: Text Document Position Params - anchor: textDocumentPositionParams - - title: Document Filter - anchor: documentFilter - - title: Text Edit - anchor: textEdit - - title: Text Edit Array - anchor: textEditArray - - title: Text Document Edit - anchor: textDocumentEdit - - title: Location - anchor: location - - title: Location Link - anchor: locationLink - - title: Diagnostic - anchor: diagnostic - - title: Command - anchor: command - - title: Markup Content - anchor: markupContent - - title: File Resource Changes - anchor: resourceChanges - - title: Workspace Edit - anchor: workspaceEdit - - title: Work Done Progress - anchor: workDoneProgress - - title: Client Initiated Progress - anchor: clientInitiatedProgress - - title: Server Initiated Progress - anchor: serverInitiatedProgress - - title: Partial Results - anchor: partialResults - - title: Partial Result Params - anchor: partialResultParams - - title: Trace Value - anchor: traceValue - - title: Lifecycle Messages - anchor: lifeCycleMessages - children: - - title: Overview - anchor: lifeCycleMessages - - title: Initialize - anchor: initialize - - title: Initialized - anchor: initialized - - title: Register Capability - anchor: client_registerCapability - - title: Unregister Capability - anchor: client_unregisterCapability - - title: Set Trace - anchor: setTrace - - title: Log Trace - anchor: logTrace - - title: Shutdown - anchor: shutdown - - title: Exit - anchor: exit - - title: Document Synchronization - anchor: textSynchronization - children: - - title: Overview - Text Document - anchor: textDocument_synchronization - - title: Did Open Text Document - anchor: textDocument_didOpen - - title: Did Change Text Document - anchor: textDocument_didChange - - title: Will Save Text Document - anchor: textDocument_willSave - - title: Will Save Document Wait Until - anchor: textDocument_willSaveWaitUntil - - title: Did Save Text Document - anchor: textDocument_didSave - - title: Did Close Text Document - anchor: textDocument_didClose - - title: Rename a Text Document - anchor: textDocument_didRename - - title: Overview - Notebook Document - anchor: notebookDocument_synchronization - - title: Did Open Notebook Document - anchor: notebookDocument_didOpen - - title: Did Change Notebook Document - anchor: notebookDocument_didChange - - title: Did Save Notebook Document - anchor: notebookDocument_didSave - - title: Did Close Notebook Document - anchor: notebookDocument_didClose - - title: Language Features - anchor: languageFeatures - children: - - title: Overview - anchor: languageFeatures - - title: Go to Declaration - anchor: textDocument_declaration - - title: Go to Definition - anchor: textDocument_definition - - title: Go to Type Definition - anchor: textDocument_typeDefinition - - title: Go to Implementation - anchor: textDocument_implementation - - title: Find References - anchor: textDocument_references - - title: Prepare Call Hierarchy - anchor: textDocument_prepareCallHierarchy - - title: Call Hierarchy Incoming Calls - anchor: callHierarchy_incomingCalls - - title: Call Hierarchy Outgoing Calls - anchor: callHierarchy_outgoingCalls - - title: Prepare Type Hierarchy - anchor: textDocument_prepareTypeHierarchy - - title: Type Hierarchy Super Types - anchor: typeHierarchy_supertypes - - title: Type Hierarchy Sub Types - anchor: typeHierarchy_subtypes - - title: Document Highlight - anchor: textDocument_documentHighlight - - title: Document Link - anchor: textDocument_documentLink - - title: Document Link Resolve - anchor: documentLink_resolve - - title: Hover - anchor: textDocument_hover - - title: Code Lens - anchor: textDocument_codeLens - - title: Code Lens Refresh - anchor: codeLens_refresh - - title: Folding Range - anchor: textDocument_foldingRange - - title: Selection Range - anchor: textDocument_selectionRange - - title: Document Symbols - anchor: textDocument_documentSymbol - - title: Semantic Tokens - anchor: textDocument_semanticTokens - - title: Inline Value - anchor: textDocument_inlineValue - - title: Inline Value Refresh - anchor: workspace_inlineValue_refresh - - title: Inlay Hint - anchor: textDocument_inlayHint - - title: Inlay Hint Resolve - anchor: inlayHint_resolve - - title: Inlay Hint Refresh - anchor: workspace_inlayHint_refresh - - title: Moniker - anchor: textDocument_moniker - - title: Completion Proposals - anchor: textDocument_completion - - title: Completion Item Resolve - anchor: completionItem_resolve - - title: Publish Diagnostics - anchor: textDocument_publishDiagnostics - - title: Pull Diagnostics - anchor: textDocument_pullDiagnostics - - title: Signature Help - anchor: textDocument_signatureHelp - - title: Code Action - anchor: textDocument_codeAction - - title: Code Action Resolve - anchor: codeAction_resolve - - title: Document Color - anchor: textDocument_documentColor - - title: Color Presentation - anchor: textDocument_colorPresentation - - title: Formatting - anchor: textDocument_formatting - - title: Range Formatting - anchor: textDocument_rangeFormatting - - title: On type Formatting - anchor: textDocument_onTypeFormatting - - title: Rename - anchor: textDocument_rename - - title: Prepare Rename - anchor: textDocument_prepareRename - - title: Linked Editing Range - anchor: textDocument_linkedEditingRange - - title: Workspace Features - anchor: workspaceFeatures - children: - - title: Workspace Symbols - anchor: workspace_symbol - - title: Workspace Symbol Resolve - anchor: workspace_symbolResolve - - title: Get Configuration - anchor: workspace_configuration - - title: Did Change Configuration - anchor: workspace_didChangeConfiguration - - title: Workspace Folders - anchor: workspace_workspaceFolders - - title: Did Change Workspace Folders - anchor: workspace_didChangeWorkspaceFolders - - title: Will Create Files - anchor: workspace_willCreateFiles - - title: Did Create Files - anchor: workspace_didCreateFiles - - title: Will Rename Files - anchor: workspace_willRenameFiles - - title: Did Rename Files - anchor: workspace_didRenameFiles - - title: Will Delete Files - anchor: workspace_willDeleteFiles - - title: Did Delete Files - anchor: workspace_didDeleteFiles - - title: Did Change Watched Files - anchor: workspace_didChangeWatchedFiles - - title: Execute Command - anchor: workspace_executeCommand - - title: Apply Edit - anchor: workspace_applyEdit - - title: Window Features - anchor: windowFeatures - children: - - title: Show Message Notification - anchor: window_showMessage - - title: Show Message Request - anchor: window_showMessageRequest - - title: Log Message - anchor: window_logMessage - - title: Show Document - anchor: window_showDocument - - title: Create Work Done Progress - anchor: window_workDoneProgress_create - - title: Cancel a Work Done Progress - anchor: window_workDoneProgress_cancel - - title: Sent Telemetry - anchor: telemetry_event - - title: Miscellaneous - anchor: miscellaneous - children: - - title: Implementation Considerations - anchor: implementationConsiderations - - title: Meta Model - anchor: metaModel - - title: Change Log - anchor: changeLog - children: - - title: 3.18.0 - anchor: version_3_18_0 - - title: 3.17.0 - anchor: version_3_17_0 - - title: 3.16.0 - anchor: version_3_16_0 - - title: 3.15.0 - anchor: version_3_15_0 - - title: 3.14.0 - anchor: version_3_14_0 - - title: 3.13.0 - anchor: version_3_13_0 - - title: 3.12.0 - anchor: version_3_12_0 - - title: 3.11.0 - anchor: version_3_11_0 - - title: 3.10.0 - anchor: version_3_10_0 - - title: 3.9.0 - anchor: version_3_9_0 - - title: 3.8.0 - anchor: version_3_8_0 - - title: 3.7.0 - anchor: version_3_7_0 - - title: 3.6.0 - anchor: version_3_6_0 - - title: 3.5.0 - anchor: version_3_5_0 - - title: 3.4.0 - anchor: version_3_4_0 - - title: 3.3.0 - anchor: version_3_3_0 - - title: 3.2.0 - anchor: version_3_2_0 - - title: 3.1.0 - anchor: version_3_1_0 - - title: 3.0 - anchor: version_3_0_0 \ No newline at end of file diff --git a/language-server-protocol/_data/specifications.yml b/language-server-protocol/_data/specifications.yml deleted file mode 100644 index bb88088e3..000000000 --- a/language-server-protocol/_data/specifications.yml +++ /dev/null @@ -1,19 +0,0 @@ -- title: LSP - anchor: lsp - children: - - title: 3.17 (Current) - version: 3.17 - url: /specifications/lsp/3.17/specification - - title: 3.18 (Upcoming) - version: 3.18 - url: /specifications/lsp/3.18/specification - - title: 3.16 (Previous) - version: 3.16 - url: /specifications/specification-3-16 -- title: LSIF - anchor: lsif - children: - - title: 0.6.0 (Current) - url: /specifications/lsif/0.6.0/specification - - title: 0.5.0 (Previous) - url: /specifications/lsif/0.5.0/specification diff --git a/language-server-protocol/_implementors/sdks.md b/language-server-protocol/_implementors/sdks.md deleted file mode 100644 index dc2ffc1d1..000000000 --- a/language-server-protocol/_implementors/sdks.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -layout: implementors -title: "SDKs for the LSP" -shortTitle: "SDKs" -author: Microsoft -index: 3 ---- - -*If you are missing a SDK please create a pull request in GitHub against this markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_implementors/sdks.md)* - -| Language | Maintainer | Repository | -|------|--------|----------| -| C# | [Inomata Kentaro](https://github.com/matarillo/) | [LanguageServerProtocol](https://github.com/matarillo/LanguageServerProtocol)| -| C# | [OmniSharp](http://www.omnisharp.net/) | [C#-LSP](https://github.com/OmniSharp/csharp-language-server-protocol)| -| C# | MS | work in progress by [David Wilson](https://github.com/daviwil) | -| C# | [Ken Domino](https://github.com/kaby76) | [LspTypes for C#](https://github.com/kaby76/lsp-types) | -| C++ | [Kuafu](https://github.com/kuafuwang) | [LspCpp](https://github.com/kuafuwang/LspCpp)| -| C++17 | [otreblan](https://github.com/otreblan) | [libclsp](https://github.com/otreblan/libclsp) (WIP)| -| Haskell | [Alan Zimmerman](https://github.com/alanz) | [Haskell-LSP](https://github.com/alanz/haskell-lsp)| -| Haskell | [Luke Lau](https://github.com/Bubba) | [lsp-test](https://github.com/Bubba/lsp-test)| -| Haxe | @nadako | [language-server-protocol-haxe](https://github.com/vshaxe/language-server-protocol-haxe)| -| Java | [Eclipse LSP4J committers](https://projects.eclipse.org/projects/technology.lsp4j/who) | [lsp4j](https://github.com/eclipse/lsp4j) | -| Java | [lxtk.org](https://github.com/lxtk-org) | [LXTK](https://github.com/lxtk-org/lxtk) | -| Java | [Eclipse Xtext committers](https://projects.eclipse.org/projects/modeling.tmf.xtext/who) | [xtext-core](https://github.com/eclipse/xtext-core) | -| node.js | MS | [vscode-languageserver-node](https://github.com/Microsoft/vscode-languageserver-node) | -| Objective-C | [Christopher Atlan](https://twitter.com/catlan) | [LSPKit](https://github.com/catlan/LSPKit)| -| PHP | [Felix Becker](https://github.com/felixfbecker) | [php-language-server](https://github.com/felixfbecker/php-language-server)| -| Python | [Open Law Library](http://www.openlawlib.org/) | [pygls](https://github.com/openlawlibrary/pygls)| -| Python | [Yeger](https://github.com/yeger00) | [pylspclient](https://github.com/yeger00/pylspclient)| -| Rust | [Bruno Medeiros](https://github.com/bruno-medeiros) | [RustLSP](https://github.com/RustDT/RustLSP)| -| Rust | Bruno Medeiros and Markus Westerlind | [lsp-types](https://github.com/gluon-lang/lsp-types) -| Rust | [Eyal Kalderon](https://github.com/ebkalderon) | [tower-lsp](https://github.com/ebkalderon/tower-lsp) -| Swift | [Chime](https://github.com/chimehq) | [LanguageServerProtocol](https://github.com/chimehq/LanguageServerProtocol)| -| TypeScript | [TypeFox](https://www.typefox.io/) | [langium](https://github.com/langium/langium)| -| Go | [TobiasYin](https://github.com/TobiasYin/) | [go-lsp](https://github.com/TobiasYin/go-lsp/)| -{: .table .table-bordered .table-responsive} diff --git a/language-server-protocol/_implementors/servers.md b/language-server-protocol/_implementors/servers.md deleted file mode 100644 index c18707554..000000000 --- a/language-server-protocol/_implementors/servers.md +++ /dev/null @@ -1,215 +0,0 @@ ---- -layout: implementors -title: "Language Servers" -shortTitle: "Language Servers" -author: Microsoft -index: 1 ---- - -*If you are missing a server please create a pull request in GitHub against this markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_implementors/servers.md)* - - -| Language | Maintainer | Repository | Implementation Language | -|------|--------|----------|---------------| -| 1C Enterprise | [Contributors](https://github.com/1c-syntax/bsl-language-server/graphs/contributors) | [BSL Language Server](https://github.com/1c-syntax/bsl-language-server) | Java | -| ActionScript 2.0 | [Adam Vernon](https://github.com/admvx) | [AS2 Language Support](https://github.com/admvx/as2-language-support) | TypeScript | -| Ada/SPARK | AdaCore | [ada_language_server](https://github.com/AdaCore/ada_language_server) | Ada | -| [AML](https://a.ml/) | [AML](https://a.ml/) | [AML Language Server](https://github.com/aml-org/als) | ScalaJS | -| [Ansible](https://docs.ansible.com/ansible/latest/) | [Ansible](https://www.ansible.com/) | [Ansible Language Server](https://github.com/ansible/ansible-language-server) | TypeScript | -| Angular | [Angular team](https://github.com/angular/angular) & [ivanwonder](https://github.com/ivanwonder) | [Angular Language Server](https://github.com/angular/vscode-ng-language-service/tree/main/server) | TypeScript | -| Antlr | [Ken Domino](https://github.com/kaby76) | [Antlrvsix](https://github.com/kaby76/AntlrVSIX) | C# | -| [API Elements](http://api-elements.readthedocs.io/en/latest/) | [Vincenzo Chianese(@XVincentX)](https://github.com/XVincentX) | [vscode-apielements](https://github.com/XVincentX/vscode-apielements) | TypeScript | -| Apache Camel | [Contributors](https://github.com/camel-tooling/camel-language-server/graphs/contributors) | [Apache Camel Language Server](https://github.com/camel-tooling/camel-language-server) | Java | -| Apex | Salesforce | [VS Code Apex extension](https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode-apex) | TypeScript | -| IBM High Level **Assembler** | [Broadcom](https://www.broadcom.com/) | [HLASM Language Support](https://github.com/eclipse/che-che4z-lsp-for-hlasm) | C++ | -| [IBM High Level **Assembler**](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.e0zc100/hlasm.htm) | IBM | [IBM Z Open Editor VS Code extension](https://marketplace.visualstudio.com/items?itemName=IBM.zopeneditor) | Java | -| [AsyncAPI](https://www.asyncapi.com/) | [AML](https://a.ml/) | [AML Language Server](https://github.com/aml-org/als) | ScalaJS | -| AWK | [Stanislav Chernov](https://github.com/Beaglefoot) | [AWK Language Server](https://github.com/Beaglefoot/awk-language-server) | TypeScript | -| [Ballerina](https://ballerina.io/) | [Ballerina.io](https://ballerina.io/) | [Ballerina Language Server](https://github.com/ballerina-platform/ballerina-lang/tree/master/language-server) | Java | -| Bash | [Mads Hartmann](https://github.com/mads-hartmann/) | [Bash Language Server](https://github.com/mads-hartmann/bash-language-server) | TypeScript | -| [Bicep](https://github.com/azure/bicep) | MS | [Bicep](https://github.com/azure/bicep) | C# | -| BrightScript/BrighterScript | [RokuCommunity](https://github.com/RokuCommunity) | [brighterscript](https://github.com/rokucommunity/brighterscript) | TypeScript | -| C# | [OmniSharp](http://www.omnisharp.net/) | [omnisharp-roslyn](https://github.com/OmniSharp/omnisharp-roslyn) | C# | -| C# | [Saulius Menkevičius](https://github.com/razzmatazz) | [csharp-ls](https://github.com/razzmatazz/csharp-language-server) | F# | -| C++ | MS | [VS Code C++ extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) | C++ | -| [C++/clang](https://clangd.llvm.org/)| [LLVM Project](https://llvm.org/) | [clangd](https://github.com/llvm/llvm-project/tree/main/clang-tools-extra/clangd) | C++ | -| C/C++/Objective-C | [Jacob Dufault](https://github.com/jacobdufault), [MaskRay](https://github.com/MaskRay), [topisani](https://github.com/topisani) | [cquery](https://github.com/jacobdufault/cquery) | C++ | -| C/C++/Objective-C | [MaskRay](https://github.com/MaskRay) | [ccls](https://github.com/MaskRay/ccls) | C++ | -| CSS/LESS/SASS | MS | [vscode-css-languageserver](https://github.com/Microsoft/vscode/tree/master/extensions/css-language-features/server) | TypeScript | -| [Ceylon](https://ceylon-lang.org/) | [John Vasileff](https://github.com/jvasileff) | [vscode-ceylon](https://github.com/jvasileff/vscode-ceylon) | Ceylon | -| [Clarity](https://docs.stacks.co/docs/write-smart-contracts/) | [Hiro](https://hiro.so) | [clarity-lsp](https://github.com/hirosystems/clarity-lsp) | TypeScript | -| [Clojure](https://clojure.org/) | [Case Nelson](https://github.com/snoe) | [clojure-lsp](https://github.com/snoe/clojure-lsp) | Clojure | -| [CMake](https://cmake.org/) | [regen100](https://github.com/regen100) | [cmake-language-server](https://github.com/regen100/cmake-language-server) | Python | -| [Coq](https://coq.inria.fr/) | [ejgallego](https://github.com/ejgallego) | [coq-lsp](https://github.com/ejgallego/coq-lsp) | OCaml | -| IBM Enterprise **COBOL** for z/OS | [Broadcom](https://www.broadcom.com/) | [COBOL Language Support](https://github.com/eclipse/che-che4z-lsp-for-cobol) | Java | -| [IBM Enterprise **COBOL** for z/OS](https://www.ibm.com/support/knowledgecenter/SS6SG3_6.3.0/welcome.html) | IBM | [IBM Z Open Editor VS Code extension](https://marketplace.visualstudio.com/items?itemName=IBM.zopeneditor) | Java | -| [CodeQL](https://securitylab.github.com/tools/codeql) | [GitHub](https://github.com/github/codeql) | [codeql](https://github.com/github/codeql) | Java | -| [CoffeeScript](https://coffeescript.org/) | [phil294](https://github.com/phil294/) | [CoffeeSense](https://github.com/phil294/coffeesense/) | TypeScript -| [CWL](https://www.commonwl.org/) | [Rabix](https://github.com/rabix) | [Benten](https://github.com/rabix/benten) | Python | -| [Crystal](https://crystal-lang.org/)| [Elbaz Julien](https://github.com/elbywan) | [Crystalline](https://github.com/elbywan/crystalline) | Crystal | -| [Crystal](https://crystal-lang.org/)| [Ryan L. Bell](https://github.com/kofno) | [Scry](https://github.com/crystal-lang-tools/scry) | Crystal | -| [Cucumber/Gherkin](https://cucumber.io/)| [Cucumber core team](https://github.com/cucumber) | [Cucumber Language Server](https://github.com/cucumber/language-server) | TypeScript | -| [D](https://dlang.org) | [Jan Jurzitza](https://github.com/WebFreak001) | [serve-d](https://github.com/Pure-D/serve-d) | D | -| [D](https://dlang.org) | [Laurent Tréguier](https://github.com/LaurentTreguier) | [D Language Server](https://github.com/d-language-server/dls) | D | -| Dart | [Dart Team](https://dart.dev/) | [Dart SDK](https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/tool/lsp_spec/README.md) | Dart | -| [Data Pack](https://minecraft.gamepedia.com/Data_Pack) | [SPGoding](https://github.com/SPGoding) | [Data-pack Language Server](https://github.com/SPGoding/datapack-language-server) | TypeScript | -| [Delphi](https://www.embarcadero.com/products/delphi) | [Embarcadero](https://www.embarcadero.com/) | Proprietary ([DelphiLSP](http://docwiki.embarcadero.com/RADStudio/en/Code_Insight_References)) | Delphi and C | -| [DenizenScript](https://denizenscript.com/) | [DenizenScript Team](https://github.com/DenizenScript/) | [DenizenVSCode](https://github.com/DenizenScript/DenizenVSCode) | C# | -| [Deno](https://deno.land) (TypeScript/JavaScript) | [Deno Land](https://github.com/denoland) | [`deno lsp`](https://github.com/denoland/deno/tree/main/cli/lsp) | Rust | -| [Dockerfiles](https://docs.docker.com/engine/reference/builder/)| [Remy Suen](https://github.com/rcjsuen) | [dockerfile-language-server](https://github.com/rcjsuen/dockerfile-language-server-nodejs) | TypeScript | -| [DreamMaker](https://secure.byond.com/) | [SpaceManiac](https://www.platymuus.com) | [DreamMaker Language Server](https://github.com/SpaceManiac/SpacemanDMM/tree/master/src/langserver) | Rust | -| Erlang | [OTP](https://github.com/erlang), [Vlad Dumitrescu](https://github.com/vladdu) | [sourcer](https://github.com/erlang/sourcer) | Erlang | -| [Erlang](https://www.erlang.org) | [Roberto Aloi](https://github.com/robertoaloi) and [Contributors](https://github.com/erlang-ls/erlang_ls/graphs/contributors) | [erlang_ls](https://github.com/erlang-ls/erlang_ls) | Erlang | -| Elixir| [Elixir LSP](https://github.com/elixir-lsp) | [elixir-ls](https://github.com/elixir-lsp/elixir-ls) | Elixir | -| Elm| [Kolja Lampe](https://github.com/razzeee) | [elmLS](https://github.com/elm-tooling/elm-language-server) | Typescript | -| [Ember](https://ember-cli.com/) | [Ember community](https://github.com/emberwatch) | [ember language server](https://github.com/emberwatch/ember-language-server) | TypeScript | -| F# | [@georgewfraser](https://github.com/georgewfraser) | [F# Language Server](https://github.com/georgewfraser/fsharp-language-server) | F# | -| F# | [@Krzysztof-Cieslak](https://github.com/Krzysztof-Cieslak) & Contributors | [FsAutoComplete](https://github.com/fsharp/FsAutoComplete) | F# | -| Fortran | [Chris Hansen](https://github.com/hansec) | [fortran-language-server](https://github.com/hansec/fortran-language-server) | Python | -| [Fortran](https://fortran-lang.org/) | [Giannis Nikiteas](https://github.com/gnikit) | [fortls](https://github.com/gnikit/fortls) | Python | -| [Fuzion](https://flang.dev) | [Tokiwa Software GmbH](https://tokiwa.software) | [Fuzion Language Server](https://github.com/tokiwa-software/fuzion-lsp-server) | Java, Fuzion | -| GLSL | [Sven-Hendrik Haase (@svenstaro)](https://github.com/svenstaro) | [glsl-language-server](https://github.com/svenstaro/glsl-language-server) | C++ | -| GLSL for Minecraft | [@strum355](https://github.com/strum355) | [mcshader-lsp](https://github.com/strum355/mcshader-lsp) | Rust | -| Gauge | [Gauge](https://github.com/getgauge) | [Gauge Language Server](https://github.com/getgauge/gauge/) | Go | -| GDScript | [GodotEngine](https://github.com/godotengine) | [Godot](https://github.com/godotengine/godot) | C++ | -| [Gleam](https://gleam.run/) | [Gleam](https://github.com/gleam-lang/gleam) | [gleam](https://github.com/gleam-lang/gleam) | Rust | -| Gluon | [Gluon](https://github.com/gluon-lang/gluon) | [Gluon Language Server](https://github.com/gluon-lang/gluon_language-server) | Rust | -| Go | [Go Team](https://github.com/golang/tools) | [gopls](https://github.com/golang/tools/tree/master/gopls) | Go | -| Go | [Sourcegraph](https://sourcegraph.com/) | [sourcegraph-go](https://github.com/sourcegraph/go-langserver) | Go | -| [GraphQL](http://graphql.org/) | [GraphQL Foundation](https://foundation.graphql.org/) | [Official GraphQL Language Server](https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-server) | TypeScript | -| [GraphQL](http://graphql.org/) | [Mayank Agarwal (@Mayank1791989)](https://github.com/Mayank1791989) | [GQL Language Server](https://github.com/Mayank1791989/gql-language-server) | JavaScript | -| [Grapviz](https://graphviz.org/)/DOT | [Niklas Mollenhauer](https://github.com/nikeee) | [dot-language-server](https://github.com/nikeee/dot-language-server) | TypeScript | -| [Grain](https://grain-lang.org/) | [Grain Team](https://github.com/grain-lang/grain) | [grain](https://github.com/grain-lang/grain) | ReasonML | -| Groovy | [Palantir](https://github.com/palantir) | [groovy-language-server](https://github.com/palantir/groovy-language-server/) | Java | -| [Groovy](http://groovy-lang.org/) | [Prominic.NET](https://moonshine-ide.com/) | [Groovy Language Server](https://github.com/prominic/groovy-language-server) | Java | -| [Groovy](http://groovy-lang.org/) | [VsCode Groovy Lint](https://marketplace.visualstudio.com/items?itemName=NicolasVuillamy.vscode-groovy-lint) | [VsCode Groovy Lint Language Server](https://github.com/nvuillam/vscode-groovy-lint/tree/master/server) | TypeScript | -| HTML | MS | [vscode-html-languageserver](https://github.com/Microsoft/vscode/tree/master/extensions/html-language-features/server) | TypeScript | -| Haskell| [Alan Zimmerman](https://github.com/alanz) | [Haskell Language Server (HLS)](https://github.com/haskell/haskell-language-server) | Haskell | -| [Haxe](https://haxe.org/) | [Haxe Foundation](https://github.com/HaxeFoundation/) | [Haxe Language Server](https://github.com/vshaxe/haxe-language-server) | Haxe | -| HLSL | [Tim Jones](https://github.com/tgjones) | [HLSL Tools](https://github.com/tgjones/HlslTools/tree/master/src/ShaderTools.LanguageServer) | C# | -| [Isabelle](https://www.cl.cam.ac.uk/research/hvg/Isabelle/) | [Makarius Wenzel](https://github.com/makarius) | [sources](https://isabelle.in.tum.de/repos/isabelle/file/tip/src/Tools/VSCode) | Scala | -| [Idris2](https://github.com/idris-lang/Idris2) | [Idris community](https://github.com/idris-community) | [idris2-lsp](https://github.com/idris-community/idris2-lsp) | Idris2 | -| Java (Eclipse)| Eclipse, [RedHat](http://developers.redhat.com/blog/2016/08/01/a-week-of-hacking-the-java-language-server/) | [Eclipse JDT LS](https://github.com/eclipse/eclipse.jdt.ls/) | Java | -| Java | [@georgewfraser](https://github.com/georgewfraser) | [Java Compiler (javac) API-based Java support](https://github.com/georgewfraser/vscode-javac) | Java | -| JavaScript | [quick-lint-js](https://quick-lint-js.com/) | [quick-lint-js](https://github.com/quick-lint/quick-lint-js) | C++ | -| Javascript Flow| [Facebook, Inc.](https://flow.org/) | [flow](https://github.com/facebook/flow) | OCaml, JavaScript | -| Javascript Flow| [flowtype](https://github.com/flowtype/) | [flow-language-server](https://github.com/flowtype/flow-language-server)(deprecated) | JavaScript, Flow | -| Javascript-Typescript | [Sourcegraph](https://sourcegraph.com/) | [javascript-typescript](https://github.com/sourcegraph/javascript-typescript-langserver) | TypeScript | -| JSON | MS | [vscode-json-languageserver](https://www.npmjs.com/package/vscode-json-languageserver) | TypeScript | -| [Jsonnet](https://jsonnet.org/) | [Grafana Labs](https://grafana.com/) | [jsonnet-language-server](https://github.com/grafana/jsonnet-language-server) | Go | -| [Julia](http://julialang.org/) | [Contributors](https://github.com/JuliaEditorSupport/LanguageServer.jl/graphs/contributors) | [Julia language server](https://github.com/JuliaEditorSupport/LanguageServer.jl) | Julia | -| [Kerboscript (kOS)](https://ksp-kos.github.io/KOS/) | [John Chabot](https://github.com/jonnyboyC) | [kos-language-server](https://github.com/jonnyboyC/kos-language-server) | Typescript -| [Kotlin](https://kotlinlang.org) | [@fwcd](https://github.com/fwcd) | [kotlin-language-server](https://github.com/fwcd/kotlin-language-server) | Kotlin | -| [Language Server Robot](https://github.com/TypeCobolTeam/LanguageServerRobot) | [TypeCobolTeam](https://github.com/TypeCobolTeam) | [TypeCobol Language Server Robot](https://github.com/TypeCobolTeam/LanguageServerRobot/wiki) | C# | -| [LanguageTool](https://languagetool.org/)| [Adam Voss](https://github.com/adamvoss) | [languagetool](https://github.com/adamvoss/languagetool-languageserver) | Java | -| [LanguageTool](https://languagetool.org/)| [Julian Valentin](https://github.com/valentjn) | [ltex-ls](https://github.com/valentjn/ltex-ls) | Java | -| [LaTeX](https://www.latex-project.org/)| [Eric Förster](https://github.com/efoerster) | [texlab](https://github.com/efoerster/texlab) | -| [Lua](http://www.lua.org/)| [Kyle McLamb](https://github.com/Alloyed) | [lua-lsp](https://github.com/Alloyed/lua-lsp) | Lua | -| [Lua](http://www.lua.org/)| [最萌小汐](https://github.com/sumneko) | [lua-language-server](https://github.com/sumneko/lua-language-server) | Lua | -| [Lua](http://www.lua.org/)| [Tencent](https://github.com/Tencent/LuaHelper) | [LuaHelper](https://github.com/Tencent/LuaHelper) | Go | -| [Liquid](https://shopify.github.io/liquid/) | [Shopify](https://github.com/Shopify/theme-check) | [theme-check](https://github.com/Shopify/theme-check) | Ruby | -| [IBM **LALR** Parser Generator language](https://sourceforge.net/projects/lpg/)| [kuafuwang](https://github.com/kuafuwang) | [LPG-language-server](https://github.com/kuafuwang/LPG-language-server) | C++ | -| [Markdown](https://commonmark.org) | MS | [vscode-markdown-languageserver](https://github.com/microsoft/vscode/tree/main/extensions/markdown-language-features/server) | TypeScript | -| Motorola 68000 Assembly | [Graham Bates](https://github.com/grahambates) | [m68k-lsp](https://github.com/grahambates/m68k-lsp) | TypeScript | -| [MSBuild](https://github.com/Microsoft/msbuild) | [Adam Friedman](https://github.com/tintoy) | [msbuild-project-tools-vscode](https://github.com/tintoy/msbuild-project-tools-vscode) | TypeScript | -| Nim | [Peter Munch-Ellingsen](https://github.com/PMunch) | [nimlsp](https://github.com/PMunch/nimlsp) | Nim | -| OCaml/Reason | [freebroccolo](https://github.com/freebroccolo) | [ocaml-language-server](https://github.com/freebroccolo/ocaml-language-server) | TypeScript | -| OCaml/Reason | [OCaml Labs](http://ocamllabs.io) | [ocamllsp](https://github.com/ocaml/ocaml-lsp) | OCaml | -| [OpenAPI](https://www.openapis.org/) | [AML](https://a.ml/) | [AML Language Server](https://github.com/aml-org/als) | ScalaJS | -| [openVALIDATION](http://openvalidation.io/) | [openVALIDATION](https://github.com/openvalidation) | [ov-language-server](https://github.com/openvalidation/ov-language-server) | TypeScript -| [Papyrus](https://www.creationkit.com/fallout4/index.php?title=Category:Papyrus) | [Joel Day](https://github.com/joelday) | [papyrus-lang](https://github.com/joelday/papyrus-lang) | C# | -| Perl | GRICHTER | [Perl::LanguageServer](https://metacpan.org/pod/Perl::LanguageServer) | Perl | -| Perl | [Marc Reisner](https://github.com/FractalBoy) | [PLS](https://github.com/FractalBoy/perl-language-server)| Perl | -| Perl | [Brian Scannell](https://github.com/bscan) | [Perl Navigator](https://github.com/bscan/PerlNavigator)| Perl | -| Crane **PHP** | [HvyIndustries](https://github.com/HvyIndustries) | [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=HvyIndustries.crane) | TypeScript | -| PHP | [Ben Mewburn](https://github.com/bmewburn) | [intelephense](https://github.com/bmewburn/vscode-intelephense) | TypeScript | -| PHP | [Felix Becker](https://github.com/felixfbecker) | [php-language-server](https://github.com/felixfbecker/php-language-server) | PHP | -| PHP | [Tom Gerrits](https://gitlab.com/Gert-dev) | [Serenata](https://gitlab.com/Serenata/Serenata) | PHP | -| PHP | [Tyson Andre](https://github.com/TysonAndre) | [Phan](https://github.com/phan/phan) | PHP | -| PHPUnit | [Recca0120](https://github.com/recca0120) | [phpunit-language-server](https://github.com/recca0120/vscode-phpunit) | TypeScript | -| [IBM Enterprise **PL/I** for z/OS](https://www.ibm.com/support/knowledgecenter/SSY2V3_5.3.0/com.ibm.ent.pl1.zos.doc/single_template_nobrand.html) | IBM | [IBM Z Open Editor VS Code extension](https://marketplace.visualstudio.com/items?itemName=IBM.zopeneditor) | Java | -| [Polymer](https://www.polymer-project.org) | [Polymer Team](https://github.com/Polymer) | [polymer-editor-service](https://github.com/Polymer/polymer-editor-service) | TypeScript | -| PowerPC Assembly | [Noah Fields](https://github.com/OGoodness) | [PowerPC Support](https://github.com/OGoodness/VSCode-PowerPC-Syntax) | TypeScript | -| PowerShell | MS | [PowerShell Editor Services](https://github.com/PowerShell/PowerShellEditorServices) | C# | -| [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) | [Tobias Guggenmos](https://github.com/slrtbtfs) | [promql-langserver](https://github.com/prometheus-community/promql-langserver) | [Go](https://golang.org/) | -| PureScript | [Nicholas Wolverson](https://github.com/nwolverson) | [purescript-language-server](https://github.com/nwolverson/purescript-language-server) | PureScript | -| Puppet| [Lingua Pupuli](https://github.com/lingua-pupuli) | [puppet language server](https://github.com/lingua-pupuli/puppet-editor-services) | Ruby | -| Python| [Fabio Zadrozny](https://github.com/fabioz/) | [PyDev on VSCode](http://www.pydev.org/vscode/index.html) | Java, Python | -| Python| [Palantir Technologies](https://github.com/palantir) | [python-language-server](https://github.com/palantir/python-language-server) (unmaintained, use python-lsp-server instead) | Python | -| Python| [Spyder IDE team and the community](https://github.com/python-lsp) | [python-lsp-server](https://github.com/python-lsp/python-lsp-server) | Python | -| Python | MS | [python-language-server](https://github.com/Microsoft/python-language-server) | C# | -| [Pony](https://www.ponylang.io/) | [Mahan Bakhshi](https://github.com/MahanBi) | [PonyLS](https://github.com/MahanBi/PonyLS) | Pony | -| Q# | [MS](https://github.com/microsoft/qsharp-compiler/graphs/contributors) | [Q# Language Server](https://github.com/microsoft/qsharp-compiler) | C# | -| QML | [Qt](https://www.qt.io/) | [qmlls](https://github.com/qt/qtdeclarative/tree/dev/tools/qmlls) | C++ | -| R | [REditorSupport](https://github.com/REditorSupport) | [R language server](https://github.com/REditorSupport/languageserver) | R | -| Racket | [Jay McCarthy](https://github.com/jeapostrophe) | [racket-langserver](https://github.com/jeapostrophe/racket-langserver) | Racket | -| Raku | [Brian Scannell](https://github.com/bscan) | [Raku Navigator](https://github.com/bscan/RakuNavigator) | TypeScript | -| RAML | [RAML Workgroup](http://raml.org/about/workgroup) | [raml-language-server](https://github.com/raml-org/raml-language-server) Work in Progress | | -| [RAML](https://raml.org/) | [AML](https://a.ml/) | [AML Language Server](https://github.com/aml-org/als) | ScalaJS | -| ReasonML| [Jared Forsyth](https://github.com/jaredly) | [reason-language-server](https://github.com/jaredly/reason-language-server) | OCaml | -| Red | [bitbegin](https://github.com/bitbegin) | [redlangserver](https://github.com/bitbegin/redlangserver) | Red | -| [REL](https://github.com/sscit/rel) | [Stefan Schlichthärle](https://www.github.com/sscit) | [rel-ls](https://github.com/sscit/rel) | C++ | -| [ReScript](https://rescript-lang.org) | [rescript-lang](https://github.com/rescript-lang) | [rescript-vscode](https://github.com/rescript-lang/rescript-vscode) | TypeScript | -| [IBM TSO/E **REXX**](https://www.ibm.com/docs/en/zos/2.4.0?topic=tsoe-zos-rexx-reference) | IBM | [IBM Z Open Editor VS Code extension](https://marketplace.visualstudio.com/items?itemName=IBM.zopeneditor) | Java | -| [Robot Framework](https://robotframework.org/) | [Daniel Biehl](https://github.com/d-biehl) | [RobotCode](https://github.com/d-biehl/robotcode) | Python | -| [Robot Framework](https://robotframework.org/) | [Tomi Turtiainen](https://github.com/tomi) | [VSCode RF language server](https://github.com/tomi/vscode-rf-language-server) | TypeScript | -| [Robot Framework](https://robotframework.org) | [Robocorp](https://robocorp.com) | [robotframework-lsp](https://github.com/robocorp/robotframework-lsp) | Python | -| Ruby | [Fred Snyder](https://github.com/castwide) | [solargraph](https://github.com/castwide/solargraph) | Ruby | -| Ruby | [Fumiaki MATSUSHIMA](https://github.com/mtsmfm) | [language_server-ruby](https://github.com/mtsmfm/language_server-ruby) | Ruby | -| Ruby | [Stripe](https://stripe.com) | [sorbet](https://github.com/sorbet/sorbet) | C++ | -| Ruby | [Rafał Łasocha](https://github.com/swistak35) | [orbacle](https://github.com/swistak35/orbacle) | Ruby | -| [Ruby](https://www.ruby-lang.org/en/) | [Kurt Werle](https://github.com/kwerle/) | [ruby_language_server](https://github.com/kwerle/ruby_language_server) | Ruby | -| Ruby | [Shopify](https://github.com/Shopify) | [Ruby LSP](https://github.com/Shopify/ruby-lsp) | Ruby | -| Rust | [Jonathan Turner](https://github.com/jonathandturner) | [Rust Language Server](https://github.com/rust-lang-nursery/rls) | Rust | -| Rust | [Aleksey Kladov](https://github.com/matklad) | [Rust Analyzer](https://github.com/rust-analyzer/rust-analyzer) | Rust | -| Scala | [Iulian Dragos](https://github.com/dragos) | [dragos-vscode-scala](https://github.com/dragos/dragos-vscode-scala) | Scala | -| Scala | [Scalameta](https://github.com/scalameta) | [Metals](https://github.com/scalameta/metals) | Scala | -| Scheme| [ufo5260987423](https://github.com/ufo5260987423) | [scheme-langserver](https://github.com/ufo5260987423/scheme-langserver) | Chez Scheme| -| [Slint](https://slint-ui.com) | Slint | [slint-lsp](https://github.com/slint-ui/slint/tree/HEAD/tools/lsp) | Rust | -| [Smalltalk/Pharo](https://pharo.org/) | [Benoît Verhaeghe](https://github.com/badetitou) | [Pharo Language Server](https://github.com/badetitou/Pharo-LanguageServer) | Pharo | -| Snyk | [Snyk](https://snyk.io) | [Snyk Language Server](https://github.com/snyk/snyk-ls) | Snyk SCA / SAST / IaC findings | -| SPARQL | [Stardog Union](https://github.com/stardog-union) | [SPARQL Language Server](https://github.com/stardog-union/stardog-language-servers/tree/master/packages/sparql-language-server) | TypeScript | -| SQL | [Toshikazu Ohashi](https://github.com/lighttiger2505) | [sqls](https://github.com/lighttiger2505/sqls) | Go | -| Standard ML | [azdavis](https://azdavis.net) | [Millet](https://github.com/azdavis/millet) | Rust | -| Stylable | [Wix.com](https://www.wix.com) | [stylable/language-service](https://github.com/wix/stylable/tree/master/packages/language-service) | TypeScript | -| Svelte | [UnwrittenFun](https://github.com/UnwrittenFun) | [svelte-language-server](https://github.com/UnwrittenFun/svelte-language-server) | TypeScript | -| Swift | [Apple](https://github.com/apple) | [SourceKit-LSP](https://github.com/apple/sourcekit-lsp) | Swift | -| Sysl | [ANZ Bank](https://github.com/anz-bank) | [Sysl LSP](https://github.com/anz-bank/sysl) | Go | -| SystemVerilog | [dalance](https://github.com/dalance) | [svls](https://github.com/dalance/svls) | Rust | -| SystemVerilog | [Sigasi](https://www.sigasi.com) | Proprietary ([Sigasi](https://insights.sigasi.com/vscode/)) | Java | -| T-SQL | MS | [VS Code SQL extension](https://github.com/Microsoft/vscode-mssql/tree/dev/src/languageservice ) | TypeScript, Binary | -| [Tads3](http://www.tads.org/tads3.htm) | [Tomas Öberg](https://github.com/toerob) | [tads3tools](https://github.com/toerob/vscode-tads3tools) | Tads3 | -| [Terraform](https://www.terraform.io/) | [Julio Tain Sueiras](https://github.com/juliosueiras) | [terraform-lsp](https://github.com/juliosueiras/terraform-lsp) | Go | -| [Terraform](https://www.terraform.io/) | [HashiCorp](https://github.com/hashicorp) | [terraform-ls](https://github.com/hashicorp/terraform-ls) | Go | -| [Tibbo Basic](https://docs.tibbo.com/taiko/) | [Tibbo](https://tibbo.com) | [tibbo-basic](https://github.com/tibbotech/tibbo-basic) | Tibbo Basic | -| [Trino SQL](https://trino.io) | [Rocket Boosters](https://gitlab.com/rocket-boosters) | [trinols](https://gitlab.com/rocket-boosters/trinols) | TypeScript | -| [TTCN-3](http://www.ttcn-3.org) | [Nokia](https://www.nokia.com) | [ntt](https://github.com/nokia/ntt) | Go | -| Turtle | [Stardog Union](https://github.com/stardog-union) | [Turtle Language Server](https://github.com/stardog-union/stardog-language-servers/tree/master/packages/turtle-language-server) | TypeScript | -| TypeCobol| [TypeCobol](https://github.com/TypeCobolTeam) | [TypeCobol language server](https://github.com/TypeCobolTeam/TypeCobol/tree/master/TypeCobol.LanguageServer) | C# | -| TypeScript|[TypeFox](http://typefox.io/)| [typescript-language-server](https://github.com/theia-ide/typescript-language-server) | TypeScript | -| Vala | [Ben Iofel](https://github.com/benwaffle), [Princeton Ferro](https://github.com/Prince781) | [vala-language-server](https://github.com/benwaffle/vala-language-server) | Vala | -| VDM-SL, VDM++, VDM-RT | [Nick Battle](https://github.com/nickbattle)| [VDMJ-LSP](https://github.com/nickbattle/vdmj/tree/master/lsp) | Java | -| [Veryl](https://github.com/dalance/veryl) | [dalance](https://github.com/dalance) | [Veryl Language Server](https://github.com/dalance/veryl/tree/master/crates/languageserver) | Rust | -| VHDL | [Olof Kraigher](https://github.com/kraigher) | [vhdl_ls](https://github.com/kraigher/rust_hdl) | Rust | -| VHDL | [Sigasi](https://www.sigasi.com) | Proprietary ([Sigasi](https://insights.sigasi.com/vscode/)) | Java | -| VHDL | [ViDE-Software](https://www.vide-software.at) | Proprietary ([VHDL for Professionals](https://marketplace.visualstudio.com/items?itemName=ViDE-Software.v4pvhdlforprofessionals)) | C# | -| Viml | [iamcco](https://github.com/iamcco) | [vim-language-server](https://github.com/iamcco/vim-language-server) | Typescript | -| Visualforce | Salesforce | [VS Code Visualforce extension](https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode-visualforce) | | -| Vue| [Pine Wu](https://github.com/octref) & [@HerringtonDarkholme](https://github.com/HerringtonDarkholme) | [vuejs/vetur](https://github.com/vuejs/vetur) | TypeScript | -| [WebAssembly](https://webassembly.org/) | [Darin Morrison](https://github.com/darinmorrison) | [wasm-language-server](https://github.com/wasm-lsp/wasm-language-server) | Rust | -| [WebGPU Shading Language](https://gpuweb.github.io/gpuweb/wgsl/) | [WGSL-Analyzer Team](https://github.com/wgsl-analyzer) | [wgsl-analyzer](https://github.com/wgsl-analyzer/wgsl-analyzer) | Rust | -| [Wolfram Language](https://www.wolfram.com/language/) ([Mathematica](https://www.wolfram.com/mathematica)) | [kenkangxgwe](https://github.com/kenkangxgwe) | [lsp-wl](https://github.com/kenkangxgwe/lsp-wl) | Wolfram Language | -| [Wolfram Language](https://www.wolfram.com) | [Wolfram Research](https://github.com/WolframResearch) | [LSPServer](https://github.com/WolframResearch/lspserver) | Wolfram Language | -| WXML| [Qiming Zhao](https://github.com/chemzqm)| [wxml-languageserver](https://github.com/chemzqm/wxml-languageserver) | TypeScript | -| XML | IBM | [XML Language Server](https://github.com/microclimate-devops/xml-language-server) | Java | -| XML | [Red Hat Developers](https://github.com/redhat-developer) and [Angelo ZERR](https://github.com/angelozerr/) | [XML Language Server (LemMinX)](https://github.com/eclipse/lemminx) | Java | -| [Mini**YAML**](https://github.com/OpenRA/MiniYAML.tmbundle) | [Pavel Penev](https://github.com/penev92) | [ORAIDE](https://github.com/penev92/Oraide.LanguageServer) | C# | -| YAML (with JSON schemas)| [Adam Voss](https://github.com/adamvoss) | [vscode-yaml-languageservice](https://github.com/adamvoss/vscode-yaml-languageservice) | TypeScript | -| YAML| [Red Hat Developers](https://github.com/redhat-developer) | [yaml-language-server](https://github.com/redhat-developer/yaml-language-server) | TypeScript | -| [YARA](https://github.com/virusTotal/yara) | [Avast](https://github.com/avast) | [YARA Language Server](https://github.com/avast/yls) | Python | -| [YANG](https://tools.ietf.org/html/rfc7950)| [Yang tools](https://github.com/yang-tools) | [yang-lsp](https://github.com/yang-tools/yang-lsp) | XTend | -| Zig | [zigtools](https://github.com/zigtools) | [zls](https://github.com/zigtools/zls) | [Zig](https://ziglang.org) | -| * | [mattn](https://github.com/mattn) | [efm-langserver](https://github.com/mattn/efm-langserver) | [Go](https://golang.org/) | -| * | [iamcco](https://github.com/iamcco) | [diagnostic-languageserver](https://github.com/iamcco/diagnostic-languageserver) | TypeScript | -| * | [daquexian](https://github.com/daquexian) | [tagls](https://github.com/daquexian/tagls) | Python | -{: .table .table-bordered .table-responsive} diff --git a/language-server-protocol/_implementors/tools.md b/language-server-protocol/_implementors/tools.md deleted file mode 100644 index 1dd1de437..000000000 --- a/language-server-protocol/_implementors/tools.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -layout: implementors -title: "Tools supporting the LSP" -shortTitle: "Supporting Tools" -author: Microsoft -index: 2 ---- - -*If you are missing a development tool please create a pull request in GitHub against this markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_implementors/tools.md)* - -| Editor/IDE | Maintainer | Repository | -|------|--------|----------| -| [Acme](https://en.wikipedia.org/wiki/Acme_(text_editor)) | [Fazlul Shahriar](https://github.com/fhs) | [acme-lsp](https://github.com/fhs/acme-lsp) | -| [Atom](https://atom.io/) | [GitHub](https://github.com/) | [atom-languageclient](https://www.npmjs.com/package/atom-languageclient) | -| [BBEdit](https://www.barebones.com/products/bbedit) | [Bare Bones Software, Inc.](https://www.barebones.com/) | Proprietary | -| [Brackets](http://brackets.io) | [Adobe](https://github.com/adobe) | [brackets](https://github.com/adobe/brackets) | -| [Coginiti Pro](https://www.coginiti.co/products/coginiti-pro/) | [Coginiti](https://www.coginiti.co) | | -| [Coginiti Premium](https://www.coginiti.co/products/coginiti-premium/) | [Coginiti](https://www.coginiti.co) | | -| [Cloud Studio](https://studio.dev.tencent.com/) | CODING | | -| [CodeLite](https://codelite.org/) | [Eran Ifrah](https://github.com/eranif) | https://github.com/eranif/codelite | -| [CodeMirror](https://codemirror.net/6/) | [Furqan Software](https://github.com/furqansoftware) | [codemirror-languageserver](https://github.com/furqansoftware/codemirror-languageserver) | -| [Eclipse Che](https://www.eclipse.org/che/) | Eclipse,Codenvy/TypeFox | [Che](https://github.com/eclipse/che/issues/1287) | -| Eclipse IDE | Eclipse,Red Hat | [Eclipse community](https://projects.eclipse.org/projects/technology.lsp4e/who), [Eclipse LSP4E](https://projects.eclipse.org/projects/technology.lsp4e) | -| Emacs | [Vibhav Pant](https://github.com/vibhavp) | [emacs language server client](https://github.com/emacs-lsp/lsp-mode/) | -| Emacs | [João Távora](https://github.com/joaotavora) | [Eglot](https://github.com/joaotavora/eglot) | -| Emacs | [Andy Stewart](https://github.com/manateelazycat/) | [lsp-bridge](https://github.com/manateelazycat/lsp-bridge/) | -| [GNOME Builder](https://wiki.gnome.org/Apps/Builder) | [gnome.org](https://wiki.gnome.org/Apps/Builder/) | [language server client](https://git.gnome.org/browse/gnome-builder/tree/src/libide/lsp) | -| [Helix Editor](https://helix-editor.com/) | [Blaž Hrastnik](https://github.com/archseer) | [helix](https://github.com/helix-editor/helix) | -| [JCIDE](https://www.javacardos.com/tools) | [Javacardos](https://www.javacardos.com) | [JCIDE](https://www.javacardos.com/javacardforum/viewtopic.php?f=5&t=2108&p=6175#p6175) | -| [JupyterLab](https://github.com/jupyterlab/jupyterlab) | [krassowski](https://github.com/krassowski) | [jupyterlab-lsp](https://github.com/jupyter-lsp/jupyterlab-lsp) | -| [Kakoune](http://kakoune.org/) | [ul](https://github.com/ul) | [kak-lsp](https://github.com/ul/kak-lsp) | -| [Kate](https://kate-editor.org) | [Kate Team](https://kate-editor.org) | [kate](https://invent.kde.org/kde/kate) | -| [Lite XL](https://lite-xl.com) | [Lite XL Team](https://lite-xl.com) | [LSP Plugin](https://github.com/lite-xl/lite-xl-lsp) | -| [Moonshine IDE](https://moonshine-ide.com) | [Prominic.NET](https://github.com/prominic) | [Moonshine-IDE](https://github.com/prominic/Moonshine-IDE) | -| [MS Monaco Editor](https://github.com/Microsoft/monaco-editor) | [TypeFox](https://github.com/TypeFox) | [monaco-languageclient](https://www.npmjs.com/package/monaco-languageclient) | -| [MS Paint IDE](https://ms-paint-i.de/) | [RubbaBoy](https://github.com/RubbaBoy) | [MS Paint IDE](https://github.com/MSPaintIDE/MSPaintIDE) | -| [Multiple editors](https://github.com/Valloric/ycmd#known-ycmd-clients) | Ycmd team | [ycmd](https://github.com/Valloric/ycmd) | -| [Neovim](https://neovim.io/) | [Neovim Team](https://github.com/neovim) | [native support since 0.5](https://neovim.io/doc/lsp/) | -| [Nova](https://nova.app) | [Panic Inc](http://panic.com) | Proprietary | -| [Oni](https://www.onivim.io) | [@oni_vim](https://twitter.com/oni_vim) | [Oni's Features](https://www.onivim.io/Features) | -| [OpenSumi](https://opensumi.com) | [opensumi](https://github.com/opensumi) | [opensumi](https://github.com/opensumi/core) | -| [Qt Creator](https://doc-snapshots.qt.io/qtcreator-9.0/creator-language-servers.html) | [The Qt Company](http://qt.io/) | [qtcreator](https://github.com/qt-creator/qt-creator) -| [RAD Studio](https://www.embarcadero.com/products/rad-studio) ([Delphi](https://www.embarcadero.com/products/delphi) and [C++Builder](https://www.embarcadero.com/products/cbuilder)) | [Embarcadero](https://www.embarcadero.com/) | Proprietary | -| [RJ TextEd](https://www.rj-texted.se/) | [Rickard Johansson](https://github.com/rickard67) | [lsp](https://github.com/rickard67/LSP-Pascal-Library) | -| [Spyder](http://spyder-ide.org) | [Spyder Dev Team](https://github.com/spyder-ide) | [spyder](https://github.com/spyder-ide/spyder) | -| [Sublime Text](https://www.sublimetext.com/) | [Raoul Wols](https://github.com/rwols) | [lsp](https://github.com/sublimelsp/LSP) | -| [Theia](https://github.com/theia-ide/theia) | [theia-ide](https://github.com/theia-ide) | [theia](https://github.com/theia-ide/theia) | -| vim8 and [neovim](https://neovim.io/) | [Junfeng Li](https://github.com/autozimu) | [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim) | -| vim8 and neovim | [Prabir Shrestha](https://github.com/prabirshrestha) | [vim-lsp](https://github.com/prabirshrestha/vim-lsp) | -| vim8 and neovim | [Qiming Zhao](https://github.com/chemzqm) | [coc.nvim](https://github.com/neoclide/coc.nvim) | -| vim8 and neovim | [Jayli](https://github.com/Jayli) | [vim-easycomplete](https://github.com/jayli/vim-easycomplete) | -| vim8 and neovim| [Jimmy Huang](https://github.com/JimmyHuang454) | [EasyCompleteYou](https://github.com/JimmyHuang454/EasyCompleteYou) | -| vim8 and neovim| [Nate Bosch](https://github.com/natebosch) | [vim-lsc](https://github.com/natebosch/vim-lsc) | -| vim8 and neovim| [w0rp](https://github.com/w0rp) | [ALE (Asynchronous Lint Engine) ](https://github.com/w0rp/ale) | -| vim9 | [Yegappan Lakshmanan](https://github.com/yegappan) | [Vim9 LSP plugin](https://github.com/yegappan/lsp) | -| Visual Studio | [Adam Friedman](https://github.com/tintoy) | [LSP client in Visual Studio](https://github.com/tintoy/dotnet-language-client/tree/sample/visual-studio/samples/VisualStudioExtension) | -| Visual Studio | Microsoft | [LSP Preview](https://marketplace.visualstudio.com/items?itemName=vsext.LanguageServerClientPreview) | -| [Visual Studio Code](https://code.visualstudio.com) | Microsoft | [vscode](https://github.com/Microsoft/vscode/) | -{: .table .table-bordered .table-responsive} diff --git a/language-server-protocol/_includes/cookie_notice.html b/language-server-protocol/_includes/cookie_notice.html deleted file mode 100644 index aaa2f586a..000000000 --- a/language-server-protocol/_includes/cookie_notice.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/language-server-protocol/_includes/footer.html b/language-server-protocol/_includes/footer.html deleted file mode 100644 index eb6dcbdc6..000000000 --- a/language-server-protocol/_includes/footer.html +++ /dev/null @@ -1,46 +0,0 @@ - diff --git a/language-server-protocol/_includes/head.html b/language-server-protocol/_includes/head.html deleted file mode 100644 index a9c876ec9..000000000 --- a/language-server-protocol/_includes/head.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} - - - - - - - - - - - - diff --git a/language-server-protocol/_includes/js_files.html b/language-server-protocol/_includes/js_files.html deleted file mode 100644 index 07a2a724c..000000000 --- a/language-server-protocol/_includes/js_files.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - -{% comment %} -// Get the current LSP spec base url from the site data -{% endcomment %} -{% for spec in site.data.specifications %} -{% for child in spec.children %} -{% if spec.anchor == 'lsp' and child.version == page.lspVersion %} -{% assign currentSpecification = child.url %} -{% endif %} -{% endfor %} -{% endfor %} - - diff --git a/language-server-protocol/_includes/topnav.html b/language-server-protocol/_includes/topnav.html deleted file mode 100644 index 99bced2af..000000000 --- a/language-server-protocol/_includes/topnav.html +++ /dev/null @@ -1,29 +0,0 @@ - \ No newline at end of file diff --git a/language-server-protocol/_layouts/default.html b/language-server-protocol/_layouts/default.html deleted file mode 100644 index 04e60bb49..000000000 --- a/language-server-protocol/_layouts/default.html +++ /dev/null @@ -1,20 +0,0 @@ - - - -{% include head.html %} - - - {% include cookie_notice.html %} - {% include topnav.html %} - -
-
- {{ content }} -
-
- - {% include footer.html %} - {% include js_files.html %} - - - diff --git a/language-server-protocol/_layouts/implementors.html b/language-server-protocol/_layouts/implementors.html deleted file mode 100644 index 375629b5f..000000000 --- a/language-server-protocol/_layouts/implementors.html +++ /dev/null @@ -1,42 +0,0 @@ ---- -layout: default ---- - -
-
-
-
- -
-
- - - -
- -
-
-
diff --git a/language-server-protocol/_layouts/overview.html b/language-server-protocol/_layouts/overview.html deleted file mode 100644 index d64c2e904..000000000 --- a/language-server-protocol/_layouts/overview.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: default ---- - -
-
-
-
- -
-
- - - -
-
-
-
diff --git a/language-server-protocol/_layouts/redirect.html b/language-server-protocol/_layouts/redirect.html deleted file mode 100644 index 19279e383..000000000 --- a/language-server-protocol/_layouts/redirect.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Redirecting… - - - - -

Redirecting…

- Click here if you are not redirected. - diff --git a/language-server-protocol/_layouts/singlePage.html b/language-server-protocol/_layouts/singlePage.html deleted file mode 100644 index f96543ae5..000000000 --- a/language-server-protocol/_layouts/singlePage.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: default ---- - -
-
-
-
-
-

{{ page.title }}

-
{{ content }}
-
-
-
-
-
\ No newline at end of file diff --git a/language-server-protocol/_layouts/specifications.html b/language-server-protocol/_layouts/specifications.html deleted file mode 100644 index ecf5ebb3c..000000000 --- a/language-server-protocol/_layouts/specifications.html +++ /dev/null @@ -1,105 +0,0 @@ ---- -layout: default ---- - -
-
-
-
-
- {% for spec-group in site.data.specifications %} -
- - {{ spec-group.title }} - -
- -
-
- {% endfor %} -
-
-
- - - -
- {% for toc-l1 in site.data[page.toc] %} -
-
- {% for toc-l2 in toc-l1.children %} -
- - {{ toc-l2.title }} - -
- -
-
- {% endfor %} -
-
- {% endfor %} -
-
-
diff --git a/language-server-protocol/_overviews/lsif/img/foldingRange.png b/language-server-protocol/_overviews/lsif/img/foldingRange.png deleted file mode 100644 index a5ad00176be08ce938f254cb9b6f1418fb958848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11616 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 Mr9VqmNf-tF4~$Reu>b%7 diff --git a/language-server-protocol/_overviews/lsif/img/hover.png b/language-server-protocol/_overviews/lsif/img/hover.png deleted file mode 100644 index d6af021525a0364da800f209e89f86f91abfda9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4721 zcmZvgbx;&s)bMGfOS(f!1W8eF7myH;ZfTGZWJ%ejmQE?@TuKlT>FyMyyJcw*c4-!I z+2!T={`%gT_s*QScjlhCXU?7Tn>n$%+G-S}ETlL%I27uymG$rK-MzeifOoH(N*i?V z4S|!QmLd*LZ4%k7E#dv1#N)M@Hx3R1-+zLeOaJrX{UMW&im8u*yQ2@-*2@9M!}dMM zM-=4X!zCpuE-L*_&GbGp&563Qq9McznMY!1sMZ#8*7?Tj9G0EMEcrZpC!48Wb~<@F zLQlZ6cpyZRmN8l6SWi-vIYDj%kF*$%hl{HaG0ZPmM@E24Lv2PtK=2OE(w1vg1a`q5 zn@efU{tmH~$UgozF>et3yZAUAZ8UG)OvtOu#Uwlc4ck;g2r!BM=M?Xwn(r44IThr1 z2`B%c6?1+3JK*-OCw^~oh=7%;X$-|wEOvEr(*r{ADr|I@7QIW2rl7V1MlHFAP@}~M zp!g9>N!%z_t^p`{EgXj%WgmkfdQi(*(vMwo4QnnNg-IyE-57KbIHBtn`H^5Rv`1y1 z3RTgr3(2R*{@CKq()Hb`^NA)^wmbQh)YN9T)t@ZT%nvf?;m^Fiy}hznm5p-<=skGR zx+`&;#$rrxjV31|Trmd2%-|ei@?hlGZWF$L=M%GKIQ9EBBbkL(JI9F zya*c4k#22ml{GH<@?~dM2Z%%<2F}EkeCM}^!@StyLzb#PeMWgd? zcXzK8?PaT?NIoRStmgr0JUazwP8(c!~xS< zTcn$rMcZdRaA7GX9r+e)%vkbFuz3JujQw%`*7;lc_H=+*mzfG9X!rXv)mJi?T=^NY z6b)DTS+W?+Tjop*>!Ny<#n11GHibA6JTkdzC1=35T)*4QI^2_-M^(>qXB{Xg0xPt9 z4DXJrDG}>JQR@I}e!t5YU)7ow}$ zheH-A#V_yv-Ho1KNbl%r^k8QL7y@9Xtel4r12>78NG#dCa^+T8Zu6Q3qVu#9qY^<-BgPa!XD@w1et@$FBiu{|( z%biEkgp7@ilUX)}pG2$)-HbfTD21?z$T$Uf6q`f^j!AvI61k39VxvAuOGC$cmj~Ut zRRoV<-Fit}vL_n@(l7GybOiPgv9B$?0C`K*^lsTyOszf2M07HV^v?BgNX8gk=Rta< z)%tm+M4eyTTn0S&XOGD0hEWfdn(9 z8v2a5>zhwof7<*a)>$u6eVXg?iYCjT(gm15h~2U?bhZ*ov*qf|;zqeTC?W2gyBZn@ znj=&;Qj!As6cR7@uisf(LfCa35U6k!vO8g|mRNIRqcf+;wE4v|A@sK0*?8VZT8=e= z8431LTy#E_Xn6Oxr$RH*b3tO6{kGzNe(8Z~L`>cD2#2OmuojjuVhTa@c9^yvGCgF0 zpPye{{SY7&+HrtvhJ)NW>%0+{b} zkA*9%_b2_;j4dOP-5k#-(MI6T*w|R_I9}J-7`#_T_1`&OF;_vhR2gcmA8*&e2hCd6EM}&AgHH=jwh3pnSbdhM zh=S4SOc`WLI12TMRg9Y(gipb__3hS}M%?i)Ow~6I7D+2uA0fZ~u-`@-Jn&H{ zH?j2<0jgl_X7NEmf9Dvitpe=?y=|y?1JhJM1y3J;uR`(rgVp{HVuqT7bUp6`$`>7h zknN3)8h1FrO}M?Stpe$Pba)t_kTB#7+K-pe}=p?iuz%F8Z+Om9F1m zTIl|rdq~@h@ZNekQUBf2P@z;}8TW_H4a2O!Pz*@svHRdn-dbzV@yUe*=&#ZW{#86o zl!-R^SPm&Yu1!hl34eu*YFwr|fNr;X?P@eWgKa;mC=ATVFSv8_L+SMHdEk4+0bj6^ zU%846u2;MF3OwvF`#Qj89}p~CE?rcb+a=BgZOVshR3CW%0^j%NX-A+U>pkY?D~y<# znPrVP;pguc=@bw{)aZhcxw*L?=FNQ^I76gMA5cZFqN}Vr8uq5Z#5{R;6+;hv{< z-MC8s-TVLOZUelr1Vs_utE`_HsHnZBf?#TFJy-XT0i|^WgwB(E1A9qL)4Y9}u`33+ z07@oBYzT)d)?;dqoqv)Y2=O)yGAzDfvh%^p87_R{HL5fz9*4Hb>xE$ETf3a{DQgK1 zm8jV9XaI8~!b63al)_HOg+<|cqJD+o$-PJ3?u+%Fx1(H}99~rCBKBLl6eRFHJ5%TU zjCx`DiA#UCoEzRKoS~=)el&Xe_N(68mx=sL91=I~h66pHg|j~kb}?lN#Ca}H?q0ND z+7SCvyJI(_DKKa(56e%?0Uf8i56y_jUrjE$QpOB=->Yri1o2gC>dXG4;JV$d;Tqj$ z;21}KouU|Pk>$cc+RL~*b-l;RnFzhb4MZ|+oCNC*Aq{&zsWL4k>9s0oJ?5uL9>*6X z_qmtK1gN}&c~Kdr{Pn~1_tYsk)u`Mxxe7k%4+#4(u6FOP>XNl}gaz`m8ug(bz(JhU zL&1kzhuoM1Mw`|%>1Pd0Jg`}H7gi-Q9xOe z#1D;se!YIXQkxrvDWr7gqZ|^Eh65+axREEQaiJeyD1=6eoBzT^QC*gmj&~u3dDh0q znFeoXRd`WJBTI<=;_HN|@ZLxavE;jaA+gi%)9#MNmJA1fJsYr+QrnVz9AhMQ6NM&a zMg0rI>qO(`ai($Vdd-+U?|I3BT*fKQsb6{x{dkx&Ekn(h8i0QX?;C;yR@@U%ZpvaE zaXEf*{#v^C&En$E4P5}8y}amhPMhCN__$55fl6`oMQ`r3mAW3Id{Q6-12|V}d9u77 z-pViWR}FYFt1b@1&77F>)4y?x3+T$mY7BRRD)wm}=s<6_LbEj3galja?w+ZtGORDl zE<~ldZ_{kuQH#ao9hXg7@E+RA^32U&PK^m|oF>SDV*hX!P?GzOI)j;4vVZEG1~4i$*Q8^Pd~EBxKI#jWm6F|vle;H^BG5DQg!`HIz;S?vs0&n z2I+R@ix~w<iv|YR{ zxm3_KtPbwGxT2at5bxxZ23rI9b{o9bx*G{!NVa#XPoLPbK{rpf21+OJvbo?a(tk|5 zJ>I1n@o#*`@?bFk=3fbgVujh~@5ojo>6aOwKalHuU5Jz8D4UW{Dy5dhP zCb9FK58k4kE;prnSiWj)mS($`-&YD!7+XDJu9(Gkd0#lOGBbCcV$TmZNpd%z;-b7& zmkI(Hp48}e2{7L$;NBSy%MSlXOJbO67QM>O-k2W!?AxOKPJF9NuOewI36@^N_;pm)41n$^JZb@+1|7qPI zXVFH;zH}=S-IV^Yt5FOJHnTdc)65QLtYa zd(i5BsZrSOT2Bxsf4aC(E2{=?;<0f)T6ziSvPZYwV*KRd+axLEDiSVND&JSDeZ0$W z9=Xd%zg9;+@%ih^keK?bz+|20*e% z-<}cgWW@6t&AgnpkQ^`oSdgsP#fwmKbuoRES2)p85smu<2*otz?hQGactxb77&5kF z%+3Auv(N_e#*lwR;A@IYAHcbsi%X}QbpG`Bekh;qhpZbfo1!Mm>Wu-?E6bDZRmEy7 z=#UAykCJ-wk!Ns2RgGJoB-X1+C{2>*nwXEJ&*#@S`O0;35wfGF9Z-@g z+6yM*D#i7|asBLuLax<;iQsrtDi|Q_T-Pl_Hy%Xs@>>4iG(CGQ%Q*C)gdW+XU~tFy z^4h$$H>}7hij*h$jP*QeW*tlZ%ka=4u;D~g%8%CnkYYf$a-h<&;l}&&mQU(R`rW?V z666+TExRAsACQUMTSgJf>=-q@dW)+B1{)H|R@N;$BOnNLM+$AV<)?#7kR|E}x~*O< z13N2PVVykVKJq>#g?Y==F;_i{FySU`NZ^XUgM5z>5q@p(0nP)DCLb1g(-s=3_-t2Jtns4Xsio7gd1A;)w!vAuWWngeekaeXYn!48*Zit zIY>494vZ#TI^{y0tcr*Fl42Z{skWpI0|2|bh=&Nm0L9DL+y%JEZ%-0pf-qR|GW2{R z+U9|C6YxBQu(qJ^x_lLGneMrDuz6kf5-d`TXF_xT5+XEGr$BR9lof^l<-ZuuFSx16 paqWP;9^5E8a>oDD(N#PsKuR6+6m?yHz8??asHnLs){l2M_MPkl+rBLlRsUcZUt`4*%r4|9!bn z_W{^tySsL(Yr5*3Qxm1Bu7r(2iU9`)hy7Mr{yiKVd=c<^1q}iCol*7;4E%w2d#@x5 zS2acs1KuFn$f(J{!PUlNKAIr|@6lb9_1)m$h#3C;z`uP@e+vAQ0HmM?`rvF0@-X{i z1*i1I%F4;@vopw88x5GkpYv8;=A)WNrD!mQO6543I7I*xgJ{+ST#BJUaV@ne%h=MJ%S4< z=GT*cf6+uL#R`odpNv(R`%^jdxb_oA;LJ04_lNvZB>j;a%VOG;JD1I0lc0gAE{M7m z;}W-E|EYJJ*{7;U58vF4Sn;h;->p#bEi$k0v(|G~v;h&prPD>xr*i$N-6Fm#%|*-~ z5d62Aox5j9wX4!RzH0r^wu`k3kU@sKGHiu1c0W9-+%Uw8(8Ia@NXfzHH&j z)|%cOc0SuBzp$h@D;9td;0>nw$R zvp--FQ>7$6;qR%y`(rMvK}oa*FULVb+o5lo{n0M7X^^*iNYFjxuFae2GwoB2ShdJ< z6KMtW=d<9VBpitJ!aEOPTk#FKRY5?nW(pK~5;p5oi0J&*6LTpP@_<)srzp6Fn{tUw+u?gt>31 zKipiYllbo7yotWj?GD60?DFoicdhhOFS#nh-i<<5OjqhFOK^5^*%S-A4-->8z%jHR z7Y(=_eJV}7RFX$cG#4%EAl%KJu^}JCo`vn8kl3I4VeO_nZ@)49io)0Ed_c}EOOq4E zgkjL}Bi6|iGYIy`v_nLK-kJR)fOaDhe&cC3yVZSqkDsz7rpO)YaKU9MI z)|4OucOlV( zW>Dmec0qW_Dw9+$Jy+#o#-=q`1xDAL4590+1!o3_C^7xSGxMcR++9uTa$vN(N**Y@pW#&+2 z(f!Qk(QBQ8GZ;P0;SJGRt!b9+jY!0-ipgg@L|Liy<6mkw&5gSoD{K7{DP>;O^9{wb zTFMqe81A)SsxP);t*;#)M%2P3_Hrb7DJQEhS3$UHIR{IJ-0(s5gsT}+e>*vKg`-%Q zr%_d%%?P-8jYNxb-%c?K>2a>!4A_v#T*j`ZA2>L(3^OWCOhoc4i!kDp&4$VrL->vfd-8_IjV+IMBiwV7)&#Y&UVJmspc1e=3~v zycWER+n12wUWuck*l+nkHljc2vSHYj?xgS*^T4MAlQ(A#k5tE2lqgSkA@}GRB3RNx zn-`5VDfcmB3?FejCc{bfdOJuf{0J&iCml z$=^ffGJOK<=GC^!_Pr`5tA2(xI{=^35~3VOnSo=m;Dm~EJhoQg%o>@CzX)2JPNyH$ zMuCz`UBNx({+Ni}nR)50w$hR1f~&x5qTxbN4JBrm>Yg>f6`;6gP|SzXqnHS<-^ej^ zpPbco%O->S9N`D>20*e3{x>?pw4JmL49wXj%xr&chb@qt6?M4S;MYB3X2NR1f15Ah zFw1 zeTtN#TF?Wd9oP|Jz8HpA#~E#(!e zO%{)1a>J&y!=(A1Di zGH4d^f}QKciPmJgXy~R1M?mTt#O+?{YYzBhd^E*;_gyP*)l4;rRQt(LKj`TO1uD$0 z)$G-b^0*K-F|`cL7P=-sphx+R6U#2#nBr>&wCiz+;eoKl@UR@PO9F5EBD!<%No5B5 zgxIauJzm@E>J)eG%<$9A4!?M~jNf_lC?sUA$y@oFoP_dS+^Rv2Lp9$;@~oT+WG)nR zMs`CpY37yQ%qQZdz9GDO4q{)pJ55@yqJ96`E*;p9< zujKPD5ip;-H;|K}*EE~H*KOxEiFe{4?P`5+Hc`EK+qx4K8poO0PVf`m405!hi#fhn zczsWBNRK8~dDgC^7ZFi~6TQKoQztEe-+po@VN4U+ac-FZ9;pT`tX_fWQ449PPj*2? zPs}8-PCuEYX5f9YeM&(^GnHDic|5=S6ZjAN|Ar4D!OdG;2lW-aO{gf%y02AELcl13 zm>iWFQ%uY)7M?763;Ih?a;7HqhMGG5oP-AnYL-XLyCoe@41X-Xgn{T0?ij7KErd(N z@DUrojJ9cC2$@L#Tc-6daYQpnamaCLQUh>^8$$*{_t6W~P)C+6;TC$5WrUBYPq9#L zLKSL z1c{;4e6`T#>#C=F-^4*lr-OYISpKLp4NcXB#&`xk8gGnUTw!1jGokRV=!!Y?Z3=J| z+wGsdlGo6(5~VJm#Hb@na@6ZsW5^De&q=Q7q+mwu9)smx3mv{okBG1e*G$FxtdR^h zWtmsN|EM~!^%~*g!v2mIe}oR?Bd!=kxg+Cx`rn}-7wVw6%+{%WmT>2tf{lqk0Mb_y zPkL9vHovExxj$Gh&!uTEntxVD=$v+|p2&079pKx)x`)5d`e=Yw;M|=N%OpCy0Db;* zPtXZ>YaCj@4lld^I8@1<16;Z(ydEx=SG(_eEt^DS8>%!)2^x3kw_CGU(d%BG1>LMx z3c%42vp$LzoiNZ`u!i_iuwn`%(l4HuI@~(IXY`FxOIqw8$OUj6cM&tf7iMeg;-Mz`SaAEc3A5diTMIMmRpu;>qH$;9qpxkq&=7V2A(TS8|}inJobHEW;G#qryb&jmMNi%&lLgANUG`b<*4{XSKh z8K*erJ6kA$qhkl`&p3b9c73q){_@AVHFk4zm-EqBvKg%~Zyy!P1Ej%ML?;hOKd>QfO1E6_ei{)AG z=G;22WvAW;M%nh{st1=2%Z`Qt|4XFbaLDaTeujJLoeR8zN=;z`zE$w*_f~BbT4&-I-;Cw`qdj(v_p((Emcst*eb^3= z_|;E_b*JQ5>eRXd8fT!5!D@kdR!LkQO6~=E4Q&&6g=3zn)_wg{wXqeui!648j$MV| zP5%|7cusTk-QXc+G*t*Qh6^n5eyN50skzabWGk<2%hhYZ>DM}*4)n~^_ochRY6&;) z)_XX@>b{hq#9oIxS7SzfM9AO3>CP?!`wwyk|8aE9fXHspO|gQ&b;j#dk7!jcn|-Q> zn*h`^>rVf-jXx@8zHWk-OiS}h3GjRJGt>u-a;on#?d94i!r@McU}xX8V)_aB>7ef1 zdbh>P=Q}t{-z3yYWV#=f_k&(NktsN?UiLY8*55%4NGm!F9lQnJQT2B)$;9ZF=9pNG zh?z^cOu9dDRmYDg%G2XpiZTR{iUH-VkZB8r+7gFEn&){~cXk0JUIN4#Bcade#zpQdFjlJ895mRjmQ+j-8WsL^l&Vpgg zAa?2yG;Y?uYE8hH%jj599v$CNwCmCFxZP#k?Y7ST0^R2?JSNF$$or>v%cyefKt&Zd zG!Z{8&~9QL+fYK>m6|J=DKs;c0gW4+p% zL&hh&%yj3_$prwuy;SP(8`ND_`aUgJ{`uvXdga*U*CjmucpSd*mC3JHQJ!zo1|r?k zZsY;#yzmfL)6Ew12fd=KuUxR#uUWa&%6M*MKROjKPx})n!h7jRLJ~J9s5&6j`N0wa z-?x1dE2&W=W%h2#G5RNiNUtVOK~Lj#K3mCT&MLh=Z}WoT#9!nrG=Eq%vu#?HScpM> zRSe@>y|<`F_N1T6uSL5m-Po&Y0~-6Ty;9t*!(Lloau@qm&-2%I-vSU51TN+_I~_LH z^X(r19r-BSix|eR9k2u7x3csQl~Xj}amB5?&&G9XJ1J7lydOkU3xSx5J|4(%jYMWu zwb+e|3N|g(WjT}|aG0EMk1ji8f5bwRUMa%@knL!V=L=Z#kHreamsJZ9Dv_}3#sb;< z(1-_|!zQXp40|w8Am>DK;(VA;9%ma&P%Lq+_#~V%LM)bHu5xSDX~=V}Gr`c`#aj zt=GBaXk0toUNL*A7VCAUPM8kr5!||9`Tm{ANl0esyB)O7;Nsk9_v9}-+kq*eTd(nt z&}5W%vu5_sT88>r6yQDW(j(LD4k)RfgZ=uQ(7zS96`qv$D|Ox0t9a-}$ux)(cx)Ay6tIy|)T zliTnxU;z`ba63GW4qkGfrQsq(!si60^c@``Kr5Z=2mg13o|mA0($@)AE`Y27J~y+H z&3(=yP5SqpT7YkyVoQe2Cq%Y`98BGdoWWV)+q@)hP4Pq>^PjznkhCgaZ<4$DfM79DocpVMc>KPld#5GA*LD{t#1OX7u)#rd)Hu2ewxTr888{rp9(1F zniT+hf=N6FKq1}1M_?ep{`ngbH^T{!*)G+8@8o*w#v4Nn4KFE(weq5J^$4m}tR z)e<6O(eoAhOB|vFxCW7TC11;R3WsnW$E_4_+^;~uK0oJbS}x(NXO!emx=8p4RiSk8 z4xJ?Lz}#H9OI!o{y=vSJ0QTRQxExC!%>N7j(2k0k)PU*Cna^rYHNWPv(oT4}7H#hf zhi(_Fx0uMVph9o;fP5 zPDC)8zXfpW05v*L8jhEIHc^?29h>g@UP6^+L6T-4*kw_Noxsa$bOX>Z3zkP8qB8pl ze-Ye98kWCFE6Qq`tg$R*xypCnauq8(-R8Kt>T0)E+For42ClurIZ5&-pTg;#3>NJT zcIP$Ov0A_5+FS-x+J2tu^ywe?fS}fHeZuots^knChbG_Fl_rN~x`Lh*|M?vEUr9@c z9G|a8A0(900qs9=;4Zv{$8MHNJRzuKWl|!&2*8)!D&yzr7PONBACP%?|2SC z+^3&B<_!W?UGIW)B^PVtz+|evIYy^rSWH3fs#rY!bGN34h;~`&r8ahfEZeuA`hZkf z{dK;Z+H2HUhEoflyXvuNjK`<^s>2*QoN?c;JFIlGO*&dJ`scA|_L__{n$I`yJ`skJ z0ow`39o{c}mO~4vyy#Zg8fKp9%hNiI1pWHCkcm)$?Q2$6_0@%i>>wy){FZ#B z_lVIeDDt&Ibt};^cfq>pHbN3K2CRHXN@KqD;Jug3%ZKGzFsWE#e-UqRa`0dS0bJ|* zo|OGmQcybNEA8XQ>;{dIB*_pTP6aWGdIoppF^vb3;RAB#*Q95D=4a{`8B2ao)bXl9 zx8z+kM)n8+J65!IKSYm6a#%#1e5=e{V~zGZUP;7W_5rmvJKgtUdmSPNp`0$L&l=!v zDw5Hj^f-Saq8a{AE^$UoB2MO=t~TL;$G@a9jSs%>3 zkT$RlM6J3W{$#6q=*QyT$Ma_VEiG?X(MinA_q#$^4LcO41tuCH4XZDs1P{BC5IjVZ$Z9Pu$G!6H zJCR;CuLr}s4U0QUR8;^5*q{7p!wOR+X6X)e^2>^?5{SYe<$9YZsLH~Jz7ns{kUmyD zmX6fd{vyFk@oUN`j)_22a@BPI{iHo$Fu3^vv!u7T_n4t^dUm#VVFFqi**Rf$>`N=d z$2mt05|=Do1mUd{>yhn>IB2M$);cs_!pr)0=s&L^g#$Jl8XJ3F+-H7jpVx^3`I4zz z>mG%hWB;mq1e8zU86-XTx=seIUfGzlrSiREaPb5hmW;+e`#j+#T3{Q^E80*KC~`F# z!m#D(_xC@kjO8$j>tC&cS`cHTAJEUKj=(h^d(zD)7M#E<1d(X`?C1@?CBw4g%YbA-iUKqD}fIg3Tpy-W-Doc`UtT zT~J89G79?;8zh6z28VvN-HXtK+83Q#Sfr86UvS7dcz_LpZ(U8pCL7wp(DAeMy5h1& zb2kyMYou-S@d7En={4X4^gCdQm^26b6Arh@JL-~(zI2`kJfPMA&;3jp$uGXf!Zwv zCQz0QE7Xjgk2wC$QPhV|`uDQ}+oPkk78gVxzB=exDsIW`pSBE;_f-F$^EYECDxM#R zM$U{AqIRQtXI22F6}JpupM@7#nU39UX|#k$_9;q_a8cu=_WtUb<&|SW{uL9#@@R@N zy!}BlpaM^xHS8UhC4~C58A?-g_phj_H-DBA(0+yatklnWYuC?FQy4Cc>!U4gQsexl z0r`7UAdM8Qg4prbZ^#h{5qs)3axqWKgZa_qtJQ>zGdsdP|4?Rd@-t(~ATbNy9_SL5 zap;9b>mi)5kHEps&jZwSXRZ6>87hoFUD`v|U-!^^w-qVCh0qFiYaRbUJBq6 zV6t>iQqS(G-=*y*18)srD&#lFyem_r7qMNx$fiw$lwJNs@&&gi2Z7yy7_E`j_ljF& z5-K~@2#PFQOvJWkYEnjFcZL>vC1}kN8V&O+*OIy;v<| zs!&gP2aa$P=-Hd(+7_LAwbjKZ8Wa#5;NSOdH~s1A9k9i!cOE<2e!s$PsRi^7i(n*= z!aSOkvTuh4V7os~h;G*BOjV#Vrh@QYeqG2*Q(qqvvKRLZOsGc9)ubzY;-6O3@qc&b6# z!UG8N2FaKcbnraxL&GmR1r@KPX%Hj?C^!*XB28(0XF^H8dYBjrvC4IUgL1E4&!+29 zuM|2NwAS`jTtD|&ifZS}Af=NAS0i)F;laa?$iQV{f*85j_8Vb=(!VkK-pgV$IYUfT zl8%3gSkx=*$G$?uk3#*l^`%5fg|i&{sob9uI5g%5aDo)P6oh)_02g$JN2po`r%)q0 z4OnLazN9|n7&UwdUYKl!7~dz}4QF_#zekryD(s?dUJ!FknjYf<+ub~?dg#W}kUK&2 zjix7jN3Wa`DepJz4=&e^8P~3Cwwpc81|H>u`M*AQj+r+=3Ej*w)0)fI%dY%cu;<{pKLS=b^qa8E^@mZpj&n&GWk)W)|xlpP5F7(xvL^No1f-! zI%3~$anqXL!J1GZ%-1uCFi6Jh*>$P%{6Ia((wT8BI@8Z;n*#vKVK+T{Wide&M5DiE z8mrED`|(#qt6(*a{pE{WFf1;orB<}smttuSZI|gz_y)+S04?N9{3cH&841XV2BMOip*dri=|R>PS1-|vP(%!YpB?*M|r^upbG1`r>mXWC>wjzo-QB95kFG;O_t|Mdh3k3wEl|my#3C z3Gb~h*nEP9fELJ`Y3>$oIR95oeBGc0D%m>1&nhQ*`cgUTt7BFnY=+y%w=xLQf@`1b zvDJb;Wd+ct-YzYB-PW-k<-4o=c!Y`l0!n?|y2~ULH8-|OwrgRz)iq&+qO#HE>wJ5y zSieO^Oe`Z4<(ayokU0~b48TicD`&UfZmr5(G*AUp=uoWl&cQY^Es<+Wn}6%Ug8OWu z|A1&)uQ2OYB1N}fbtN=F(>hbv>cKjV&OeXusb=Zq#IcWx8&^$q|JfPfP*)gKX5T$)KyMDM0t+lTUZb)c)A#^9r%QgZ9_G zBen8oWz<^BoJJLx7{j8QZ^aJPCAZZ-yKpQWrFX5Ma6aUZh|{d06^#Lyw{NrL1n)LI zz0~l%Bd1dnMdv1DW<&d81a>M7jwWSHBLOFew}kQIAL(Tq_4~W`)Ev*S-}O~+{Z!3) zx$iYSXQNrQDf2Q7uSTy7UHz_0I_Fro!!68g}e#Eck;#N2I zLPXqkNp6IGK-H!;ot@|u`Sq3;`=F4(y4fa4ZiJsk+3g84gL5d5rn}f&yE%ywg(A8h z^GMJlNh@|mFL2k?u=Q1;6g5=gP3($EuTEZp{Q+%So>QBT8L;p^-RPAV5F19LXt<`>Eb9Qxg)?Zl9H-<<6)ccR=q4J_z|2GP2WCQnx55}DVi z;d_e)gyM|K;4C6^j?x>35Ee;GmwX6t4c!51V`^AH>G63-qv)jeHZH~e#fymCUmQt7 z$(Ru(Wo#_qo1w#tA;lq?-mMMALkedCxyt}ZOLbL?43t9U?*sDC5!C%DrIA*E#oIO} zYJBi~^cUc@*aB4Y1ertli3R@+wwaUK`U0X#8I*cJZL8&MsH;NlN~6C|yFRG;aZvIw zI=XBr?q=ve9eoZVoFMO@3B%?!0zp0XA#e9mKU|}tP+gLD5)X<*a({V_L+x_TNhn`> zSu=F#@xgsKF-_R*MbF^;tKR^9+$P12IV_{YrX@c1B05SYzcK&$73wOLCQ2kAb#Gi) zF?0Q}zLNCiGqCgCoKmMXoWD@9IJe1Jnc3NsO|A%igBlwfUEu?@zkthjHvPuG+YPz` zgaQyl%kWjNMXt;F?{hnTdnz&QoGz`G>r`e6yVAC&1Enkf*l3mzPtHEDxu17Rmz+o# z*M%xaoP5i&yPFytWlDo38M$uWSOv+bqMEM7DOQP}a#kkh?%%6^2RF>@ULv){Ol}?q zXQv(e1oI2?BZHG*_Y}NF{O}!N=y7j2l*=-@!$(0wT3DBs%BcAk!*8_^Vuq)1RO%;7 z=j^^^ISQuzeAn1t1zlJ%3L+(kZg90TLjMKY=iryG+G@aToI)6$9{9i!h0Q4M&q(-F4vVp#jt#OpS%1$=+1$InQCHZ`UNC@izKMo zPdJ4?iwl4FP1gT5nu{b|X5T=?l;cFrm=H@jS=VDr2v?_vKS(4<8ccXibp3%j_2^>d zxEeq75sluQvirmsegwyV3AJ0oGPUPR@(gu(DkUh z&ujbwUv)Ck=^=c83lult`e-Dj!(^(SLk3YiQN5n8`*uQ%$9ioHyZGQ zGlqatCMlja$AJ(Ds^?7u|ChVtShS}%czM9mUs(8_FyDl(c(1ej3F$qx9D(1kgR`qI(_lPQu|7u*PRfe2%$x0e_eP*VS6r4b=0-XpPi% z=hQ8_cB=h*8^bRkLKF*r0BdLHQ>iq4nQxISS=% z{_R8|A-WUqW%Sq5sr>l8&TqZZMc8gANTDm1`jE*fQlx;^6I(2>e3~5JNft~;8%a%^ zkCf5PDn|LWK7mQ-8XgF|^Z{=>Q9Wd|m3R(XJ;sCimI(igZq{Wge~x3gYV^*efREOX zg;QmR*EIvBz;-PZ{_@Z88cW_y+o;SY$X zjok*yJ#&CKV$^c5@gdIonHpFpjRc@z?TN=%F|@GtC;%DWM_b$^J^@>1Zp z-gdw-OdzGY;|97Tig%^dsE0*Y1eoW^v@&B_N(^zSzQsD+L-1un4c_jF8x4u*Q)wx` zVd)^60!a^8_jH&?!!@CFUC2Jboyr>DaM=yPb7uu6p!O6Y-tq<|D9HoPBi%t}mSL=! zUw{*?+@TNSx_u6@k;;41ZH%hWV_(os4JQ1-EI2NnqiwP>oy= zkdxYTdN{f1%?WsoV*1wpe*G+IbK>l_HwZNJ2^hC!AqjzKpuZt64vStZ<+>*jXt(|h82B6Qma$cZb(0}{XB86zVd~tb#wWl-mO1A z?tJSy*rMrDZg$3pce5mAP?*}MqS}=q8yeKcx zgvMD?eGEnvVqT*|KwLwmYXr0n*Qog8K1tu$-4xX)ptO9G#bKhmM0nly9k-P)QyftA z!yH$qwj{f>rjCJT$||wHZyiBQl)#;|l@8RrE*)NgfPD9Hke3~tOj?Iyxa8b|dJnDb zOEbD)-H}-agsU^M_+0;Ycv!qf4qtTlD#i9fVM}Zo=VeDFpq1_SPyiPJVxf$7aPK_> zKzip71I%-Mlb*>qPj@$7`7@{p9^5DOxSB^e=;Lj&!LwAZ|J}HMXWvx#E-ebhRbF}k z#1l3*r|q%IQ~Alef)`0uYK;S>Z2^kYhRha5^KHow&~i(io7$VyJLi$FnU3v~sb%l2UCpn`l-*Lmu>elsZYP-Li`1I!9k^XWHpm=szDIT{KKdMph@&eApl#yo3Vx6;j$Dsy(Jg`jp(e4DQ{oV z!<+A%>!psDSZd zK#&A>MYdTNg;mv7RL0I9@%&U|()=-;nNGQ1ft+NMIuV(u7ZcMX@P-}5&Y+#?o;F6`^-09;+HEOYfdNUYXz(xKE*ge42raon1+!?3HW@Op)GJ_Yh3gP2d--N<68` zIvYQRb*7c$4TW$2&5dkYg>EZ~Hqs~9qeYq5%XIz_D7zi~-U1RPR`Sjr*VuSb4_3u7_F(Rpyci2uwbY z^0O!;wFD*7!Vj{UaV31F31N%o^;!bpzJ#V1V)7oAurOK+W=wQjNW7r3hmf#q66LVQ zoPN3A*EXEoE~7vuj%|Er0|a{dU4JbPv* zLU%ZPb!hDmw!BD|j`<*J@B_qPYI)BP#>puE0>FM8QcmH5z4&1PODaMxQ5h)B&>QbxTp*u30hYmvC}rzh zoswvQa?HP>in5LBYglU;pw#wS3PK8tSA;C; z>5uz$+>;w7G~-B^|AEM-@i?A?;)vBQ?az;2o8=OeLzNVhY-WiL+*WXpOlp_TyZ4jg zzfq&W{lkt6R~lONjvvFfF>6p_;-_$w?u)9s7IxCpxv-UKcAW%rTh-#9X;H|50>Wkc zn|;q$SP^HW&^cDL{Sm-&$?$}b0TL=yP(Sx=YVo68YSU@@Rb1R3*MF+}?^n23ol`nX zx1T6jPg2+=2CRNl+L$e^>v1(sKJ9#65>xmCz%rM#&Q&v~R>iJk+J8+Hf&iD-*76&u z06~)|e*o5J1Y^(}hA7f8YJXj2>%y^Y8_@MDG_Oad8_mfo$LnN#42N$;Es2C2NQZI5 zOYY~XVmFajMORZ{o+QAzZma?Y9!7Ws8mMM)mVS1ORnSo;d~^-Wn`JGknaT1SNdirD zfYL0kbqOss68d zYQui}EkiWG result. - -Let's look at another example: - -```typescript -function bar(): void { - console.log('Hello World!'); -} -``` - -The folding range result for the document containing above function `bar` is emitted like this: - -```typescript -// a vertex representing the document -{ id: 1, type: "vertex", label: "document", uri: "file:///Users/username/sample.ts", languageId: "typescript" } -// a vertex representing the folding result -{ id: 2, type: "vertex", label: "foldingRangeResult", result: [ { startLine: 0, startCharacter: 20, endLine: 2, endCharacter: 1 } ] } -// an edge connecting the folding result to the document. -{ id: 3, type: "edge", label: "textDocument/foldingRange", outV: 1, inV: 2 } -``` - -![LSIF graph for a folding range result](../img/foldingRange.png) - -These are only two examples of LSP requests supported by the LSIF. The current version of the [LSIF specification](https://github.com/Microsoft/language-server-protocol/blob/master/indexFormat/specification.md) also supports document symbols, document links, Go to Definition, Go to Declaration, Go to Type Definition, Find All References, and Go to Implementation. - -## We need your feedback! - -We have made good initial progress on the LSIF specification and we want to open the conversation to the community so you can learn what we're working on. For feedback, please comment on the issue [Language Server Index Format](https://github.com/Microsoft/language-server-protocol/issues/623). - -## How to get started - -To get started with LSIF, you can have a look at the following resources: - -- The [LSIF specification](../../../specifications/lsif/0.4.0/specification) - The document also describes some additional optimizations that have been done to keep the emitted data compact. -- [LSIF Index for TypeScript](https://github.com/Microsoft/lsif-node) - A tool that generates LSIF for TypeScript. The README provides instructions for using the tool. -- [Visual Studio Code extension for LSIF](https://github.com/Microsoft/vscode-lsif-extension) - An extension for VS Code that provides language comprehension features using an LSIF JSON dump. If you implement a new LSIF generator, you can use this extension to validate it with arbitrary source code. \ No newline at end of file diff --git a/language-server-protocol/_overviews/lsp/img/language-server-sequence.png b/language-server-protocol/_overviews/lsp/img/language-server-sequence.png deleted file mode 100644 index 0e0004710279b3fef5333422ed61d00727f87bb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69691 zcmd42bySq!+xD#j0)n(4(hX8NNHa7NA}L)0gNP`|0Fpx^Akrl*-Q6uc3?&^B5-^gXs9XPzxU|gty{P5D=W!s-MWS4 zcO*nOCl++w(Zzthy)o ze%~xyyg>H`aw-SQ{A5*PWW^@)!^UH6_ivJm{LRm4= zM2#GsuC$c1TRp6fnESuwj%=6_5@~FWpPn!g=a}oWCiass^%-NH%cq|J{?)7NEsU z|D26^QPnhmH)P5b(~YnF5W7veJ>KNBq9gZKf z_bBB^`M4rrRY$R%Ua~^4=5GiQI8nf{qj z%f~ZLa)+Ks|J#+{W6`4I3#3yLItw@7W7o|*@+2;|X{`P@+Q+Y(!Sb3fdzz4Iie?4b zg>}`I;_pXwcAHEd&`kBsX$8$035g+>DtAMOkKMgr$^AWct7&#v9dBAsL(m%s_VHKz z3|b*3_70#!GvF!w-C=x?%iMkSgp)?)m_GZ&&RyK6I-S}*KQ;;=pcwBsUE zT^0%|H!04lCq+>^?i|Z&$@YB7_N{IWyNz2Yk(XaD-f|?0FVE%`N;-}X4to}!*nECU z{_o(hOd8-_sIRl2@@=yC8HzlrTjakmyM_#dz4gHE8a2}&KAp2n6jmcN{oQx%T@i9t zS26UDU(katH3Zg0| z9f)If8j);i&C6^n=V=KNnx?R=7SP7#R6nJ)gw_hvc+_zIXI94*e!J%V9(0h@Wkzws zS`xCG%51w;%xk6PWPw}H4CZWLlM{#F_de?f9gS-zJkT?)khuKQIsf!7dz#x?VkMk8 zG`5c;z4>$c&E>k)QXmx{FuY{l4hDsrEMcH#G=dvBX=Kmqk4wBuWfAC8+ID@8yt!(- z(NmMy?+Rzj4jBR7|9?+4%a{TDCeuHzY>)K7f3)VM)~|J~CAI84E+^2-TYK^5Chdzf zxNXMD4>}z8eoi5@`CCl-j8^@p=gzu{Ca!Kb$he2^JU&U(TPWQ$b6=T9uZG&k$(24b zjNfE`(-PHir0$hZrnxbt}HlqQ{vn|43rh{VQnv+*}Dlxm1uUYWuUTKGg^ z8fh?Os@RC)wNi{ksps!*sJdRN0Ta^YB&IB`g`ZA~uf<#6Er)wY+{9+${^l3=x9jaD z&alfsVOx{xrJ2&&Y5VD7+_O2+)d^^SR@u0_ys3xrp(|_zSOg3g>mDsmBrHpv4$$bt zqaUV5LhLTPTQ7EvBo7jYV;|`1XEa}*Z_VrV+8aAh=pcKgt{u*XTw1j!4Xjhq5#EgGQgosA~6zG^*b*^A??o2x9YL_9_onO(g*JFaUp;cL4@@9L)$ za-@4g&t|7ub#+agC)8gOD&p9;9O;@sPSFW%#&&I2$Gb%#4s=+F10`Mq-z$f$UJuC8(Wg16W-WH3!B%r zx^QHm|aO;b9~mN3Mz<*(dR z^sK-2p7i<$cUti}<6)e-H!w2)T1wle*&W$$uXdV>QF6;~r}0%XtdFXxRN)j{g2yM;V2w(t#|2X`^%m0-=TR}*yZB9|MUv)6;(Mj*QiY0ouq=8! zmc)YI+a@tQnaW;}5XQZ69llXlV9eS|-iTbc({CX+fc1WbqkgHR<#-m^cD>bxIR0gS z^E7i=(w4%d&SS5ouK7;~0W#jmj!Rwg3=$^(e!3hw_EI=*%G9Go;`($&aN+7?Q7Yv{ zrUbp)YSbfOMcXa1;arysA}TpacSjW@h3nwg<1fHY=8KLyV)d*o8v6U z1|Mpuo8nct12dN#401a|CfLq3?KT$W1_BF3&7?Y5{|?jacduFM)g*~NIni0h`GaBN zn_|StH_LFYo3r#A14F)ovFC4(+b&QPC&@N@^()~^qbdhg=~u<7 z;ycwf{NyXRcR`6whppz$w@*u%%Hn=8c-NqWDJ|;29v>$dA~R^34sX*d6H8pVn|$-y z4iw&My2`L#$lrT=_7jJ%)kU9r@<_7Iht3`EYN@u@v_w8KFG68ez~0-gUX0ddMZkIg z)TckaxNY+m!gaMl7$tjlWzyKwZ{KQk5YcUZ-i2j?EE=XWalfBBz$`eAouR!a*yL2b z#o*Nt?`Excu|anjTg2d5;I1yX_0tSULjH>VPip&U31XGkLd@-T&0NXT#v#h&Z7n9vp6~ z)r$92XOJAZj(VBNMHBu2>&Dq8b3LQ1>)8)vEjE9GJQg$QU%p7*N^tH&g_TkTo|d|a zGNx&IPf02(frP#8xSjr5yw>IAvrch%elkJqTfbd1Wom`s%HzSrg#HMx!z|FE=Rw@C z*KyU6*qzFY-KME(n)l^0i8i^3h@0!ZoA~t0RSska0e`WID04Lsq7w>olL`%Qyw1nc z;{z!T^9{coFL>+~ZoKF}hn_A4O+iV&D08G%4@evg#5u`>S2O6PE|-XH!K-!aX&$;A zz9jIIEwdZkRVJ!hs5`q-%%%9r@6hOi**JD>tv(DjJ&7s z7GqIjB?*gN>g#1a|@DbAAy{qL&=bzAqt>|?XS#R}KR zHF_B{f*U?Ds*PCBx_3X&iyemTI>!BeDRp&-yjZ;Ps*xpn^en$|rtE+4~l!rcaO~Di`E75$*@{2NGnmd~+ z^F!MYZ;26g$a}xWu~e3u+@PbHKaf3omPwTY>peI!X+1cLn5g8@lA2P;HSD8RXNH91 z4BES6^V6LNi7|aa`Q#gHQw9+!+?WeeD4sbHWDhZmg)ZCFNgDOneJ_S}M46!Tt(-UQ zc0@?n|6}kkTRrGUkau*ZO3(G0xfYemEBxjQ*)ESS@f^RJDEaw?3fh|)q<IWmHfIaqv&QY=tLp z!BZ}4(rLT!(eJv|#F=?*vyMN^D6CyOTw)*58_(niLDe>r zV&iP3Qf-yj$kOkcUr9&m``w{%SPjYq_w!W6Rt-xwZI^cv#o<*9X;gEa5%82t*PyP> zr`k&Q^^88$xThO2_x}V!wT?2O#iu^DgxJ(ivjuB1n{B`S2;AX!*%(HA1coK5at+)! zbG9T)@`EJYi*TU<*f8KF7PGF6zThtjz%7WXb5HTuZHTMS-&3G6c?E=rHdJ`>IY=fcQfo8H=!T_> z=PPQUBWFm7$2R5aL)+DkebGR;_-?&QaU{ELf#Z;99*4TyMvQKqvaYZdlL;i(M2Q2M zA7Sw8`fATxuYs`}CD2Rj7;9VBQhNz}QilFG9lWT-bjA!r%b>cZh*2F{L9dw;@TTZJ zwl#^lMu7vjlDguQNweKuHtzxrGQ7mO2yCv3#*0-2Np_{@m!kO$c#t%+4ijBc^#H^u1XcAY_ zzV$*}$zqq-ssCJmja9L!77k=hu9kwrK2|guaJ{=bDJHo*>X5ZcWb=UFw)@V`392v( zts2R$K3Nvi2salXmhV+blrZd@t1$7tT0r{selE&W9#~@XZ(^@t53%5V&*q3|sW2Rp zWOg(^BjIIQTH86E96b4Wdr- z)>+!LYdH44Wq3-5YgXrrS?jeiv$x@+QgV@!80lwwh>;A;{nhobaiWG_GuCbj_rpZJc#FthN|< zZD4sk2W?5Jm#YeraIzQ6^5idH9jt%po6r%3Pe|RI4ZoY0J-ohLmzt8Zfp=XkUhTTX z;ccdWl(`SbU9tdM?r1YW6~1-cX}Co9>xqg`1SaP+cgp7T9N|(5%g5_ba>)rrfdaHW zR%?KePZh6Unh)n{VDP@&*V#Q+UHnpZXL$? zbnx*EN`{!U%pl_WzvO@l<+XZBW9VYJ3W64Id3MCaLG{VtgPa9F9sZacf6Z0%QHRIb z9&=c8Rk$T?jS$11| z^B+6!Ps|3s{uq>ma>RPh5G*Xg7BndH13=-r!B5O1OSr z(vh^TG&qv^NIF_*1`?yfxQ#!?&T8F&j4xWn)vQn_aC=p%%>{({9+gkwKn|G(b8qpL zs9q}bzOp@wxH*kb3D~aF7Rn3^zFHG*E1(pD#wL8{UG0KWV&BzV)5&o#+6@MhS(6>&NjZoH{b)3IqI_D(>-qCtmo}sR$n;OlFR08s9oSUw5ENb*i}}`& zHt0}McEf2L*v8z}Q|k~hv{!3deWM}Rl^uf0wbe3f!gC)x-zj`B8mtV~04z8Wr^rftQ9_~(k#v61C zzmA&@B+;eosT4MT1A#-NQ^}B_BmXj5!xFngHol}{$0_h3`eVGPyIidG{%o35XkUiE zKIBun^N=an?U@|Oz%|jo^3YS|wM#)ahd`%uGTS*L6LO+DdGeIgUn$^vHMQ1|&#{T) z`rE4X;#J?A)%BG~K~{bi_YX=M85J-4OCF1U4PdB4ce(t)KM4q)QdyhaO)9ov8}MaU zvtLGioVn^mb;0io@L2G-?VG0J4cG59i1j%L|9*^E_YB&N$&utrlp9bjRw})mFcRB& zLfY@*#N%kb87imQ{Oq|r^x_^MhDb4*@yN#RO?yyE`{=*f)|RV`j1sxUQp}}D?*?HL z+&7Z8izLG}WF&;+^glqR^87^1(R-x4W6$w%4J>T_A~klBmJ1s(F~ z)(cLpftqK*6_PSP`i9e_q$^3^fod0Dn&=x|EdX%_WsmJt+OSp#3BBN{&n=r+8W0#R zj(<5RaWrC&%6xe(MjeZzY394{`PRf+cD;b(&+tD+7N>Bp9SJnN)X~~ zOEy-1NW#RJeNYsmZ7UZCe`!_^KDumBt&!FK19FIqEzr!%ysF7kpqK_6zl$i)5F zBJ_7(#0##_ObH&sX^y@yZEExU8o16o7bmDT4K&KQd2U#EwS`5YRfd%y11n5KKLMH08i!}uI z@aM2p-*7l3!1SlEYjviuDT9H%P|W^n(OPXvmVSzOalcqY&wpU^ zG343x)ctwR!J0^O^W!MYhym(L%cM#1Htz*A>td?yTBk&Y0*VWnX6flb{v^Fu*Yc96 zOPb6_Ho}#OV3g%vFwQb_xl%(V4g z>(2{lyOiiPiRBTSap@Ox>yMW-h&?I{@u@0Vy;q}nVlCTJ!QR0M=OXgh=FVoO*NW$J zE*;q*5{0(pkDMW&>W9htqVZRKnk&9V`F~=JMF0MTihKY?imB|j+!kF);_^lw-i;S7 z%{?Y%9=#n9=B&+NLq587;p9-5eSWr4zlCaDjeao+{s5OE<5Qn9U?Dv|T@4Up@`k*% zPrW$TnmPY!d=zuc>^U0UhK_`~G4BmFviHEMV+KT@{#yUcGtO*78p*plAWofOnNcOZ zMMCN^!863HyRbFobhQ^*$DVl5#~9iXOhy;DmDz1iDR3UW*EZ9}KK!c*4dIHhOXf?x z>n6WIA{1KF9MV#s}Q*~zo6fU^8I8~uN$HC-?KFmvbzGz z+~|g`Z@yW7Qh&n{owMuSyBP<&za?2Y=d__$Ry3wXZ)G$+O1=ZlArO@29covjmKno&U;3SREON*)%j#jn2-M(TK~^Yw!F^$ z>+qk$U`K|Ir6*hw@_E4B{x`SJ3FH~^enLmDB%RZBHA=CuEWGU_$=8VF;b&v2NI*{7 zYE4oi^!!hA?+IU2LwA!Oi>o3<&#FV4C^+X(Yne-uZuV!5w7StXy1-emu$e)cSkGBl5xLHeFXb^DOw0N$YXc;d0cu6+%8gMQC(zjFvCteAv zKJBJJ7FP`w?k~EoguNR~@!sCxhFRlZ8uGxCryjIV`}0b&id57v|0~y z_~QT@tcZ{rl-(nP0A%^=BF{aK#Ucmxq_>&qqcZQ7;_6YAnzZH9__X7hmUY{)kJ|}g(A7QvIpGp4H24aWI+U2K7Lu<@zS1TfV@+6HhqLZc5lB?%`%}j@o zffDz_@8>%diyESvYu1k|JPuM%`p;b2G|KRs%nn@*&VN1?=wo)2L?;6F_FD!LcE~*& z1FJY4#8z3`0xa*emn3ZDNcHS2* zo>CLr%%=C73OIyMS_1}^3a!Cj?2$ji<@b08poW`pTE1+%Ik|b4s!w3B*m^!urn~&< zVy8~8pU&?rkl!;SS};Ht23Sp#(9N6#T{I=c4pXe}sI!XQPL*F162FRq9%Plp>MeMd zH6JYCVmwst2+5l_XY0zuM~|dBHv<1PgX$ZthYF|T{7rfITdsHYlV8OQu#xTb9t=yF z0j6!MN=LoWU0>NGU1NvtcWiPfQ;(gR^9!l#6)6O&sBB^73$=74phh$3yqE@z%%`-Z zD|hWEi#O+k%_(zHJ92W9tQBb^g(=vXLv0!!R5AaWN4gh5s@hXQ@=sWPg-!+kI#7M@v zQ(YL1(y*|0{?jkiLNLXQ8KuWKNgd#HHyC#4??hIz6Nzt^tE{c1I1VM1fn9klcwoWV zPI!yj>R=s{XL*2z{cdOLKC#3fX*Njk%6A!m1hD!ToUHZPU!Sd)O?CjfWZorkr_$0m zCE6_(i_gth7)R1&&OtHJX;hh8)5>6*K#>9F#OBz~TW8Ex6(Y~^T^l}^n+G;d^EgU{ z9{KafAs_t`cK;>U2C>|0z1i8fUx)x-IfVqT)ZG{zgdW^ZDoq(xpk~OWlMJ)fwCmam zXu1A3HQ5gvV0tZl->acCduH$Wl)yfos%e?gN<95WKXoI3ci1y~PWbTXQAB@0J%8Jo zo!dsDaG{y!YTREFD6-t2NGv}(1yBS&)nh3}GM0ua#k4?uwkw7zmYJM^C+ETT93Bn+ zI7bUe2g6Ipja;4A!WS#C?e}T{B;Z*8j-~xCvzzlNcg`zR`8^fQDe ziy-3fGFe8+J&%Gn?X@<=2YJrsSreyRc`7Ad!4Meld`pJ&T9LNF_xSD^V_7hJ<%SFM z2>u2I$U6OcjK9r<-fcImQkkm4mhCO6uDH8~=)v(i0!zKkl-}z&42m(I{YyQeB6nPo zSp4w>yKWgNo(ENeLpvt!-Ahx1yeCAk5?YVWu{a+E<3`*mHGBVXH9Y)#oo_oxZfLX(E z1{Vb7Np8#i)*lg?e(jI4*j!b{O~hC|f~h{=?$e1?Pm-VgWvo1>`S5D2B26?*0JRsO z>P(ewWdgC1N6~tb?Z%*A-`~DJ_c&@8Mr}9P`CYDB*D?|i7%XOJM@77tJH5ZjiSa0EEz=_? zu5J<5);ybYGq>MWBzS|#;5deTfg1atnNObR*g^4P?t7jYKR5mU5;g~;E#7Ru$?At7 zM~0H355Xz;b#D5IN4=67ypD2a?oDfdjb{Ex21;JYF5qBoFqvPAoi94a*H5ZrpN1(l zv<-mz0Yw8wnkbIS&-%>bIQP(?Prpb1;w~}0G4H!ERe_hzCWi$+fmEjTjpi621KDqO z4P|>{ENHNnBEofQ*6@PA#fdk;h<$1pfM!~wo20Hb)sJqGL&ielid~Fla%%Fzb)L>H zIo?B@0in@E+0y1DsmO?Zhj+-86|yd{#YZpdx?{Ha`Y#??7X?m`U+{xlkGq2cz|1^X4NZW?@xqLO0Lj zI2V*f)nb$JAN>hEyRA{V@P_NGOMB0*&BmPE1Y*#7_8?VBowm}Gw++!7dkrd`v)qH1 zE0dA~@|Zz?cr|RGKz()Qi^#P6HIMV_VH%4y4NB+WMMStr$!q0RgpK-l?Wb{rVcPZE zmHma?!+G~3<%4SE!NACq&WmcmD}E#C-PPaQDopU>xV9qr>{WEjds6+i(miHlnFW%D zrq9i~CsTq4kPlT;I~W%*-AwEcf}<#Bcacg;Q<=3+_JI+$3Plf@HVF*9>C zCy=02&7g$1L%^fK`w^Z3vrwdUkO!aoH?b1XF$xzO@Vr&~eyHbZ7xt3Ti^px$(YsoB zXDNuGl$GeRWi81T0hG!jv?H>m`q$aEjUKffX`&aq+b}sInbZggG#rzZ>-ICrHUepE zoE(v8_S!Eh44AQnszb$YF;X%Jx};i>FhOuU4@VT6v{}hgebv|;{jQFJ$7A?gb^2)Q zp2rJvn2oX+%4Khb4vg^X&u%+AzWs9LqTYI_8=*k#R&5=@p_!sFV*~_XvUC856vJL2 zPZZ#S%DJup&X}@h@kjC08~uh_+e+99ki1gYd2i_UnO$XinC0)6y8X$iylRM;#Mgcl zgKjq=e@ylb6NmXDMRC6~In5MJ7^YkMZm;x-*#vuE$mgDnjuXcHh?^)XLl+KqM zRK?a#xT|5Uub-Z_=9!jVtmzNYN zOYh01(l!Mfr<}7YS)v`8V?(|Ti}#y2%C6D3J1=Tj(CLp!$!2sxBSGCXyU! zuFK~I*cTgQA!>3!u7_3TT8SdAb0ICLYQm#TT}munR2pkdxL<%x+`c?0P#pSurf~@y zL2l=nJ2w;8vwnxUj5JErw<)*9fyc?1XGLsEO;?m)@OXsoS6tf|?@mRNExZVv_uAA+ z9gqq(0R9wcJDcO36XopUGZ-l-ABppGhz#@7pCeq5@ZI09W15Tud;WRYAVTm??rk(hXaev;8;D*VxssqDr3S! ziB?x8T@OvykdI3i!t*&#EAL+%w!L0;4fNF%sQv#!XtQFD2WFtY<$|3YAydCuztXRB7@*_%jyhB*>X)^9U^18j!07>SgCRd}Qs3=dHi~lhyG90E-i~U+j5n z3^gCOLdOH^!s^WT1njv8t}YrYU%N~fZMoR*_XK?$P^e2VFKZnEi~Y@-n7qv+SM!<8(41pXvSADgX2xnDVdt1%fyn8Jx`2SR5-#}FZ4dS_bxLxP8NNz23x(8U1F zVh4a`Cqm2&#!%J|Ii~>x#p2fgIJjNNnpk~p0T3$QVgZMW-Nl47%v}g6-v45BR0M3- zY5*kuf40gtx?u}Acox&r|7;b&Cj+V1W1u-Nf&Ohg{1?lAs`01Hk^VzuLmuLyZ;kAO zG|-V=pdo+b{l0$eiQ<)^11$+aqwoIDMqkg}O>7bZE(!i0m&E9KB*1?oPygdt_8!o0 zF*zz4WBO13KQ1M`M!CoC7z8{t7tAB|`5%oJPhDhnl*9Z5z})}o)_yxKL#)dptnNY& z!=n?w1i4I4m_T-0fFrII|L(=y4{YQ)AjNR*wcU7~#A%s&UmZdBT2A7P>|1IifO-mp zTXWgBiXNYDVL)sQf_hTcRsXf0uc?@)qKgc<-^;Mq3X=HR1mLZ$*EfJ|9gS#=e`$RXhV-NtVW&D|lZWeYVXAIQ;NFOYse3iX? zpF4ry1fRbB`Mq-XU6Ic6=V?F+v9$tZ3jQ`gu|NQIut7KwOEJ7x0$?G2itVQ+jV(+0 z(a+yzj4{8U09J4q>eu`D8GHXGZ(C7mW8wRXZb~bFbS^Uoj_1}hc2Hm&ToF68H$ywa z03DC>1#iu(ofF;q8w^}c>vg(xbOO-T#*=2=SLkWWh>69Lw_(IR8=b^b#=Rwy)9za( z{Q%UZp)Bt>cb~!-+Q()Eq=nnm+_UI$ZFT2Gx;p9Wv?BlrEp0wW6#;B8xO&JT#5dH0 z?=*OTF6lppI1GeAG?9R>;(Uf-dx4&o(JN4gOan|n|01BSX|fwonYxi8IF0Af*#%Aa$sQN;(tk{9oJZvfqBt5xeSHGtC0 za~}$%6cNriN>^M%zW~tfVZ}3qeNjp6xxSaz7XODU0BAGyy17{V3+OAZU;Y9ki*dNU zS^-ohu>c`geu4Po3S6Pz-s>P)^1|>OAQ5tCKTVq-op9x)Xi)-67W%h8@g(L+?bQWF zU{se&Kpf-^<*8IU1Bw+b4E7e=u%6a52T%c6Dt*Uug^L(kUF9Q{{%cjY*3W*YxH6VyLr;8xXVBl1=l zjL`e~Aid}pi^ehMeKTLR#`d*1mv)F} zyWB+v{CJ6S*|xb6r1ZIu-!^k~=g*5>F92I_4EHP2lw zvRZrfR~ZD6c6bRPK)jMZX?n!&4Jmg-3tNM*1sEXT!c zgJ4+VKsE8xtW7^gbWPIrxV)(;gO$vAUF-;|*!!>sXkhccwEZGa>)?-E1D?%l2HkJB|Q7!Xpg0(%blP2`A_jT2z0$rDRw`1z^ zKs2WM&^^(Bya6~oK8)pv0MtZdU48Sw!U4nf=PCw_zDH^;NcH`xG(c1jcx!0 zd)+!!-M+*(Nd>e{KV`sQ#{QzWus82B8ey0?47Wc&Cb=77%n;XrN$cCLkIJktOv65> z6$CM8Us5yqn7`#vYcQxk&2>(TMd}I!%)g^mDoD5|7Ty-1_v=0YmzI!x(4hhu0SgrZ zLnE&E9j>Q1s?|JcXamr4y(zg$MqIv7{^mcjVMWGWri=9v)8&WdeoVrv*=72#yDOeZ z_WU2I6CpX#CUrg%@owQ< zLfUJ#Zb)ov9J)LUlrH+b2>{Av?;IxI=$FE!{>ZH}czMeMeY2_VJu4S*XBP+qUNz~v z0L^`#{Od`A6m)#O2O`1$J-m1lBdmW2J$9eWwBNoOTVM$n$yB5S2u7h`Yo5x1W2BZV zpd^i38>QbJkGVXIkvt+C5?=H~0y`uuYr?l2SLnXV5RlK>t3E1%tQw$IhsCyvkEo;a zT$fY^p^r-|%->VfV3-wNZJNvDxz7sYRnC|Dy;Jp&Zges2aO|~>JK-~P<5VE()RY}2 z?%UA6ix$0DuYO??w>8rO6j<&(c+{Lm7X!8sFTkuhlCbVE`)c;VFuFO4U-_n9KyDh?9Ep(V!juYTW~$}hjC=4q-OV;vx9>4nh+)W4V7pM> zV*{lJ$kZCbjOEE7iGpEZR2lARR&z~Js92R7YGE7vT2(Z+UCVpf5+zDv{e>%+6Mzms zy=(&l*p%d$E-aV#JQzuK$YsC}Y-u@a1?!xrTQmTm$#^ZcTO@<9+7}_w{9k%NKu1|{ zrfvm`q2-tsfh#;7`R=sfeRCy99C{lb_|%#|L1edx{~-Y-7H2!En5ejii8$M6k&)cjRk{hY_sj~%s@(r-#Q29WDjA1n3d|q{SW^g= z2nj7@HL9>^a-DYMfY2>|fDJAV;-KTM6p|aDQ_86L-hx+KVJ%St1T8RY9X@2jwNB)> z!6YB@Th;)0HvhfdDlodN*(TG#&Wc|LY~jW0>eS~m0$D?A6!Jzl3f`gi*A+jpMjw?0 zGk4Ut-=!J1{_#)|J)jLidGS1C^g5@O5zqw-qb%R|r%N1Fbti+5r?bLotn{6#ep-1( zr8-#dy_ZN2@eP>=V(8sl|0K`P8DeF*dntHS9{L4%inc^BTj$I^mSC2zs7V@{#eoxQ zk$cP+H)>~-6!_T2j$oMR>)dDkQeH3eRPRxBheG8>GE{q11n)d|$T`(Ewg+~qxtn+v zjmN&(`Mz<=D|IGYO`IspZUBv>nG`$WRHqOKcs>vJK`TXB;5emsyfAlS;8a&iI4sfN zQ;1IKFqFN^6YuaRKpKCX@&Y$b`5KWETM6n)>s&zlx58_8sCp@_T% zWuxliQnQUsZ=KxLWOBR#yfJO0;)t#k;#sA10acKnist=Law{qWtEiFZrL{b+#WLsL z*l?NT-oo`@BrnepW@!{wU*40WLjP!{Sb8$w@U+4`^>vPL8cv?CJ*P~EmR36De2w2`S`Cj_epOd%1&VBW@A_~;HQ{+DXC9V# zO2$ZfR@2rVIA%w{IblpmZ5J~!qY$~egacbLT7Z(-9=aJ;{*Z=eYK;?{oG1JtKO|zH zz?R1jP8^%T)1_&`BjMWGVNv)VCJ12Hrsql~HR-Cn7F`0K?Ko7g>U2ZzFEiGs*(}^$ z&W{jctlxDc*RdurLlu9ZbmaNAK~C^6xU7L^Huhotbc@Uyks45D0UIg*Dzlz5Q1C;z zW63G+K!Ttafk|4jn|X5vF#ASZO~4JH#8L_Lph(VzDlb{WzHi)NOC6g35$s zDut>izLS+;^%+&ajm145yZ5pEi@!1FMl7GS7H4@e4~6a*Q*CN0bx%n6s8V0f0P_Qf zbZFpQAXJDsUy=JPbKq*q`%16IU26g72tsOZa0_&hY!&o1^ST9z3yTu9GdqvCV8n@! z^TA>MIS`?x)NUR1U0x{T5*QMwe&z?SCoCNZ&zM_QBM3LO?GkyUm~d|!M3!Clf#DD2 z!6e2iB~T9*#~w~LnvBp|5retA23gS_zhSemVJE)grIRIPr5Gm= z&CI9S>WRHJuVBNieB%(M*2e5ebnjk*0iy?`xeje4!%itYKIO`!xa*tdwj-dcf1PyI z3ss;`D^ap6y+_Mm%HiaZkOLo~JKSP-@;@lO z+&WmKNg8&n^6I(OP(;O@Yu$8agMak=d{B@w`zwc4t;MUpl;PO74^Md~a%qmBSwFz9rWPulHmYjFn)Gm!(D| zy5jMkh!yR!_@9=nhQ61&m>JfkW|k)9bX#S-KgC5U7!XciK{5%<_XT*$P04~bU&(n4 z0abf$rCJ5M*@YK8mQCr`IkRK%^GJPUks^1Z0MVV@C_Q^fICSvn>*$cmNNivuXB9sv zXam?L0=(AXA_oW|cI?Y2YtlF(_(W?iKuW-uiwFXZ7zER?NEnzt@)v6=QAcOZ`}i0z zKBY&#I4*WldaX^l4{K(09PB1VE8JBK9O&y62z8bBxP$8Lj(QNXeS1XutHcdzy)p2C zE_A=$%%+;9C+*t$cJ1rTl#lZY)3QHe`r4Z(fNr)VOM~vvHa# zkzh0lQd(8stDt@u*#J0L>7>a;Mkz={;Nw_I1et|`xm8@byBf8eDd#(-I4n-iRMf-WNIX)g za>&<9uCCdjISt(?A?HZpZaBRFWv|B9;#F;3|9VY%E;A)g&R$dgY&n<_6Y-Zv$hfA= z#o#-k5ik+ND`D>y4Jy8n*{{K(+kTn3rcn&b69dGNqLd;>@+q99vtLMNEysBDT7$m{ z1<|nEvIowCcQ~xiB1yZo=o&IKiyKr5`TL6+VOpT|NBybSxseDt(ViFjYR>})D*jB@ zFsvw$jr~LTNHwh7(;r?pq1gOXFw#99rGV z>Nxp$g$6!qDgt_sLmeG-Eq(8(Md41U2Bq})uqy}u#cd>8c!O$F{p-hLRXMFag%T4} z2j9&MN+!rF;ufx71A9){9Cukxjd?8>SZ%vrUOxeW^7wk**N1#oCC4I<8=y-8lmtL@ z{7Wngqvs?mmX6KKC41lfZHq>a3&E{1%Q=25toe$Q(o6iOA4rBNWbj58!3Bl2mB!juT1?TGg|9kC6>YV(jyjl(RiQD*ib+Ts_6cwKGUa^uYJVmSuvD_&_Ri|&YIejU-kXk~> z2)NcAuH=lj+I}o07mysUS#|u0PakqTQTD6l%4;cw!ptD+IgQUzuYMyq`B$WyNNHHV z_A`8Rkmu{h+EHA~Opgoo(aI0QS|ujcRfNW>`;_4wNctCA>L&YUWw`ENh-WlUx{%xLJl>7khcRw+pfB_dQ& z>N4|ug<^Pf%^0(f!JzVDn)Hmc{VR&~FcfZ29ZHUkE{~;lif#UKoO=JJOaT6h~nQ7y&|N zqxVjPWbPBi7OvLi7r1E6o80EOqE-lGFQ?g1SyB3e)WM3$yocltRXXKcUVF&?ZOt6l z7mC;CIMfPVSg0@!yxpjbO9`x(-O1Y$w&#&N@ZowKha7V@!pN3=&Ipk|d1qXoeb8Z~ zZYP3jeREacOVVV93!1}TY(_;aj8-MtHaS58$7zHq<+H08$ExodX1}eKyU?ezWWu{0 zpT2KBG-5Z^E)b%0^2P*v{}5*eaEDD+0=HZS2+&XRx&+Dw2V0rN17cp}3Kb*=GDb>? z3iVJ|NlQCtL%*Iy_2JGWRJ*R$;v!JLRR*SYz_`G zvL!Qnlu=>e5HYuWeHz6a?Rf&lbd2x~r$Spu;tUG}2wpa=_}X_Wo+6cTEc*5dK}FzNVp5 z$_qo$q(;pNnnZQ-;3!YciB86`%3sDoIV;8EH;B`sMQ}(inZ;3zDY1*(s-EJ44jriC z_D?xKgh*g;w))qj+E5mOk*LmM{4x?py-k&tZ`Tm|YhWW0uw=xXfyW z%<)1|O4)Y7m9i55ErOY7Hy*Hz`KJhP2s?ZX9=93(h`?w$JDKqrsxqsNowYSAitV^$ zaK|=p-*&cJ;(toqm{ZVB7zlpz?;oB;9m?_+37?$ET!S@Qfd88b{=SEOO#-2^Cs|ZN zR9u41j;89S}SdVRxH|ODK>VXdJ+4vh|I^0C$^x0ZM%8<)%?*LN><5uh6dN!(e`r}X*Y&WuK}@` zTo)#|^#`AP`hH}9WW3??Up2lG&zqaA{0%nPTB(i-y`=oy=Myl?75;{ADV&~rU9ERR ztF)T-X8BJ%gwIgVKOjDuzq60ho_(mT5+t6W(x81mV7WwkW=lzaD_LfPU#O<&{J`sW zf3j9iNsMHo{%%{F$Q6Gw9!#uF`4+9~c%92jIJczChNKv1@%;1Q2EOG8^s~5HV5i^- zshiA!%`JP~AEZ;?1F}5`?5?|iqIwzG7yN`}0@pcm0V#V|xbj4c41Zol4WDIsZ$~{0 z2MJ>#-e-F-PjTfbbpv-8c6Rdky}y!?TTM){EZs{b0g z@u~lx@d(rU-Uy|Duh&ELvR$^21-?zc85F^@`Y~^5LnOf%Hkh9>+LF&DiYxVPkGH^- zN@PIc^PGT#5|;b>Yz9tyTP(eq)$oOdY3tHZ$&hjw>C9nM{_f+8(F41q>km4}Hs`&Di*b-*I#OrJ|$R5Po84+IPA z%a?Lq4X~*ZhPiB29aRx`_1OOgv>EKX$CnARfcGzvf**d>tblm1Up?ovdjumZ4w|B7 z?8%N^!_p8`7dNSt0G$sD>?g87o%@U(KR#z#oG#M#yY&k_lG1520R5Ax49802gpGd`i6z2kh3UMgZnKh@ngRQAMq!C;>Vt{b5vEM)B~~S89@B*TlZ& znz$jaa7KF)(-XRlMFT{t4&szoPIrfYw_(^mDFz#Y47iC5tcP+^3c2#OAii|nX#TjA zfP^Kj<1IlA&A!BDd2OjDnH5oJI4_jb3<#_{NK|1i@e$jFDB^TbZxmo7sR_5g$Gpgf zv;d)Q0W4sFV)%V9kMe>gI^H7ToGB?n7!^WeoMAxu9%r`vP1Y@-cS_4D`SmqKl&3)t z%NJ1~3n9=`=gO<-L{H&ap2Y9J1AhBWyf0?%VF~h22kGJ`CnuLH5b>Tj|GjsfhO;^j zF3hN@e77(J1|#E^lZ?+g&^0zhrk648?#a6hxl3(-!i5bmIOrij-I@!T3ThN*`#z~} zVIx$yckfz%+fBZDY!<5#g ztw&aPg=jGpJ=VEcELE8+m`JGU_*YaE*ko(;9S>)&k$&9~OZ#AV{oV_%* zDlptO-jVz8zTX0hY_S?QaEW35EkO+EPQvS3RqcbHc9Bqab^L66wwi8d*x0MBw)(4C zky#kX9?We;*a*u*vc}tin0m~?2bK*J0<#?i zS^Dl^v-lh+!u$;Kj~&1fzpM7X)pnL7ku8<6ueH_aN8g(7ue5IP2V4f~bRmlHWHR%SC3h;ds;Mu!u5brrR%~x;11>DGVvv-mJ<# zrdr)ZO5++F17oCqapYiU#3f6Vp3LL+9+W^0;SzBDc8+0J;#D-7k#-2`%cP**({8`A zApsZ1zYY66o}0}sM$$jSxGGc1nE-Gka%n^$y#RF=p18?`Yi&VamU#9UbsqU*wv#V1 zGAo(NxO!F*Nlt#a)vjo^h*Aw3W)__+YGY+)&nG2hB*|=jD(HePJV9sa-!N_+{|#EY zR?>f7IC938GZQBG+B*h!MQ^g{bq7$gCB5`}v$sJVRuTmz)sx`+)rW)Tq9;VgUxGcI z0WJI%FIEHpW&!#Jnu^cOjXO&|D0cug)X?>w*q{b9&Et`9Ww1L=( z|JxB+CiJOIhPQiX&C{-~M*~P?^a3m=a8`2gBW(NDW6>e{(lrgM)Pr zmSpteR?!ia2Pdi^;e{&ns)-Wv2Dk;LWQKg4TBhGsEDLKN#_tQF z^#sfw#!J49kuokb+QL<}UoO5%)6C6IcG&yqTY;44<8T`%PJ;O?eJ>c9b&)J?Wtqw@ zN~b1KWts0atWL9SQ0BSz`Jf9y=?mY8mQGiT%oX*?|9pt6)Qlc0Bh0YIH7@PFW2+q{ z>!$_UF!7NPRlIaXPRb<^NBM{AkT@y@9m0cxg5Ip9)2&S#5%t)U{~!?y$Sdh5hh1Rj zY{~Z|HGlm2d`tZ*Be?Yc#ZyFdo}nicKkOxeg{7lQkyggfAP*^!w3q#_7XS!N6wW_A z;(wiDm+>`WjXlbLUld$5{+s3a3^wfF)$o5%62`zmeQAXA;eT~9|FuBsl>77yvE9+r zUj|<5|HFlFRGvi+Y^DBJqyL}J3^tFB5d7!A8IxxSz>8h_U$&&6@&vp_^gt`fl8j#b z@1Kl&Y6mH;-t=y1N&2sq{Xg#_@m_xQ`ThT@+5Y?UxSy#YoY!_)Hrd^OL#WR&8QA{+ zCU@dnt-N7}ZeZsy{AE<=rqHtlEdC>B^AUeezI)9J{chRS8g8AGu%WaO{oVPoV^DnF zj8yVxu4J1D#ZqMyMO@t6VgezBY|pok-DU6EOh{!<|G0s^^}%#IfJ@AM0C@W$h-)TF zYb)jjnM_lBH58gUQL`(!zxrJ5-Uo4rz!s3pb}hrFu=kx1-24Z55SO?S-@;8#kzr; zK*Gd{1R40&auCX~1r@xXo&z!vkKqz@V%iMsN1HA-=Romt_O*#D z@&Z5_^*n(KP}&B@<97(i6_cK6C~HAuVxQ**gnG|CETGhYw9RJ2H)jDL(yJs9ULuYM z?HAbK?Jp>(4KoG*0TDL<)$p8lX+M*hn4NMMnFR0jF8()ntnF^2>q5|{S_&H_Z$P({ z&EjT9K#j&WMHwORk{@PR22bzefZuk(t_TMi$Ad(ft2HB&*Jn{_-}_vD*F}4>;4qfF za&~{!9H7V;&>*k$-*U7N079h436yHR(+nnZ*aSX`0+MxOTi&mu@x?iT?;)9& zEuctlY!dU~U(uBY0a?Jy|COg z*9C~fl|%GP*&)zKZM$vNPZ`=yc?L|HVqaeh^9JrcAu25iE2nRNl~!P_osz62S)wgq z$RpqW6tt#ni&6~v0laE*IPpXN3e>uu1}o~G>9t;5yt2gbyx_GCs16QjUkKEh-DM=qd|GpVn9Sx{hQ;JeeO54gL ziMrEV8?dXH2~@*FuHv9K?DOvnPp)h)W0yCSNP~K|nHiSeajKdZn1WQ;})~ zDVVp!_H+fxS+&Or*#N-l z9WxI)%Pw-_3G_g<)%X?cpVJ~rDPrGZ#dcN#!bcVXw`Gvc0DZ2!>GlW^THhba)EzPW z2AQM19yFuREBAroop0Mfh$&ufv*??wc^`eh4>YwNf(i}803I6r&QGi9LBZ)T;8sJ#wtQR zGkm1uu;|=wk{4funbyK!L06ICsF$Hqq8L841 z@B$U*3cH!F z*|O5l%qTQWKQ{H*D0AtJ?RayML33}bwr^;Qv`J@O8}Fq*;5SZ8WF1mUwvVq^ z5u-25Bencao#ue+bJH;$Q3Xz>$v|##CowG}cb-?4p``|DE?HVTGkQJcUzT`%`RQB!&o#h6hIhfBZ=T(z@efSq7@~dc~62l9~DgmNEqTfYiXWy+b zmwBNDX(WyApkgd*lFC#ZeLZ7aAUj$q?>30y)<3QCR(QG1uyibNJR%_l1g4JmOzk)} zU+75b9n#i1&2q2$^nNiithDQ`{VhyKt6DE(AmdnlJ|cTAel9JG;o(`*y~qY@?+HC& z7B?D{omA<&9S4mkvTu6;vtqvFP}YV@I7N@ljxf|g<%W{oM{?#H0>Z<@p`RZ#-e2AO z2B5Tuo9`^@y6WY|Bg~{6MJ__HgQwIZDytLV;bVMWe9qg(Q(QcI;?t~JH{x;Is0=Li zX08;8>nh_4eUEDnXsPZR0`3C-GKY_1X&;H*nO?J`>Pd^^S$<5?!sKqbMfE%`8m70xe~Qn z0xnEA?@aQfiU&2ZTZmU#<6N{>B?v%_j-zxk7Q3;Z-IA+NmU|Tz>H_%e>s? z-soQN#py5cUQSHZ{xzsri2Agz2Z!Lx(vHopNX{DenZw(F6EQf{#7m-7`1Bg^A_D1! zZ>uTw;uE8xvcsF=+xj=5C>f?$_N-)eIH?iBA!r*;1QVBc)?_c5Qx&=Uav9N|vjsiv z`M)j{X=-*!cEXK*K}f`R1MtVx9BT(Q%K)`*t&HQ z3_{Cq-Y+DwZRYu-!%3|7Ucc9Qtk7Hdw)T%8crJTj%s#J7V_ewq;B5bT8Tlryqt0^g zpaF{`8LY=zgE=oNRH9qW$aW&FW8nIP_m`YwIo~BMN#e@)?5KdQwV~*Nb&LHcNh^k| zEMtx@c8abE&e72BMeHcjb21PYxZ1VoU0M;AwlxW&pRZWw8|n@Vywwe^M(t_B0qg3X z16Ov~Tx>rKt7&i(mL9yRS5wz&m6uJpZOp|_b}*VE&6I3p>G9!{E38bRa-t5QCqOh6>f>Cn=-SDO-z8TI6BLz zh1i9zd4gMcrCaLcE5bBw7=|&jAc&*Y>&DNZ8g|j)q^^55%ptq8>HQOqAfqgB0aC3` z&gX=W4Vk-Z*De#?X;0?x2AU)K!-E#j8(K~49I!?xPm%d|A^TGpwpR3uOUbzIiA&04 z3<|RtzFoA|g(#wk+EJ)o+`?C9%PaRA4N1#5G8}E4ZOyHi)a!n3A#STw3Ph9TfV=O8|Ld%_QIbp8fCKY_UME!rrf&E zz=fE*C|WPV=yH;Lx_*z&BI+A$x?(I8mY=$APfQ$6C7);T_HJ2!BTxg*uwatOR`lDO zv~ge0AN|%IG(Ft?f1Xk~53!CIb1~!w!Cm z?gqP3ty5SoDf%2=+p(^9)oe8?BxmnbZawApv%&e4D2zEwdFNkrQ1+Zou{*TQD<|m} z_Td|!(5K6`@|=P%Ds)(enQLga!deInyLlvB4IS7aJpyN(MO68GpB?_#!&Pc` z3d;8Y3!RjixaXcOGZpA=Zd5KeFV>qSbFW;AU}ow4nn638MWrhV7YjC7S}(SRuDGxE zRzVJ0a#gzU#ySU!&kY7a^W3>bQxAQW{XbU|NYgnuVkjYJYQT2fQdJ#8=8QByVrcjA ztT#=OeuKyl>_cJq*CKC(W;T5O5^2)cI`1SH@s4R74i2wAt$8swwmGbtaLL4g-L$>F z$Hk2%Evqx`bdaPwMl!>FKL-D{L-=Z~?M+c<3csZ{$*$JP1Fui)!9i~N?}NN+6TdHi znM-N3ntvUCm21#i5oa;U+7_j5-SW2OYsYJHUVOuX7m=3~}jQ_1^aBLPJexdUkk_z7&0Oe+exaw;Y?xBKdD z&k&v;D6jIqpFf^#EVUk7q~*LL$9zm3CI7ZA6ENuu0Ru|yt$67z%pDV5`5I4MrAj`)&9WkgM1E5F9uIBCMDP7j{<#dV**n(D@zMG&E<;X5 zg1^BdYslAUAA2WE<;L(P+ET+vs%k_o`&c2!_szbrxY^nD;dhc%&g|C5{A2n9OYrMG zyCZe>dKt!^=IB#&*E5+I}Kz9(;P_i?7M5@yBs7PEv>2;)TreBHHN* ziLKtLMnpmi>B9q1jn3nVz6yn zJpvajphP%v94!o=h?m~{4>g&v;7uO$ z=Y|+QGR-9AokBCCyerF}`tMSU3E!r>ptkO5`?Zh9D5}_ChK1r!&4kS4ZLIsXqPp;og?DMS9)^2-5{nTvY806KL+gaw z914K+;lh)@x5`UIL7w)^t5A@m+w4-NVf!eXd!=dX)ICtly)R>!b~%wHoF_6wn!kb& z)?-4q#oBHN+n-UOv_;Y9 zGAAJxBTl{!2qKPXK-jT_XOB(NR+GVK3h_Fu*)3uyf!iaHX&3do4Q*zz&R1~EOfmMj zb6z@zdn3YL&pL&oX60Bp?|Bd+_tlMyY_I*%!$hrsapURHK&6;(8G*DcpAxh2B{p16 z69tS3$n{gN8(!N%D(#Z`yr|B%5G+)}W|Ls?ez2(dI1bb#$94S&Y4-arcK43d#=PbkOcf5&OxcNM*uLo+T$6JEl)!JU%$Z8{j`yH~9y zwQHu@N2kz8pIc}e+&F)EN9lV?tAeF>deoafB@y}D?tKlXbS0Tue)T~mVj%sU;MMw6 zk`1RyN9JJbO2h2tdjW#Ztjmju5!k7G5Ic(FZS{(LzNtR>Foq6s|M?soF-SS<|HfOY zQ{lz=t>POGTP|l5^ZBKcdj>F1NnYpq4pA$Cf2oz@n1O0?9p=wWT`@l2J*O&!#U?LB ze@H7!JJX3(GtL6ClD&$)_8+jM$bN>*a8yvU_5Fc2u;-3@-Itu4a*xK-k zZ0?%nGWC7BPD#%u>bc+2b%eh{e^E{Tg4~$(N81eo5_(ZWKXM!!V!j6~BQllGA{m-{ zUZEyuZAG}di%tZ;Xf95K-R^eyWtE(OPg)a;>FxPS22*jJy24D%dac>7&B$#(rrPH8 zCBDJDZ+vI{#}1Pc=i|#1;*~&QSxfjP$5?qnI5+2v`8v$*=B>(%RC}1smg3kzz!>lR zto2+K%g}G`^yGH$nNGb8R@!#Zy?&l4o@q{jvmE`+$z4lS_$Qf9Tx_h*@2Z6!1$M8A zsw{bnb)h$^E)-!smwb%NS*KW^&~T%fun%beq?Ip;qk9+?-gL(t5cl0`C}5GKuRv^f zL1o&%Il&PY#83=+qi$mSO;L#H0>sc_+JQDlTKHCS<0RToQ<+E6w5JWiwUg}?Ojmp|8sE2vDTPLiZ?A@%N07g+j;fFL7N z(LU@U^GYhNYKRUu7o~B{MM&2`evWV6Ec%vwgI>kH09b22vBz(e+D)H~s zmrlg-VaqNTL3yi5H@nsIdb*|tpWTZS@H)g1Ks^8i1 zK5vkk6U#P-auDc2-3v4DE3|X9b(Kf;_E^+Jo;e@K+@*vY=baZKw0uxOOE1S98C}(D zy;;c)69vv@Y17>wo$Q>j&+c&@k;9gsu1a4`VBV$LTp*LYM=e_}a~xy+Ca5h^tS8aOeNH*!|KGUcob#~)K@}-Ys>lIpg zCuxkW%~=J8y#xnzHhLomdhf%tBam!ka$0hEld|1@E;`z0*AYW5XK1~j*t8+{-M_Fs zj;9`(=kwRGX!&n1SiKGR32?1Qcm4gGdzDX?3vz^r)9)6Y&92EDM)hW4mJ7aTU!J^k zDDBsc22I#qrC8qw{?X;?BaWVJ9|BG5cOa1ZPjOa$wMCAPnOd|@{^N$A zZI7B~dA^D60sC%fF`+NKW>Grx7X=P1dS-YCLrMw$n(V*k+F<}IZ9gw{$# zdoY!mmZw{fc40*$I>Eo~MbrnK=e!-%ynY?OivC~@v9;eC5h|Qas~$rr*sK?bp2TBA><*z$Oigjh-~Z zkSK5iSG_;%DNg-^yDp`ig4MQKwdP4UgMp(DM>NZb9SUwkC||r#`|F0vc4A7~HF{9~ zFy~Zckm5Pkm)u5nbJz~ICKeSx13{w8BDr+Q1^Dy<+A@Nlz{eKp7W(*;U_@&QRo22? zsO-F-7r1c^%`0w=*(vu993LWH@l0N4daL+uOYxp)+H_JH8SYJw*<{^8VtFwiJ zAT0ed($|o3zfjOGweH)iy04Ul3XjO0N$^|c&sT+s{n18D1N7ac)ynBS;=?a7cxRT? zm#6OxCthEqmNS%EQk9o-be$Ka9A<+#>V9s*l$X3vW)9<|c{A`SyX(z|(r{r1n=C(> z#9KDKbhoB5Ob2^c9oI6N zrpApb+`Q|f)PCay+P-O}vBR1e^yb|Yca&E*G$#jrq?S3_B-7oy#Jgj;mUN_J@qY?Q z`>4MYqCp9Yv3k+S3bq+DF4eGL8K$z0hf~)2J2L#T?QGXC4~I&9{=$Yfs|DB9;#tg7 z@O<%2L@OCiW$s?{=dL-f&E>uunb?HiKZV8Bg$ump#ebNT)fBfsiW!-?7(8(uzRV;`FjKEJd3R7iC3 zPJirahC_x=eYZF>a0io*>1IWnagxn(M>*iwR4Hm+O8jp@3L zx_o0p6x05CSxeg@0sEt{$7jAVEI#-d>-n)CBgZ)4<&xAk?p1QeZ@gvgIX;%k zIcyEaQFc0Y|Gt*!)fw~tQ{AE1X{*pauLKYAkl}Cc*<3e>jhXP23bH_(3K+@^R6!>yF`6OL_WPg=Cxq^4bbt z8&5LbE+}tIu~?>9HCN&Oy4_nX!cDcrGvKH7i-h)rE7QR%HurK7!E1uVvqu$WCTIpm{i!wER|mpogcKV$;CUH_}*j#E|IcxRE|PcNcSZ5pK&i$I6!p z{Ue4k(dCS*7M0F|bJeu=2tvosBT`Jwa8#yMUqO)E(B*x&?d#pZ#rMCOYZg999y)CH zujoa-FqXt|X*~(_Ic%N#7GMH3RX?isX3-W+XtfPjsPVw;ID%YQ*qI3J!9X-}mVm&y z83d&*{d&ct96TVlto_}2Wxs7Uv0DtF^^WVY6TlOl zhM-O**}bTN>7S05_t5C9xH>~6CRQtugb*-vUCiDTo15Wf$gFj0sW0u@ABc{-Fs%sw zcwJM{nYFL#(}(qJ8e3KevD@w?;MA(>G^TJfsEV7?TB#-aMoc}0d&u}Ccd&20e)^;}M|Q0DnkhavV5}!#<*VN!-mT(shvYBkS$MQg_07k!AS|`X z?T;r*>hn|hpZ5A_jszq#TYTi(!>=-LLE7qTPrtXfx$^x`c6?Cg-m1Ae#G=HCz#^`) zT5IXJTc?ooEU?|uT35*aC7^gEOEN;Pc{o%Igt{kP(j|8K`1C3!W%jEY<Mf_T~lk1a>^B>s`Z6(EliXrX!_mqR|G>l1q-TbBF{YQ?RTgcrA=4ko{1jgmpLDr*a7^s&mwH}!nxzGsy53MzqGrC)?G`gVa^ zvwA6-FWb^z4zPJHI}6(e<);ihIvG*lH~Bx*kL~kULKU+UgNeIgU1V*=jb;>ARAIU6mTF7nL-{evIx@T;UY+!uB zQ>=r4sH(=tH-U)oiJ?yd}jf zoP87@1#Mk9ee3dw5E^$W_)dN!@Ao_|Q%Ayk_&HL`oiJmMRqh6ze4DSFlmO&iFU43S zOY<`v&yiSPbmpCRpblzep>&;%lPvRX09B;th-)um;jI&1hDI;Fk7DS40;X_hE9*$> zp}#=1=a5UPhEKQd2r%@28%4MF+CKeUcq92umC{tmvS>#nc6hExogz|bu{B!oRw9S>Ez~F0fMv>k<)22i zO~z`UOCwZ!ML*i=GB9Qexy+|IoV^u}EropjqPkRr0iMq4UGl5$D8y=O$t=Wh>0k_j8qEiN{KY(h(qeV6{O!P;+ zmB1$B<6F-x5JS?=v1l_X~h9qqe`m=LAaCS%g=VY7sX99b zSk(r&-?Qe^bJ~6ZFdXaf%c#oiw~Yaa%dsp3yk?clFQ}E}*+_!<=rlZ6Kc~tJ`<(IO zYIO$O=*3+YM}tdnaxy53gUc>^5TMK$)GXW=v&mj&>Hh(**$U@mvaxLfh?^0}HW3?^I9f`S ziFz!4CrFE}XBUuJ77v@81mDg*{+!3XLFuXxh@rm@JA|r(l%JpHrVOm${NM1^Zf^31 zs?J9;Kf8RbZPShoTql{J-g}Q~FC!~1>KNkql28zT!kqufcBD~-9H+1CB2j3P`zDff zQEm^J2Q|7)DrfDKZ7N6(TfrBF=D;9w(m$&~Gx{=^;qooBDpll+#X9WP&~%J5QgbBS zu$I+*Bj$)L9ZkI0vqDAhc7wA~%kRivqITbp7vsjh3{7Am^Ux(Ql&CC3Ggg^*S+Q@d zeC`{bYoqSnZ7z;>+MF-wzbTF2W7|)tx#x2Ys+DpqHMR}8;xLU z%|mM%zYZi-rzNoZmUTV`{p9k>FxB8aGZ6}w!`F3@XfUAT+8rUvdN4C`JivtmS1(dy zCbQcu+yHW&q(t(5&c3}e1nU>vSJLQw4AD0)u3RhKugZz77eLcfetr*Ovy=Yyx=a%m zIx2pHz8tRz>C0{y4**|l%EAm)ByWf$Tn^8N3K%6j%Nr8o149@eQnL?-~QS==0X4E2Xfy&jT~@-yh+@#G=N;2i2~op-|y-Q zF?1Kzgzln$OJV0@fa1Sontj)9C%r>kYM^fPUBX zIvHd>!vEU^{?88~whi|$83catf0`t-5mxuiY-kDhzrvxWKiNM(sO25lvj2Nz{jb0B z92md2$0y>0Fx&H;+Vi*w4OW>FPQH1;h*2xQ``vK!q z{vrW18SH+}O@-PGa;3J$RfVcZ^ z?^D`$=n(ir)*c$^XA?z~%zr5OPg9LCUlL<_86?w0>1wos{JRfA){^ z>BQp*NO9g@oR9~$AI|x${N?9>ZE3i^I;#40khSFka0lK5c-=D}z>mFu=PyZDz;WYl zw`;5w-Gr-HjlatE*HV?c>Ax&u$!wIRh7DUxO@b2Cn=m11zQAAo0X?e^ZOY$0YiY*g z4kk(pL1N#(7Rq=2kZ#R&kOlzEH7B_zmer(nZGLyccGQNOo?uOgidgPq}224L4 zaCnVO2-TDMP*D1dl+z4A04v=LF6Cj~PZxpVMi8(oehGqu%J15apB#Q4 zia5C4(+95LM&^Ool^@-ZM%nac(?aN91(U@(V+#PUR)7>(C;<#WQtfG8Lx3^3CGH;q zzHbbpo?Ac13sL66J|`qVzfXigp?gzFFGcW zJ(7or!+S=7%g_wZgA8FEDd}W@#W`TX?b8sFZKptXCPw!G5$PCa^eSW_hlbczYemXj zL%)Ot&NvkBk0<*>gX;|R?!GC1+Zy8U1#l%87^r9fhorRo&C|dvb!;m`_idyN8Yi}r zIe+??Nx!?7T3~%F*rnK zYR1$A9_Xo19M`!qzO{TLXAc>@&A*|?l&$Pu(^1hqf)x)NU%7YC0&x6q!1}|#{^ys@ z3vQGcgVGt3{|Gk#K1^u%N;;wrr!1RblpKrc78?N{(?dlo!%k0^+(rRz<&YCM7t z>k9Sn$bVzD&TBp+0VrLA{#B3(dLUFZ#_A3(Rd)4C_~Ukv1t`_PC%EbOVe?q+EL*)M zGV%F)Z5sKjO~2RESQBS@Y7}s;V3AZSMr|{mKtcAfE9z=Wa}Tqh0e&q}SgdETg;p&FpZdZ6o%4K)(?>ROcS^5zbj3dHiaM@(zTQqZjL?|W z#BiO1@u>#im#AnZ}E?ph zSmn!p0L@9Lcyan!kIzCr=qD}a!NVol1$Zl9X-gU7h5-eZ-?sz&d*v}gW1#c)=z;TC znT3=eIW{@nqnkinY$`9keP_XkRpqRFNKmow8rGK-0&|)1zkP)R0K9aQpQODl$;$$Z zTeAqa+WCF0vUVIT%sLO*c2=MnUT0yPSwII?&qD6yQ}gRp`|P1CeM|vq_T4E8hZ^Ki z!2Wx%4t1o@=D=_W4`1_9HXVG>T`YR?OZ%43H(WUb9His-E**Z)ivl@V| zzY|X!v)(57+%gN6)~5-PDnO{w44%f>Zi$fYr?Xb>tb_aBi{+kgY0AEQ6cN(m4{oJ_wZo95qL&S-n6v_DFq|neiE7 zsMgV(+B%*t&1!&QZSYV};3v)=!R~vB>?p%W`PT>iZRQwM|E^BJ=|O6o|I6Enr(0By^>2Oo&ePhGAR23(azvxZ`i=Sht0!#=7P8`&)s6l$3@LIi6?-;6e3x9 zP-Mh-%4tcfUgb&pmjDk>$xkp^DDmpFXHTBH;wAxk&l3@!u*4s zTSQM-y84&zum7o0AtYB{2afyp1Kx@;Hf_jqpYGCzE!E)7r}oGlaK*B{;~tkb>`a8K z5!=qh#Ma2)L|^IX6^hPR=*?Ghpb960=b{`KY7k>&T(1mEKA6)&6T}CXw@G{N}%ktHASob~-eQ9Ic*cIU)po1@i`_htczG>n& zwZZW9u{;Zt-3PMUuH7oUof}|$wPQ%(H2qjeuv*6ku^T=ZF8+(2C^h5b`4%1+w%iLB8!PHH4B>8Cg+OjJn zZhD*Vg-fzA9uIm0t^TzqH{4TPIpck5J+1K2t>Q4+bt%PcSv5{Ll50A1O8P@LcgI?@ z9DAJ2zKFJKKqCvvw53|XdD(VoEY({pj@CWjE7)z&@i<*$P<%#>ro3R;K_l~XVRAc0 zS`=V&os5;jCFz#RZeapRFWSz-68|dXUWyFTXMfkA|P^yXPg=@-yk4Ofh z^^YcZIe|ISJR9Yy7TUh;Q|+54d9}l(?@m#?UryTF6f*}+Lrf9kRXOi2A<~f=Cpy7R zLv4}O8+El$qC?g7PpH_A-%d^T(fkwm3TRoS^%ba=UA9#|H~)!ZRSTIPm5I*nO&-%K zDZCxS5!5H!)yaP+eC)gx@a~(QUB(}bR!}h#msUoev|vp0q&I?>(dt;leR{Auly+o7 zMJZL?(v{$q=_~xDYsmWmCE=s%#+M=g@=>y#3xc%V`C|CuRC_STt+E0ID_fwJAbw37 zCBq)n$G}A);+b>0k|!9Q`TU3l^$l=F-hBf2rqV6XVmYw-h$2x#bds&SufWO7eR{*T zz%TQz!GtwCUBZFYCL`mHy&bTw^XF6CVZKTCxl26n$bgB?>>mS?q!RC+*_FRda3sg-xt+O`d*4If-I%9M z-<48xoW1dRx%l0(Q@QSBoajEA*LE1S^@^WZEP;(y?!ZaK)#04A;IRdGV)hE!n^WBB z0nN&1g%_AT4&@tc91Kg*ZodO-Tf0TzuG5C8fmDU2(DdVgRH3cM>Uth2Ku(QBSv9aXM82FU$Rr7f!%FE z%8tDlC?zoFK(3P5=mwRQ`KX#1%Ea)yS|->ns9S*Aw(MTQu_-dr^a?(b8Nn^9Iz@m>Zz| z4pdBiDnnh$-f<2~)a=aS)o9us%xM@{Lc{EI<+G^^z(reUBt?C+LG_Qt#lFRZ^#?3& z9*@!&OU3))w#@0fjI83iJWEk2=_^BYMRNKwi)~UBGz@mx@IpoASkvJ{vsbX@(m}*iu0$i%gCO4(gV~7?_g6&KzVKTZHn)~?A}mR$rD5b=L#xWB4JCxM6`S}?A9MQ+11>Jaa+ zo8h|N+PBHIYJW>?oph1GraQ;$HJo?V3mM_qO@;paHHBx>$-T0ge0jRz*3(b0?0#-D z(Mgm`o|?>}<7M=)8Qn@qvno?37_h#7{b7LhTm%4ZUS1WQIa{%g&!Av58E&z z)(b06w(}%o(YL$gXD{Jjhu@yYS;4W2nnyhgL*7NYl`mH3-#Nqv6MZR_NxGigEP+z* z%eb%0s3zA04JmlUY!VmNSWbu-uGSRNvas%}i@$FsF(OSyehe~21{J`+_HbEXseVh16 zOG}GRB28seU+(OND6tt@9*$DN>PPaSG#gc1^O+&|iq0YSeeg*nW3x&C8aXB)3j@Sp z2?vM!;AI^&(yZP}38Ce0TSd&SLCCoovG(Q;vv)%V=2zT+162}RMVcExztFyc;{>`5 z_J8It&gN4F_*7nh=UIE^Bc>I+2*jrkafWM@3D)@zj+DwXP!loya8PNx&!f_!d3}W1WT;h1KqKEKzfeWA?+X>L!l1olv}u!%Jn- z)4H%vwPEC?ncm$c&0l6ImZ*uiWrrn^QEh(&38czq>;)N?24N?mzCcX47tx%upSB1N z)9rMgi77f=8m}f+cSQfvr>_l0OX&}<;4`4n?q4_^S4GcMhFZv*=5OeSyyX#B8woU2 z9e(Q?F`#}Iz{z(7=IATv-l1ndgZi5174me^^Ee*&WD%-iL%Ded4w|&iUB+kiDWtzL zCnB=lhjGhVyd*;DY{&}||*0PrGJQ?pmor_h*((bayRJm?UKMfBDv(ZI= z7+XCu?0F?iA?2$h=oZ{Ou8=4~gU|xn?cK<5v)v$M4|jTje&iZfG`0Sde^5u6@ zQdiPr{G~}eh z1GA(geJGlIYejrkn1akUGne-RwTK~0RgyB?Duwu!f3s0nw^i8!cfS!n>K#$`SczcS z?-^#b=ms78!bE0`40GlHKKzYvK{Oda$im1Yyi2eQ0`AmhM)bufzfoj~gl=1ac3zX} z7qwNhf>*vftYzFm!mPsYtMGzp*|7X7XZ7Fug$`g%G?kC?viLr`Y-=A!7hS!VHjv0d zlG26C$(ef=x(ANqveS)K+uz}DNJm-5jB&(d_Uz;`Td&p&qtpNfFWZ|83qI`*6xdIC zlaiGvj;~~#eH~CGll5SbeXuv-CEK~$+rT+6tS^xM#k{Qg__bfo&KFMizGB{FZAP~r zKG$Gxw0RG<-HSLQo^icQOl+<)QZ~-@4+{yUm8y;KV#1g){Q%8Nse*gbpB8lvb>={`(GP8F^_LjX$2+7`L?>(|*lf5Z%aF8;i zgRCP&IrjctuX=yR_jCLGS?@QU@p@ga=XE{r&-cEsb(LbE0*ehbfUBBNZsx<>7~VCW|BVCY)0l(_C-Ur+-`p zMT*KX>eYGNk7J)O_o@y<^5{UL)@u_TB_1rl-%7>~JEQZ|d=Bb!t41~7=lHC)00gl< zj^bJUVa;&}chS5mjC|*#Z{iwZ-ED{Pz5;sJMcPk>>*wDo_bLz+zzZpN(ne!$5hGIp@T(b)JhVY$sW2k=Q`Ls2FYyRx<4vkmIj*0gsy2*)e{MdVlU@!ip9ML0{-|$S~H76%2<<=|1BKv{R1N*q!{yfSg!Yr)e z!iRY^aS12{=kyny-->ePH=aDEa^;KDl}Z^X09 zDy&5ZE987fOF@u7kfdb__OWp8ia2LQDYLD3MK2xAl zmL(EdK{qkN?u4pT{tgq62gBEVdmyLc0M({mHMcglm2$NQrN z0dFY6Rqn!y^#0>5EV-PRha9`ekCr*Vqmz<$uuxYJq{UpMhORuGNxWD?Qq0NvA9kH$ z$8A@XaJ1s+*Hv4bROlm77`}*``A^7ddS=c29&`=F6PMwIXo$so!T3khM~Qe=B13zG zzWkb{#(l_CH~fevr$em7%ECCY%sxEhRR&42LryJN4ES%*;HXAx8|wf zxm^qoT?>Srd>CD)CC*$3GK{D)ymy$I+g^PX;%(xxpm#*6kLF*?mBIdJ^^@$*RmmE%b9_=7 ztets<_+y$at@vJn>749d8-(2Wq*NinOHAq*Y=Kq`^kxG|4Q3d6Hf&$tbB#2Xx^g7v z(~@?m&#MgUeq&eHO=d4krf}2E8KmR={J2;5BH3H=Ia{Yyn94w$rpz&VNs4&z4U$c7 zmMGkXU13F@>_G0d^txPO4O=~013!_K;E>I8jL}6GVIa>w`&~|zsN^WH&D;4|TvGtL z)2yR%?yv`4ClwIQv{e++7ZsIlWNp7l&-rwT9+nK_VO3%YQYM2dkjw@QC)~16+>tfU zla;?rycSB#;F4R}@jM~rhoJSQYu&C2{XlKWc)G5?qa6{Q^F%YE1k)Smq3AW7V!M|4 z=n_@Qr~5vkqTsFgMwU&QyER|=&O+<^lg068e7ijvL$q+69Bs6luYEL?y_NY{8F_|B zEIZ~lRr5)1&~5cpUNY~(~&e4_`i>INaV(sS%($vmN+iiY@<)%MO zw)dgeIN>HMo)|@v$|6h=)GYibM%3toN_yUtFG61)pTD+?<;5l=RoaV~@)D@XjN+wI@BQ_C4-< zQHP)9NuohWuLTeIUaf#p0N=KyvG-fCxcOV=Pk(o)%dT#<7RqL+jTmjLo-?0&$f0PT z#~~%_y?%z#Kjdk8dT8*sT`4 zzTX%sAHs`HYOb~ARlUsWj!8?8^9o*@r(S57{gS}R?9m*1F9X+w?EYwGGvOeJo?@PS zXhJi9@Cot20_A)~?5r9A?C^Mj(WSvu^3@1U4khO885UdDXj`G2X0<4&)%l_2S;p@D zFpGtd&3sWohU(4Ex!@MMq>zQ61yboGWi5kb1$z@`Rl6#qm0wQ1_KX`e>%C7$EM<=m zS>xC^2-mZwAx)zlm*Ci;?pvX1Y^0NkJ?i!`|FYm0z1FMUOqWxqBMoS$Dto7$tiybM zd%B zZs>p7ZP0x*r^3^%+cMQL&pCdnfnN~P!a(hutJ!nfk`yFKR^3i9xPS=aM@hG{5_=UrR8ZD8%VD z+O_ZLRODz#y=~V?yM7jf4&)!fz&~!2zxpbsoo~}@!dG@HFrkrsyK!phQlq(r)(!8$ z@`G_ESF$^73(hgpqTGqCR6v_dcP)H4!MncZ%<0SZnfq@!!x`4dh*unlf>&!Fed6?j3%Sl& zybdLbB4lE8m3+ndjjW@Aoy-@^8|{H{Q0E24I-jg9f{dVr99&$Ps-pezKfQHO__khL z;Rty&W@Wi5P-z7@7@M_q#mT;^BQZ=GOpa8WM|UVmNqfT*KP6Ilx3CE<>P|eBR59>j zlZ)WR#&zU$&7s3az90hnWUh}R_IW|}Ic-{d20aPbrx9#joXq)FakwD%_C2#}$4f%o z(Yv@@XdMp!W$CFP^f)bL;!LwZ9o_hEQk7v=Y}_?HVqfI2bz%J0|i)(Q<}`lLW1IHT8rKP{)y4 zmv+|~oHaOGSv}4YE%B?jQs&`V&ZQ<4F}c2?GT-s2rS)L-$%D3kxPa4@`|IhoGJT&J_i4{C`J>HU+LXy}sGOrB-DQ2^Hp6n75xKc^me)&+4a*A|sz4HzBK4!)O zJupB$lv{Q6M#g#l4YQUE<)L#L;c4WuY2h=-Nb1+LxYWNpo?{-Xd|oNHT_40?Q+xkol62<$!0VUz z4i?VOp7hrHn`BhFhUdYgS`~d=<7}NIQG~SC9M>W&XY8kp-u(RHy2O0=*!udqHk~!S z*=%q}oqzzj)XMZ7x*3dKtyYc8-)v7~u*uj~=k}DoKdy8f8@hWioLCY1(v56|pOst) zj17uh2UmE`E=Z4VHs<}&=i)lOGV8HT@)wAK3;m#yLQPRiT2*TiSvjg~u~3=*9ccvt z!VVuz{7XP=ZIt!5dO9u+YG;4p)l^&XEB~-86csJSk5I8&jIO}pdfaxLf!;o)OFo1Ij(@Q@O}jRO>I9&{ z4Ss07{ei~!51W%|<+xM*?&1+a$|^y3&4uG@oj6);0rCCCzv@TuleJ_%M%*t6thOP( z=bs5AX4f9#xeD_t^N3)H2Bh^r{{k$!N^;@GoaMeHHU#nf<#d2j^Kc2o&Yp8qY3e?- zQ6B}lG3d_~uTwvab{Z_({`*H`UVND2*=sSVo-d99udLx3v^}^+V(U7ZeN7$2W(2z| ze4a)~>4_WYilQ&tlv1(t{${yRd~4a-(eob24qXK=@YSCy<}+0WZpZ%i>FPy^3D2qN zg_ZE7;{x+~*I)l9BQMzt@5ENWz+erZ>i5mdnG4xeiofTC7QWkK|2Z=PUuEE7J1u&8 z9+4FP7b%K}rVxOn~wRps9%A_bhvn|Auy z`9230*8dvEs%Jj5IijW=yV5ATQRrjU4dE1aOUN>DmHTl6xz-41;mBlhQ4;D ze*y=YiLYU~GrG<#v~Kah4lhoB=}9kpKfiG5X*|+3@~KhHzA+}38BXrm*v2EUOMG`b zj!l(B!=!##vM5HVb9L1nDU%8gE|(hL9=6xO7{+8TR29kd4GzP}r;Wy2rukTJ#{7~=gWkpLar&!x&g*jz&vO{ zovk784NS{uC%1!auw*D)d>FKItpVM`0pvI)Y9^pzXd?{XhP|&X=vL06Ac~?hu@#yp z{S);DUgJ9O3#B{y$O}e1ez>LW&jWmztKgHbV7@V!4rEpwypWW82oNTQsX%I^Boto&zK9AG z31(FU_^g`~*{yK~@W^}hOnn>Y6--z&?FtNYT5vhvN&aznL2@%M(^Eenm(&|8dA@%J z`nU5O8B~x|^y%9S1kimMMG!NJ0Hawdh?;wc1WkH=e8zGv(9^c9suy7BoHgf}=K-N= zIdutjZ#zDL@GSK2j|6ED*?OH!T6PoIAsm3|#^Bj;Z3)4#%Z-}_@;SbJ3cCAWK-=rd zCqPop!Xd|~HF&pGMQ24xkME7EN%#swo=lqa?U)CD@ALoqXwO%GJ8rdbo36rZ5Q@ip zgzd5eI>UPQB%4GSVd3PRF}UAu37X%my^G8EYXN~}6n;KezV?H95J-W5nW z47b$32w=fwm(ewRq(d@B&xPLUM#nReJv@Svsd2K$*{^Dxp#-}P9+AH*sNER6_9q3~ zr!zs=j4L_!2u&ZBd;ZgQb$}_Z(%~CuiXfnbcQklcI?`p2t$KrAK?Fvt2|!i(d3sYj zssWs{SZNnN0~s`w%8B$bH-Uo2vlWmf-Yl-ZeYW|`VW#IBdaHoaDmx@>0iR4gV8gf@ zeIYQ9#eXBN)337NGz%D31#H$N4Ikmka72pKZ%1HMyXUl03kHVte5|tF z5~(WG?$9?5G%hSb+O^3$gFORt`@k2wJy;_6KX7V`?T<~c=rQ$kXUO0YlAU(yk1~Gc zdwnG)dYGR}^adGhoS74fSDb5h14)egk5Gg+Wn-ck(dMQU&BLs{rT|Rj&{*Og+;|;N z9}gZO1ETeI%GWjZ(ND-XUrm2YQp|udVGRoDn=&;$4E<9D zfVSPAy676#ArP@eKCz0;fi->qjkg_uKPhP!kJ%fj)Bg){2MpqVh)-?2xhTy|m;lD- zgFe(18~YpFyqoKTjx$&*YFw~~vL27)1uPCAwP^A{_E`ee>Ccw9dzWCnsp5|GO=uO` zLW7hq-^PtvD`8H!iOANA@SDv_Mef131WH%C!4la>gYR5B`c7gHX&EP`i&Jz>y=mTS z^O-9313PsB&s)N{2j>jskOr-D8f5AIiQW143O5~Rh5sn;h=~LLI?x|GAb^R@AcAs} z0wYj%#%U7MC8!dZT(61!43n9MVi}cQ#Xr=&7lOgy+GDlLG>0Sk1(70clJdO~Q3S8cC+24*h`fPiL9=qG{cItI6@#AhlWKVdFRh`#}yv`UVI^ z9`)UJ-7k9F-Dk=D|~*1t_eK7S=D8y!i~|C9oFy1!O1Wc1ACWTpjP~q<3Aa zH*12g!6OwDYZeYL7_$!;>sS--;xb`G6T0fGYEqq2c|)?E|3+$0b2cPk*oxO+fY5xX z9kir=>$K)d{zIVJ8=`SXYWQRS40W|&fsKc}bY4g8glDcN;`ogSL4M-;RB6a z-FNCDzGLjUQulqU-?OJ3kX~;fa%PgS7O|3@BQ*Y@YO*oH#kYZdgKB9Q@wUsDF(sxW zVsx^;=E&S(H{-^3)eQz^7U`->M<@V`z+7(|WM_W1ZT}|)@n4AZhjSpE?;*0x9cF>w zqIWvDD_+I*_{sYy_pHlCy$@KRr z;`_gA*Z=xY*T4(?<5&LQ;^%{{;Q-RLERFf!@j?Fr+i87JP~qM5r?~sCUnK*6)lYM< zkp3$j&zSLxV0QFASjT+|EMrLC#DJvJd?a{y`ue>WOgL)r0EXg?uvidacf8Gk<8d?t zpmZki^M85gJQARdwPl|k`3=fG_XX8xZbNJK_?;ts*bxvi>ZIyhM3~$@Ni*>(gJMdp ze}Dflrzekh44_O0K<>U`hcue!rDc-&RJRo`f7Xx2-tStI%m!>w>nY-^l+)<=3%gWv6Vvc^v*74WHOkn8GZs!H!9g-R9vIbXft^zuLQ)yK@PT?}YQi}oim6{LV_ z9Rux~DP%P~X}k=K29B?KsM;vpAEN~egwCgaQo~)X5-7Yz1;mBvI70@uA)nn5J&C$U zIZT?*MQFOj3MEeJI_M3p(10Ut*Au39UU55KO>;M;F?b$ClpPRKF3tJ0= zF%JZl(_Xcr34pa5&k4kj%nnnW3E;*R)+bO7B`$T$$E6ChOe4~-0o zK8FClJ4a*xeGz;sRfya;gV>w#F$6!LQrcApzP2_Y-Bv_aW?qveJ^Z8-QqBG#4brS7&@&ti_=OK9NA|8yZXw8-DvkhG21>@f% z2Wv1JQ4P?{`nDXQ@8>{R@HRy;lnmTR_s0j0^CLar4@r#%Ik|N|!JA(Nl^hR8n9v@4;EV4%n2D+$0ef^3WokH$IR}z6EXVAj@CQZP$u^ z$YpN;p6?YsxXFe*{oohXi-HZsNA{tM=8cVc83HlwIUD^-LaCd0EV+!tzn2^vOXV)W zv_gMBdhPn%uCprLih3bn#-Qi;b|a{+5?-!cfuRzZx2FbTOaBO4{|o>~vq)4d9qh6d zuHPx5+2Fx1jq+GosyVCVR`8QTLHmasf%uPLH)NVp={99hqL7hrmm}V%AuHN&kgwIw zdw^y8w0q{UwHOffPU;X9F-0lTZE3#k_DgcN_nf_bF4_8gUQcf|@dJpVeTbYVg&^4u z5l8*nm4%nNiN7EOCl%~OaztgemlEs6pMwH&QsGGx*p}Ucb};Qt37oyRhB9|JO<|Ix z`$SljWdyQ5(}cJ76^aTZCKIT$ru6D!y>KhtdBrEBx)m$Vt(X@QT3zaf)yF1p4=nXd zTsX6MZd37D)rk7<*L(F*Fj1Xv3deYb z+jqzb=M35S8WN30wqXt+)6>!#z!EppKVUpzO6@y&Phmfz&0ZOKsMqE(CD|Tx4cwE5 zgOW7T)z$Vj-Y3#!elq;b;LcE5Tj8rTcBH|QORhMHwN+JU~gkn29kw{Pj9ze)$mx2`wFRj`FY-9 z@Wep@z8AC_7s)^Pr;Y1Tzr>66d@%Q*A&6s;*ZTxaUP$P;Gx7L3x+Cm$dWxj#x`6sP zHTP`g?w{!13V1TRqYA`-a~XBEvd@7vV}JgSW(;3Cth5w6w1~gEFiyNp4~D(b^hKUZ zM~_db*c;eW9Wy{dUV&tN^Kz_h+7d9@+XlsN={a(VMF*Law0l&!lUZP>98#;S?8+mf zRb4eD8jC+kp_8Z3Ca?Ot7B#yL;uOT~8XkcCOpX^Kn0heacEUHV3d;#w$Q?Tk9xMBq zYlmHjog4CUtp#6`#60boDC=yn*n-2yGHi1UPIYK%z&;rU*5*`boWUBbPgTrWZubVV zPoBT~aQ)+C7;c3C9he{C=a$pGeCKy3N_A)!+L!c?v1UEjoU4YW5%i+iEvkGNmXi31 z4~uzx%St5TL^evxMK6GOnjHfDV@8+Wqf1rLBxnA>Vmxt5>V@WgJSe}AkYrzF36u1k z@H!W;EBM3&+aV# z?wccHqiJxYGD|lbYleM1>E~K-(C@KVS#cK$#-zlSM@*Mh=Qv#`>MLEsr>46O8Z-N$ zvx|r?z-GB&iJwGQhgm3tDiZuOQiBxSKZHg**DNq`I2E5a&DiW`2pp_*g0m4lVwTR+ zliqAa))o8eJ?apa#}XO+!_%VT!;NGX(N}kqYHj9|b8GweXR_HSb`L%x2!{0_mH87% zCcfRwHU+vXFog@a@siAE<)C4%$>OwspZf)adxaG9Cbpb6nCPnEvAWdCtn$;8>=f!O z>ZI-~d7vrZ5nTn>EN9oK9|MUO;jXOxRXE}iG{_b_&A{F5qn{>`qY^d)*B4D4<(fx-<)nzhhjx&+;x*% z(#K~TBXxI3!^SGjFg3NpZ^)7k>Ak1WwK1fcjINruid%_)0~?H89lXakf zP|AnRMlrT22b`d!q?cl^qJZf>6A@4ZWa0j@yZCxr5ES_KA{_gZTF_-9$o0!?klJiNXS&rR>v57Cv;Xd&6dZy zFVo@h%kL+6QI1-1-Ll8VkmW6&IK1wgPq&9VR&fp&K;O2U7m|@*qAaAKdI*o$+bG() zk?2M5fh>yQJ)MZ=VU`hDCf^$b++4~%_d3|8mEimIFAxQGTGfMBrSh1ys<|fUgOlyf zqe|_XJ*wyxtQq=pbmAY+u^n&N7#k%^#fnj_{K#30393X)oM@Yi)tNxMgl6aGAL2XCejRIdwY57w z24_+)mNSp#7BZ416ilO>7%ZUtM9YsIiw5B*{XQK2r(J_1LP{@Viow?4pHPO91YxT_ z1a~MYdqm3gi`+s*&kU_(HtS^CFg`GR2GetK5t`HTfY)S=gbevV6xQzd5lq;Hk2@-`}9Kl<8!vNH)0Cg0p2Q z+LKr@I$1Fy-oE$WuP~)?@pmzdQ9&mfHW1$uKrNcm6GAfPiQUNIgt$7(4o@;pMS2Q9Fbnc& zzqLt-h=K-I@`e#ih`mNSo@%x`dIjm@>JY7I4gV=_U zh6JV{D*SDh14oAa`7MM~qOi+n@nt?qM=Qw#v^+}RH3e(OhoXeHX=QUpUBMHcPLV4` zfCE$Dfs!u%o>sn*MRn{|DtQA4w5n8-y7Dp8Rg)l6Bg8eVkg=Xl#4|DL54f3$cT#V? zTiRY#j&SBeF0!3S8oV1*t35=^>7F3y*u+dGlJO(;*=!XT+`-OIL;MUgd79aEqd&4& zXH=;gjfKz~kIdV)lJ$IMsK-WLsDw(sjZLO5%SMI3A;wFf%V5(oMzr`nlQw}goTiq3^;YQd?N!*)&~jbz zLAs?RKpNbfx7f;ez}_s$dXf+-0>A3{tfZD=J%z5?Iq#BvMrvZ>Dp5-8ZH1$63m3W( z2GLq|3~EKU_V^A}N6Yt6*bY`==5M4Jvn)G!^oxGux#Hd`2svs>tU_I73$I*Dlw-}S zs%%8v93{lf49%s8Qw6FGTwKx@xsB<0Z}LQ!RZkNri%|8s=g-|pqIXKWkZ-{7iJZg( zFg=DaH%MLxA28;)%2ypjD{rG68i${jOupKB zWtvBNV_WNI!=o8zJU?&++(h600kHeml?nO7>YtOpX}48wYbCPzDALODB2OiKF}Gw2 zLex*H%(Utx*fYj2leNy}r0fxlh+k2|SY-e^9t`dvDk$Zk$Adqru#TOqFrbTkX}W)0 zWEE@7RhGge*r55>pwAxm|llKXo6WFE@^!2lx7m(N6<5khl zSyCf?O}w|M6}MvXndmoF7zXDG8AW_uKnqG~dL+iIS}XV6#JV@;jLFw`sm+PP#}C%> zS&`%2aIM~2`uFA3-l8M5oGoAEUA}8pnAEy!h@;#w=j!`T=9K1_1bvN3N+d*Hsc7Ww#KFFJG}((e zT9KkOekF;M+zRu0agg8c_q1yCD`>w6S`@1_lz=n?L3CLxvWsmvoI1^HdG?4B?AD$j zli81#8l@?X?{B5mD-5+LxJ3I#K94uy4oWb2XrQ&lU+~%MRg0Xf{VIM54Lto-NS4#Y zx7}rN3c6%p=1_~cmp=rzWTRWOn1~RTo%z~=Rl%waIW~{F2FMEXp1=iW`awY0NDHIh zXr8z{S+u8>v{CU6-Z7Uc_jhrAsckr3YeI#0I0nWUc#C%3t&%1KMV?{LKemYiaG@uS zmm}6$WlAcq0mQ*hnmllg3J&SHiBv*K`V>(RrTTMZ)JwjeNb=|Co$g+-xGH~V`E`GA z>#Q#>?~0YU2G8jpp=fo+O3^l%bF`)9qtjI|0w_9qGP_&JJ_Ys zQnwh76NxLQc}8zx#?3>93Tg4Og*VWAo zcMBC?yL>oN^t?@I>?YkSz4)8FHt)Ugqc~}6{u$aXb#C^?fy7gEiQVf&xi7WNq0+JM zOPS=tdpN|3W0xYduUWrw2`y5%AT^0J(D!9i#FzU5BJL5XO&Ee=%#5@2bj*R)itXpD zbms-!;US$GR)h%a0M5qABN>r~4!tUoW=K8=jN=GcsGEv!l zL5g5w1|kw!!>%0ObJ^GM8+sG0fmhH1IeS=?2JdzRjnSe;l`nGcN*WJN^W}Ga7d|}m zOf^_cz>pFhEra!?&~4(+Fj02~T7bA)m_qAe2L;t^4fS2BjT-%c&(|Zxh3yO12F{4Q zSE7ZZNYLS@Wc&ktOF@2(PRU3MlR7iAv+@#NTf8y}{Tp9i1H{7TwRhzv8H+KWDZN>c zEiobfzEc~CH-1V@?p5<0YWw;%)`6PZ$Rm$W33vTRN=C#&!yC><;sSpNE=#q?bFD9X z%CL^esk);A4k$@@e^KrtpkD=w5J-WxKw81UpZNfC$eKqPTYvvIJLHTPYVxNvj?~y z{|PK$hOJ=@cHT!`4|I8L*Ecllq|~URcRJ2ySgVG6#zQd0pogG$c&25oemWOfpH`V`yLw~>WK*cv}?brx%p-wYQhEon-+wHiQN?w3Hf zYB+0int2?dprLImx;bu9ZO@zTS~gU5&?Pt4FZ?Rg8=c*j&23d>y_ep;)BI+1yQQo z)Mp2vGndP5qsJdxCK<M}sktKUDq2>g@Ha?C zZ_B>P8ZFvGN4$F4Ex@7XGv!P6DV;nsUJ$lMf`hVg8=KdqqyIZl8bI=a6S03}HFpzQ zd2cCQ7o_4gjljf;V)?M)YjJix^c&LbmzGnJ052-gct$IXbpJIyG}0tOGm!JKxTTOW zG=gBqDtH)&fEBW^fnP@xypu6(z`ObioE;{->lq#U+|a-RS9?e5Tp`PC_(Yn-61(yx z=PUF5XIL;>ItSC-;UBUu%1}*Cbk^eqg5uxL3EEB?PA_#qVTFhJr@DgM!W4vmW85Oo z2A$O#y=R}vTNU>tTKW!F?|h564{zy=jkEl@ebNOCe{CA8;Jn3Hwt2jO<|LV#Yz30|pu5?_2qG%V-)saIlPB$4-uXaxFuK+># zJpP}L2Otw?$gEY+diWP51(a=z(cCa{t6R?BR)hMzIoHzU3TBj(fa+1+n>R{1gew0@Lusqf$c z2-IKG(aOKvWhW%Y>>r7ne_6{Q-l%mL&U+o6d)+{2@pL{(b&7BG2Gf22t7ZBdp&7@r zz26*miIin=Re+9($Q@W*yY$As2`c-HS{a{+D_abM>gX>Wc!7yQ4x%RMT{#{MAjQBZ z(&(ZFN$%9Qf*`*QZ-g1^5fXeG7RFoV|g zUjmQqD1LbEk|@I)-MIZQLiRG>!76suVY8~48#IRWJhxld+G_m5p`&9Uh{!D~a`fo~ z=ck5H^S}kPXkM8<0x$TVV8?*r8D(;-?QQUx3Yba8w}Qi*rc+>RVR5bWfLf$~0_lKG zLyY=3%DXxWWS5QV398=MoC3WhlPaGJe-N0w*~!|Qwgx(KTDue?FYQLA_W?xF0jP{? zV%vG>wqISRfSu~l^zS~Hwdel@h1EjIeIHkOIz1qj+2LyOW3(60z4Cg`f5%T7wK@nwQTTj5ec*Sjk z_z$7vCM`|DD!K;NDLH5TSpWHwe@_fKrKJF}QW4x?mzM97gfX9ib}zRwcdHc(*9}em z2L0I<#%*wtFliV%OfLvoEgIt)y?CbC`x zyk?LT3Z(Zv6M}^?(*k!5e^uSvY!^fwgw25r#kZitK(z{@o6DyOMRc1%CSw)CDM?kJ z%w-lFVceUMdtktkFyo8^Zm55NG|@R})V2yZptyEjG=szmxB{z+0Mzw(Q2u;0T7H(OA z9VxJ(0>|DeuIZ69i&j8-t$6J_5CQ6w@}RbZ0nn4p($xtV(=yyil?EX2w;!~Li`6V# z!Q6B*4r_WIas5E>!;*!u;EomnKad$-mI~`tdZT~dq9!lmkgyF<08S`3Q@0gTGorrq zf?fYgpLALE2C=mg$?;dcey-$3b*gMKgw9K2h7h$(l@hbsj=gKLwNG+AqW7yT zSj^BLEM5}|4=@EZyi1(nAoKq4-pw%>%8a^azC`@gKV#3BA|d}qI4xS>p4B#bh^Ho1 zv^rr#6!R(Oc2f9lcaPivOv2a60ZjH$OYWLiMFTU1-v7C=yKJKaH)*3`>`E$2bml@{IV z#wo+eEi_mxYxb=*Wbe!^`w0UcGi`{wy)x%zE9n2HIQcA7iLI!1F8wC!jh);A_g=-y zemGNX>0vHtx4D2zS4Y?`7fmFVD(k)b7PQ!ubo+1r=avo_u9~HHZT_>?fhP~A5)?Hq z))3szXaUa*`AW}0WE;VfT1v+57#)s;U>z>A?PGkZH0eJXo|)u_(ks`6mp8&?_vKLf zb%eCuhuQS&HA#$sUY+(DzB~cxd_!{a@%K-^=&xi447#*HnQ~gNl##73iyZiLSFx)( z8$L^~DoC7Yh*9*-H$fEYybN(`v>!k`Yl`eg_@^t6X#o_l??))^jZysY5b4ShC~MQ2 zSe}Fi3u2BJ`t6aTP4?0Hii++>=k>zn|J=pkUE*OjfGB3zZL&ttG-@<_r{9aAm`=iK zP=i$XOxSvb_#@-0_z)%eKug@u+PXf$#S`gz{AQ$!GM5ZZPoq}O)e`eMwz}jps=D40 zEs+vMfo|8eUx1)h-_;RZsWEU*<)5BR*ev$xB`9rfIKYRqXOC6Hy~I#9ZgCb^WviJ= zdiW4BnEq>38J9!pK14CW+&3-3-=4=cfda}x8|-8M#q{(KA~~S{5(_TE|5hH3cA#Gw zbV{Kdp+nPa|HGCwB(`SJ{r{wtrB>Tt!7n;sgn;e;vpmQL56?Yli5h0fQr_eHpI_&r zh@u6<8g?B2{`=k%DIYisc#Uw(9N*P9bvEFqg^nO7-LGGt!L{of>f4L1H>lNP2xWyH zx2N0hPL}JwPh+bZU1y2#Pq+q#Sh>3$m`3`1|aB65LqXT1Iun34Z?b zA^2#fmq1RWsb5|P*MD&?Y*6bQp=^iGKZ4xbEl)4)rMUH0|GbY6Cr(R`#ikx(&C!z+ zzWk=Flkp4a{J^{p{qFn<(Fui8>nNzOq|CZ=!18ZAyA7Da~!^sUA;S#{bIdqew^7F3CZ+8GabAb!#B>}@lL*8(y zpxh|{UaM~of~Vq?ulsj!o!c$~g6SSmJ4=Io zIT0pd;vc#nKtZeE8?Kl>xhASb2BLgn0K%VIOXVMTRrUj$kM&r7)S_<-NOqmZ(s4NS z2AqGj)hq464Bq=--9N10Pn!P?Ak|Ld=Fe0RV4W**^4J0?52j_rp)Co;GI-c;L60S2 zaG90E4*yt-eyF&xwnJ3Ge&{Ne-Kxg#f;Lb=R~Xqy`ta!UnD|>JVpdatGEBvnD03w% zGT&oNwk?5SDaxL|DrLBFis}0ah|V>IN=+9~5=@+a-XLRAHT9I_>+*)wDH-57vl+#? z6uIn9qVa1U9gWUhJ(1Xc18VO5K2f{RdF5vsdzp1~rHZg=;rpKs!1#pHcQyg|{X+rW z=c5jyJR`ib(?X7&YhEE!J2ZBx-@GKyR2nB;WAM(Ymltt9Mhx6?uCcyXMc<%BEq5@L5z_PTswc(I zTN_Y9YCHdwexZ>=)M?Fq%r(r7(D_}1Jpj6vjDAAB&V4WcM)K2=xkR z&OgyS+$b$H{08P&VvI~bgL6v~Ih##NHTa!#_sjD`C*K>aAMiF^Xqr_t)z|S=HqH z88i6-rKR%lz8EE%OZ<8X4mHJTbQ!|;<1NAG(kSqB&Tao>x>|!rqZhZK)Rx?hzDJPg z!8NF51E)W{a$GBl{A#1(JGW^vy(B<(kIAwDU4CS2TPfg}a(8;CoX->5FB)Y|(A1>! zs=lElkGOvr?C1F#F4YdsA7~6)#%{V5oKx63Z0OIR8*Xoy1G}jGY0S6OE17$BK_P6H zA0^H{I)X=vgIkg6zL@>&M*vQub;ICB91O_Q=n?+M)5mc0!yE;%4UM^Lw7&yh<*J)( zD0-GJX_c)2PxLr6QB;zui z=mfdP+qAps{SCI5q4}|)_HHpJ+5)RYZgkqQC$Zu$!SO|ty{J-tr5H(A+nTW6!_Q6) zPn31%l04cyGODP*JZ>cLeebv2%jT#yjI(f$d`l(^>9twa4jDSDo$RS*v%9vs%A<=u z?l}4FW>wvKii_U7u+LWiHMX4NK&&e=8R*^Mb>I1>8~4^pbJOoiTd|6m;8iX?aX8~5 zT0T{^fc6R1+q8=6)>`k?tK^>|T9dkMVNcgT5W;)sxKVgY*KMwuo&VzDNtK#1)1fGO zR&jN*HHSnWOrOn~ZLluBM%;Kn`0x@;(V;Kj!BxX&W|+oQaj~S;m8E??tn?Pc2AnQ6^a+4F80-}Hhg(_6OPv%RjLyn zzrOx)2RoMIVtcJjW?|L80Ur8_O948FVzo|OGJw) z`J>59SkFTj2lIT+mgyEw$b!S2?KKtKt(n)SS=IO0rzv^Du@;FHLZXW2;RNveGP&t5 zk%<=Py8gED#8|RZ3}Mt`J%`ksHMo`wuJ1agPZ*ZdN*Nx6Fg&-++@%(5!f`(ey44@8 z5fUTHOM!zWU$?g#^b^3LBW!m~QYf!22#a3!2JFapz-8sT&>FgMEJl^=B}x{Q*_lN& zhcaVHw5w&**&P{UTl7u1et$~Ua*gknz0p@V?!NU;t{o0KXoPDm^*$^hrZCmLT+sUY zS%R8p{mc0N(6pxB;#%blk}_6wwq<3CAmL_3Wt|eA3+2y^m3#tUJCbYgC)O;g=jeD{ z3j03QkaB-Fl>vz*qBy%GE4ZArAr+wn#l=!0&tmJ8M>!|O&TJ^}v{m}6KC053BB|5c z{Yg1{MNPzVrzF@6^l`JbFDH(B+YV}hGq@>2YD?yvn0Z4%j8GiCZt}H8aO;cHJ{HE8 zuM0ePY56gv=E9*HW-ABqlB4ZEb?3u{5Alx$W(sJC1AFLgQtA&XpQ~v9@ZUC=O?^Pr z%_`pLbZ+eV<1Rw|LMp@_oApkJJyu);$zxh}bsK1E#OTfq;ZdLkE$35xnl?w{Ils zI1o+$)U2TerzK%pcTP#kr6Gy6V?` zm%VEieR%xW2KC?PnImBVZwl3j$XOp#3v%0i!!ukC@MFOz#NeoE(B#9|*I343YB#xO zl^Bu$KN`EB^of@54&AzwB)3G0{c(h%*Uqi$f@$O=o6>ucw;CL0{Y*7^oxi*1-2Yno zX0`46eYtoT8v)5R^-I>bd;S(0h9M()d>5VL+xf~r?%(nB z$iC~aq^AZKb^Bo1yQ?)%b<8zt7a=@tmYm*x*!gP?5v9T93x8%=TdOqdDNE4|H#8@S z>TQJS;bYVMRJ{~#@Wd_LmF zs^LEC^YcJSt*PGZCKWSn;nvZEp*}vZjSo8vJrlIWNx#3?sDuz&Y)ExY+^!)?c%IwD z@?=}EC)J509HA@nhRJyJBawDvk8B2qWscCIlDFwkBIgqYRUc{EJzfV#(%lH*I1je| z%y)s_Wp$c4h_avfJp}MOzO!Q5-lWZK)BX*&gA6GVVS`K#4LvqP$>}6bk8bU2FXwJH zya^LsVc2pgJy`eeb(oa6T1u-z8nzyq?yaLX{Dzd5ob~H`thh?=o^yRjX6>d)<~5z_;REZHW4T%ivljiX>`#zB zn97gRZAY$1yQqdrerutn?_>z>VHUTR{JN0OyekuXy1nedFJn@tEXbuGn?eQFvofWI z*Dr*n%zD$Cld09SSgU?Kk>rx{m|NRr&W*XQJ<8~Yw8#(}XLzob*~}lJa0Z4{9p^!u zN!H^8nZUcFd92fMG`md`drkP+LJ#bO0zV#(|3%Q6N}s;87@OEu;j03tztvfmtPmvWvca>U;bSiYpfLk55ITXXUKG|l%VeV3~L1a z@=5n>==xj}2oV*Ux-U1z)F)8Z9W^Hat>T!?(bGy@9ivO+UP+8p-%?*PmEUmOsT8eF z(i=&r(@J`Dj4A+u%e!krG*5ZIF@nn0)9xYx8=Hz>{RanqcLH?C3%!E(D>VtH;w)#g zdd=h?v5UqDWDfUUh?LubB&DDV8`TcK>nFtRGs8lj@R~a#blE*{U)A%sndTL?Ryb{bKh<(|Xg zm+|ECBE_}2lnn=!6fxFP7@baqZugutQtmmnqNvY_pJWcuCzQkC#tkk}9hFd*eO~W% zO-$A=3AOzg_nzBWrs_Tcs8ca9RHpF0z;>p=r;1Oq;@LLl#+DF5&|WkL)p3dAOqWWZ z$2mQ|7WPSm;Y_w7r^HM9a-DguV} zBDH5B+E@sxD*0f)uVYhAmR?V??iAHvvtO@n?xVL?-27^GyrcE|nvK=t8% zhKjuCUV=E6=$1}~*ivn`PU^*9zwV0Tm`*SxeK0uDSE96UX$huPK~>Q&{nd0!AIam! z7bk{ufl%a}e^Qe4Utco<_Z>ztP)r^#zI)7|Mmpz22igg)b zfeC3~Lun!TTQM{_zR^=2 z62`>;7$bG+gR5{7p6zz{u`9NpC$;7vf^0z{>FW^L&_#`34(Ly?Cb+o~^}-8A7(Jhi zt(T!0uU&{fOH3!)*NY{Jd~f^kmc>@`eh6w!>O!&5LUVXCs-jP|iHXV34XV+Wpg$lQi~8;Z?J~u@ z++%cJ$Zw9t`}TGZ36Vp>eVdigyA&97jt;Qz@;KdCK>`8uT4)cSAs?a$Mk+ zce%^06j40F5Q2aF^}c*vw4+s|+}`@BEtdc_w&CgnV~n;13q&UM3S_G;qE6DJQxHEX z*lo)>8F^BpM@{M7j3sA#TTV`RIOFs4xSog^E_!%%1M9uJvIGN-9CCL}*b4e+dl z*~z^~b-Ew{F~St?655%C!^Wt9Z zmP(GOJd6kVyYUfgX`jhrF* za>6&4N6i47f8a-QFe>ok=YKSaOW z|5>Zab|3L6Q+~7M$r49<&#a+g^}_cBIP!+pPPyeuO^V&ILXw#|kY4j;6K(6S znC34*3epYX!Vsh0h>hM8v9W%y1JGheAN?}YUzm84Q9Pc|L@VzyW=9*Mc&2Gt`E2Zj zAgj)m(;imL4i*gK?h@)#auO2pd+|~RWy?{!$yZjD=7stsdKQdg>bmGg@=Dfq3IfYS zX#{2sd&4gUIVBjyTL0*~V{@B5F+3F1kva$?rU z$rZyP)sIGb1*_z$Bd$2>bf?pZLI~^%EFx{**qN}+cN2+&Mj69=X5n9Ql;vD;hHMKr zf)*q&VvvGcyGt^gaUh1{-hwiIl;X=h${blC0VO7ExB*89fKJ7^#e8?4!6J1iuhvT?fJQcqx4 zB7Q{XEH23L$ckG~J67P@Y#*F+cuo7w*D^myDa57!PV=I*%Z@Gfrd#@5F#9bL?#lK_ z#Q47Cpr0`{1@bBwrNgz&BSEfu3Y%%1wn&2onH9F+e%ae({XM%+kXKbM8geTU&AktW zIN@8Bh%VaKQenL2T)b2At~SB7CEgOZ24ooy&PTDu9VAnGXtPWe91c|B$~>8vNp}LU za-CN(647+IUxOlL$o;iy_aeW0K}B#^8mzb^r=Lgi5uOpn#t)*Pd7AJ}rh!kH<-sqn zI+%z%?!PV1Wqbn(fhTg?#ypXj>4J4EeA^bzkUGd8!dRIXizn2S7YWuS#CvWoc9b8S zr0%SGA~EHxOf;Nzw&_6`+P;(W2xK4ck>SmX0R>Z%!awjx?M)ySMIM^x^NpJ3g+e!7ei#4B-w zcc2d19L3IuUmh}kQUl^`b#C#YlHBMtLngEiqH1|w_(XupX9P<9JTHkLrkgZUAn`IOo z*nB$@MJL_vf*!?9Ks^W+&4qh&9?3ptOFq{}4m+d+U$tHd0XvGEv2oo4C$OfRK=KR> z>h8zsXHv6qFfnggJMik+kBNX=jX8)V@tygNp%3<$Br&t<$0BwLdwtIJMgiVKBcd(d z2fg)XV0RSdglbmUAc?itE@* zrq649VkJxNUhYf{`kqnnr-k4cW=tdcfnL)#20jL$=Y^SI)(*8_=x!%9e<86BjQt28 z=U90vaP0=WM(L+zvSv{_!#Z^B`wbcIG6nY()Sfoj>j-5p5T!UfFzycX+4l(=PY)!P z)g$wH!RE$sqZ-(BR&Z>1ug6E zTa~jjR29`RnhdVT?suo5DT9IW&2gLMQ;HCunL4obzB)EEh1W)$(ys4qx3L$P!01!? zGlnP!krZQuxgk+>EP^)TSb8QHrA4T7uTctfdoY{jRks^p=47D^tcW_w_|T=RISVt= z#DO(jf0`-E1XD(_z``>E48frk{(Y#`s72R>@nKe&91tIe|3^FDfp!8Zf`#YbjRc+k=ZX8fW6+}`3})a` z*T4Kd#uy^()Ly{t?F|n!_XByt>d|2=uBW>0Y(QYGpVm&e$!zj5 zh|hz6+GN%VQfw#EftSUYK(hH04mDtbCB6_yiq8}!dl7htn}NxMH^qjifx;~K!)??oaIY*WjzU_a{%h zGhdmf6v7;9*~heaf&})po4J-|`!zv(HOruWm}^T5kga_j(>yvG|9SuqB!Xm}5=se+ z@7?2a6u`=iZDMbHtKJbh%{~Tfq?Ym>ZzV03Hk4A1gddK)a)@JXG4@^eVVEszUJv(U z9?rZbpZ2j9piySzfk8h2ii{O0J}jWPt#B03wMYOP39}`->1QZEO)G3VF&^}&H|42i zgw!BG1-iF>gY8`Xz)8zj@9SAg(;806jJ_WMnQh6-bpfOMEu_RUPmugPm_}3)b_Lq+ z*aUfO;%e|QN(H@!mhGsPIVFId`A}Td8t~<@0gr0{;8#7}atc`s5Woudkq%(GHrggM zcmGPrbeGa*dBYdB^Jlq&mw<=TlN#VA;Tg1B5H$P_ATnc_hdY@*l%OmnK)>WOOvB$l zet59uLjl`BbFNZkaLOFNOi3lKC-kFaZ#z)25jQ}MnBK9V{jQ+VqNa80)&3p#==Y$q z_F;wJ3_te}5F%n14u16>l=w~2Sq=7h9B7NY`#~`#TiVxZSKFC9pSOy7p!xbmWBcc58o9_=a}L7-&_dbFAPJ2*U4Gd1s|@ z0a@1Pa69&Ja91yyV+GOcSKp<$?BVk3^mKk?orD!s2;a>1&vcPQ1TpP8|Sy zE>y$YwQfaXr2gZucGAaM`1o4JfJ+N`(}kL?ZFhX(s>dO);$L=UGR$qe+Y_{t95h5h z7xYvl2bBQVAk(V*l0~$om{A7=4FghTTp~zAKmmH~_(t$_*m?(NrOuMSQtv1T2Vi1@ z_NN;FueUQs?BbqKZz%^T7x(qZhE+Kcu=ONvRZ$ZiY<2atdV)SXD@T5)>65k%t8%O-A@)En8WC=6QIsR zFJg0Ir^m-T7FZDQ<9|=F)c+Z>RMf4&$83aB?`w?Ca`m~x#UIEOit;zrt#W+&tCS#a z<-!VFbFC!tA!*BE#n))-WjHkN%epDP)4e(`%JFj_S5A*tBUKOakaBc9yXUPAOvGfl z-&VuKSis~l?l~Ylm(VeUbK4U<3p*HR}&73Z!qJem~_ zA}v9~`Y7TDZf5@8n@zJmG-L4uRq2z%9|cN3lk_&){ea8fIMR>+UMRlbQIa&J?Vc{~br#FppdMw0Hoj0BpV1r)@Oa}AQ9*A@a2Cn!Ne)YHUe6z+l$4Rlt?fP@ zv!keu)k?mWd!V#G#ZXgi$iiOA(hr;z`$@S=hGd#pO>dwY&jG8%0>ME_f^L=VWN5#e zc++}czMpIKdx|fLkA&Y420wgksvg{l%K9hfEpb+4mF?k|{?28%trlPJ9?-YV%K#yM zyr(A>G2%5GQT?tY>sBR;M+(g=3477rZq4-J5QBU2mF)H%$3(cuBUJI5vM2Y7o7WEk zds#{w#|$G0Ur;Y0O#pJ301OUGMbd}uFAR)V3OI?({H(QUysh8Kw=~2y<4e8{UrWbK4i?G|io`f@hTB_UUh~daRAkr)5rSr4u&t#?RdbeW zuLmmq;ivV@9a1P>FiDm+^I*bo-2%opRkN*YL47KDCxcntTAv@+^ZZmnSb*2im`zEB zvCEexE2)OPWY(a?wv|)ng0W-V+aK{4Y#uXd)4N+%7JwI-*gMJ${9SR$N#D5w*GDcp z+%0p7_nGZ5wiTA{-<$dzzp4=_H&|w#pZfH{l@|lA?r+>sk^YNzOzJdyTes<`x+YE=R3@$9!^u>Fhtscy09=xUXu}-kQ34L1wFxbY(TLVq| zvl4Cy*4`+~^_*obecwB&<}bN0O_efU5-S4uYS4H0o9!Em6ujn43C~-<+^#xv2abCc zX!C~N+lyDMyC|r+lA+f~urGI6XP<%ngxU2Rkh7>L~ z>VY&iOI9flWrmAByt-egfSF<2%at_9aiw*+S&@%*E-CLcANg)Ht7Ub&XW_2Z#RrwV z0j+^9+PnEi6!>l|OM>^Hik{4b+fqp_SlA|!k21hjq))T2I&>fIwH!7mvdqfz_xw5lkl!FlTD_S~ zmHv8XGAu9L;1f-?{*V+7eF>Uzy(_VSwT6aAz6A6R&^w*D6_x>e%r(o8qE|pu_T9$+!#b?L~QVB`NDiPvj<4+mbK#3 zMY>fcQ*9(ouihhqY%^M;Z4!`z08Go`qQCtQ<;+2!=7a1E-Sb$mc+=vr&carT%ocM- z2z0hc@qCK7#KKLw>s2yl@6fk-t3Z}Wz~YcI9O98JJA<$QF>qQ0?zj(EW5vAKKjtD;+kX9aQQbgm;X*ZPp!qTr=h^Cf51a zUZo5RZzI0XEk`?G4rJtU^Y&vDoYR;}tBV-uTA=s)zO%x*Eq0h(7J9FSWFOc|Y3va~ z&o)mCn?(n8U-ut=>P%xio0I-fxzogE*dyLTP%FVJ8biv{H=1ayu(`#yTfJFkseOje z#`VemBObicRzID-~%%d}3sH9cdS?O&wF6M@Rg79NM+8`z6*^eEc?!zjp zrDfZ`8GQV~{iEz;6U49gD{16I_UDXvaci%3V9^ioak?Rw8B)-sYc&| zYi-vhPt$2APj^e-r`P0q1qwkxar{|qe)QV7R;(ghqQkl-0;kbBXRk6)5#HucL2sa8 z(0l5|Qn#x?$znr* zJqrur=Rb$kAsSv7$}`(#N8>h?+YRLgY3O?0nN~-CA(|QH)m&}0-YWrd)SB@JtGMf>0ZB$|eGXDjZ{DuiW$8^+(tJ;P zbG>De+CmaGsUVz3=s|?kEKkX6?CoXsxV8K)=FXx$1=W!|F=U9=gpt+oYjUS3 zrd5QD6S`>O*l6$uUF3bu4uR%mdh{Wy%_o}nl`pK+_tz7f@t&IH5VX})IvxzM5V zv(Yz(*f_DYK*SlKZROPHls+1lD6VZ zz{OEhLt6{DOuUOmuRVYZ~ z%D|_&CsH1IKzEylZC1i6Ab~gb_2(1QuVvylJ9Nu|@NH})cwE1j_8qffC##LY*rmIc z`p-v!Sz8UdX;{_DKRYvK2c2fWwBWnFpBH&;eC_q*WsicD2Ft<5`A%|CSw!9EZ|Kn} zKrcG}6ABr9W%7vn-j|oTXgdB^DBClT9Cpbhj{Xw4+-NxLU8<7WmtV>TcRG2WY2N%P zb+d)tV`BtCKj*u5vHat9QHtxltsO)@;x7!5O<~il`C>Xfn+CgWqJft1O^GzZjwIi` z(Ijc9%g!mUr;!q2bSoK)@SE^T?IVzG+H$GVwDy-`DDv9j2-#Tdo z(6k2ji>AHYMDGmS}D0R{u!CNk`##O%u;FA=fsi1#SB z6#H~HTvm?|+b&^1N+~1$1tu__v+)iX55B!nqN-tF8b3WbNAN-xedHCJZ%@oLM z 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 Q0{&^;xTRjI`r!Hh0U4SrJOBUy diff --git a/language-server-protocol/_overviews/lsp/img/language-server.png b/language-server-protocol/_overviews/lsp/img/language-server.png deleted file mode 100644 index 278ea6289299e189b715005c507f869745fd4b41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57716 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

me4s|>r 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 diff --git a/language-server-protocol/_overviews/lsp/overview.md b/language-server-protocol/_overviews/lsp/overview.md deleted file mode 100644 index d990d99b1..000000000 --- a/language-server-protocol/_overviews/lsp/overview.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Overview -topic: LSP -layout: overview -sectionid: overview -redirect_from: - - /overview ---- - -## What is the Language Server Protocol? -Implementing support for features like autocomplete, goto definition, or documentation on hover for a programming language is a significant effort. Traditionally this work must be repeated for each development tool, as each provides different APIs for implementing the same features. - -The idea behind a Language Server is to provide the language-specific smarts inside a server that can communicate with development tooling over a protocol that enables inter-process communication. - -The idea behind the Language Server Protocol (LSP) is to standardize the protocol for how tools and servers communicate, so a single Language Server can be re-used in multiple development tools, and tools can support languages with minimal effort. - -LSP is a win for both language providers and tooling vendors! - -## How it works - -A language server runs as a separate process and development tools communicate with the server using the language protocol over JSON-RPC. Below is an example for how a tool and a language server communicate during a routine editing session: - -language server protocol - -* **The user opens a file (referred to as a *document*) in the tool**: The tool notifies the language server that a document is open ('textDocument/didOpen'). From now on, the truth about the contents of the document is no longer on the file system but kept by the tool in memory. The contents now has to be synchronized between the tool and the language server. - -* **The user makes edits**: The tool notifies the server about the document change ('textDocument/didChange') and the language representation of the document is updated by the language server. As this happens, the language server analyses this information and notifies the tool with the detected errors and warnings ('textDocument/publishDiagnostics'). - -* **The user executes "Go to Definition" on a symbol of an open document**: The tool sends a 'textDocument/definition' request with two parameters: (1) the document URI and (2) the text position from where the 'Go to Definition' request was initiated to the server. The server responds with the document URI and the position of the symbol's definition inside the document. - -* **The user closes the document (file)**: A 'textDocument/didClose' notification is sent from the tool informing the language server that the document is now no longer in memory. The current contents are now up to date on the file system. - -This example illustrates how the protocol communicates with the language server at the level of document references (URIs) and document positions. These data types are programming language neutral and apply to all programming languages. The data types are not at the level of a programming language domain model which would usually provide abstract syntax trees and compiler symbols (for example, resolved types, namespaces, ...). The fact that the data types are simple and programming language neutral simplifies the protocol significantly. It is much simpler to standardize a text document URI or a cursor position compared with standardizing an abstract syntax tree and compiler symbols across different programming languages. - -Now let's look at the 'textDocument/definition' request in more detail. Below are the payloads that go between the development tool and the language server for the "Go to Definition" request in a C++ document. - -This is the request: - -```json -{ - "jsonrpc": "2.0", - "id" : 1, - "method": "textDocument/definition", - "params": { - "textDocument": { - "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/use.cpp" - }, - "position": { - "line": 3, - "character": 12 - } - } -} -``` - -This is the response: - -```json -{ - "jsonrpc": "2.0", - "id": 1, - "result": { - "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/provide.cpp", - "range": { - "start": { - "line": 0, - "character": 4 - }, - "end": { - "line": 0, - "character": 11 - } - } - } -} -``` - -When a user is working with different languages, a development tool usually starts a language server for each programming language. The example below shows a session where the user works on Java and SASS files. - -language server protocol - -## Capabilities - -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/definition' 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. - -**Notice** the actual integration of a language server into a particular tool is not defined by the language server protocol and is left to the tool implementors. - -## Libraries (SDKs) for LSP providers and consumers - -To simplify the implementation of language servers and clients, there are libraries or SDKs: - -- *Development tool SDKs* each development tool typically provides a library for integrating language servers. For example, for JavaScript/TypeScript there is the [language client npm module](https://www.npmjs.com/package/vscode-languageclient). - -- *Language Server SDKs* for the different implementation languages there is an SDK to implement a language server in a particular language. For example, to implement a language server using Node.js there is the [language server npm module](https://www.npmjs.com/package/vscode-languageserver). diff --git a/language-server-protocol/_specifications/lsif/0.4.0/img/definitionResult.png b/language-server-protocol/_specifications/lsif/0.4.0/img/definitionResult.png deleted file mode 100644 index 47c49414e57921d071b3a809f56c7057bcc5038a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59343 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 P4iFtpLyc0zP0arQ1YpX2 diff --git a/language-server-protocol/_specifications/lsif/0.4.0/img/foldingRange.png b/language-server-protocol/_specifications/lsif/0.4.0/img/foldingRange.png deleted file mode 100644 index a5ad00176be08ce938f254cb9b6f1418fb958848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11616 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 Mr9VqmNf-tF4~$Reu>b%7 diff --git a/language-server-protocol/_specifications/lsif/0.4.0/img/hoverResult.png b/language-server-protocol/_specifications/lsif/0.4.0/img/hoverResult.png deleted file mode 100644 index 33705d1007afe740b4a43db17ee7e3f336454206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13606 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 Are we missing an implementation? File a new issue on GitHub to add it here. - -## LSIF exporter skeleton - -As [detailed in the spec](specification.md#project-exports-and-external-imports), the LSIF exporter consists of two tools: the index exporter and the package linker. - -### Index exporter - -The index exporter generates an LSIF dump for a workspace by traversing through source files and storing LSP responses. For TypeScript/JavaScript, [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc) is the index exporter. - -### Package linker - -The package linker converts the LSIF output of the index exporter into a global friendly index. By using package metadata, export `moniker` vertices are linked to packages available on a registry. For instance, the `observable` export from the mobx dependency is linked to the mobx dependency available on NPM. The package metadata is used to create the `packageInformation` vertices that reference external packages. - -For TypeScript/JavaScript, [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm) is the package manager linker for NPM. - -## Testing and validation - -### LSIF validation utility - -The [`lsif-util`](https://github.com/microsoft/lsif-node/tree/master/util) tool can validate your generated LSIF output. Additionally, the tool can also be used to search the output and visualize via Graphviz. - -### VS Code LSIF extension - -With the [LSIF extension for VS Code](https://github.com/Microsoft/vscode-lsif-extension), you can dogfood an LSIF index to power navigation inside VS Code. - -## Performance - -Generating LSIF for a project is expected to take roughly the same time as compilation. - -A primitive LSIF index exporter loops over source files, and for every symbol encountered, queries the language server for responses to LSP requests. With this approach, computing references can become very expensive: references are computed multiple times for the same symbol spread over files. This can be inefficient, depending on the language server implementation. - -This approach can optimized by computing references only once for a symbol spread over files. The approach taken by the [lsif-tsc](https://github.com/Microsoft/lsif-node) tool is outlined below: - -- Parse the project configuration to get source files -- Loop over files, and run the following on the AST of each file - - When you encounter a symbol, find out the binding of the symbol (declaration) - - If the binding is local to the file, create a referencesResult data structure and add symbols with the same binding. When the parsing of the file is complete, we know that the referenceResult is complete and can be emitted. - - If the binding is not local, keep result set in memory, and keep parsing other files. - -## Recommended checklist - -We have seen the following patterns work well in existing implementations. - -### Method checklist - -For an ideal integration with Rich Code Navigation, the following methods are required. For some languages, methods such as `textDocument/declaration` might not be applicable. - -- [ ] `textDocument/hover` -- [ ] `textDocument/definition` -- [ ] `textDocument/references` -- [ ] `textDocument/implementation` -- [ ] `textDocument/declaration` -- [ ] `textDocument/typeDefinition` -- [ ] `textDocument/diagnostic` -- [ ] Cross-repo navigation for dependencies - -### Cross-platform - -If the LSIF exporter does not work across platforms (Windows, Linux, Mac), platform dependencies should be called out. - -### Output format - -The LSIF exporter is expected to implement the [line-delimited JSON](https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON) (also known as [JSON lines](http://jsonlines.org/)) output format: series of JSON objects (vertex or edge) separated by newline. Since JSON lines is suitable for streaming output and works better for larger repos, it is preferred over a JSON array output. - -If an LSIF consumer requires a valid JSON array as input (for example, the VS Code LSIF extension), the JSON lines output can be converted into a JSON array by piping into a conversion tool. - -``` -cat lsif.jsonl | sed '1s/^/[/;$!s/$/,/;$s/$/]/' -``` - -If the LSIF exporter needs to log additional output, it is recommended to use `stderr`, since `stdout` is reserved for JSON line output. - -### Project configuration - -The LSIF index exporter can expose a flag to specify the root of the project directory. For example, the [TypeScript implementation](https://github.com/Microsoft/lsif-node) exposes the `--project` (`-p`) to specify the root of the tsconfig.json file. - -``` -lsif-tsc --project ./frontend/tsconfig.json -``` - -### Error behavior - -The LSIF tool is expected to signal for error conditions, with a numeric exit code. A successful execution returns a 0, whereas error conditions (unable to build project, unable to find project file) return 1. - -### Required documentation - -Since LSIF is an evolving protocol, it is critical to document the [protocol version](specification.md#changelog) supported by the exporter. - -## Support - -Feel free to reach out to us for questions by raising an issue on GitHub. diff --git a/language-server-protocol/_specifications/lsif/0.4.0/specification.md b/language-server-protocol/_specifications/lsif/0.4.0/specification.md deleted file mode 100644 index 30a1ed9e9..000000000 --- a/language-server-protocol/_specifications/lsif/0.4.0/specification.md +++ /dev/null @@ -1,1078 +0,0 @@ ---- -title: LSIF Specification -shortTitle: 0.4.0 (Previous) -layout: specifications -sectionid: lsif-0-4-0 -toc: lsif-0-4-0-toc -index: 2 -fullTitle: Language Server Index Format Specification - 0.4.0 ---- - -## Language Server Index Format - -The purpose of the Language Server Index Format (LSIF) is it to define a standard format for language servers or other programming tools to dump their knowledge about a workspace. This dump can later be used to answer language server [LSP](https://microsoft.github.io/language-server-protocol/) requests for the same workspace without running the language server itself. Since much of the information would be invalidated by a change to the workspace, the dumped information typically excludes requests used when mutating a document. So, for example, the result of a code complete request is typically not part of such a dump. - -### Changelog - -#### Version 0.4.0 - -Up to version 0.4.0 the focus of the LSIF format was to ease the generation of the dump for language tool providers. However this made it very hard for consumers of the dump to efficiently import them into a DB unless the DB format one to one mapped to the LSIF format. This version of the specification tries to balance this by requiring tools providers to emit additional events of when certain data is ready to be consumed. It also adds support to partition data per document. - -Since 0.4.0 changes some of the LSIF aspects more deeply an old 0.3.x version of the specification is available [here](https://github.com/microsoft/language-server-protocol/blob/master/indexFormat/versions/specification-0-3-x.md) - -## Motivation - -Principal design goals: - -- The format should not imply the use of a certain persistence technology. -- The data defined should be modeled as closely as possible to the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) to make it possible to serve the data through the LSP without further transformation. -- The data stored is result data usually returned from a LSP request. The dump doesn't contain any program symbol information nor does the LSIF define any symbol semantics (e.g. where a symbol is defined or referenced or when a method overrides another method). The LSIF therefore doesn't define a symbol database. Please note that this is consistent with the LSP itself which doesn't define any symbol semantics either. -- The output format will be based on JSON as with the LSP. - -LSP requests that are good candidates to be supported in LSIF are: - -- [`textDocument/documentSymbol`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_documentSymbol) -- [`textDocument/foldingRange`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_foldingRange) -- [`textDocument/documentLink`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_documentLink) -- [`textDocument/definition`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_definition) -- [`textDocument/declaration`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_declaration) -- [`textDocument/typeDefinition`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_typeDefinition) -- [`textDocument/hover`](https://microsoft.github.io/language-server-protocol/specifications/specification-3-15#textDocument_hover) -- [`textDocument/references`](https://microsoft.github.io/language-server-protocol/specifications/specification-3-15#textDocument_references) -- [`textDocument/implementation`](https://microsoft.github.io/language-server-protocol/specifications/specification-3-15#textDocument_implementation) - -The corresponding LSP requests have one of the following two forms: - -```typescript -request(uri, method) -> result -request(uri, position, method) -> result -``` - -where method is the JSON-RPC request method. - -Concrete examples are - -```typescript -request('file:///Users/dirkb/sample/test.ts', 'textDocument/foldingRange') -> FoldingRange[]; -request('file:///Users/dirkb/sample/test.ts', { line: 10, character: 17 }, 'textDocument/hover') -> Hover; -``` - -The input tuple to a request is either `[uri, method]` or `[uri, position, method]` and the output is some form of result. For the same `uri` and `[uri, position]` tuple, there are many different requests to execute. - -The dump format therefore should support the following features: - -- Input data must be easily queryable (e.g. the document and the position). -- Each element has a unique id (which may be a string or a number). -- It should be possible to emit data as soon as it is available to allow streaming rather than large memory requirements. For example, emitting data based on document syntax should be done for each file as parsing progresses. -- It should be easy to add additional requests later on. -- It should be easy for a tool to consume a dump and for example import it into a database without holding the dump in memory. - - -We came to the conclusion that the most flexible way to emit this is a graph, where edges represent the method and vertices are `[uri]`, `[uri, position]` or a request result. This data could then be stored as JSON or read into a database that can represent these vertices and relationships. - -Assume there is a file `/Users/dirkb/sample.ts` and we want to store the folding range information with it then the indexer emits two vertices: one representing the document with its URI `file:///Users/dirkb/sample.ts`, the other representing the folding result. In addition, an edge would be emitted representing the `textDocument/foldingRange` request. - -```typescript -{ id: 1, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } -{ id: 2, type: "vertex", label: "foldingRangeResult", result: [ { ... }, { ... }, ... ] } -{ id: 3, type: "edge", label: "textDocument/foldingRange", outV: 1, inV: 2 } -``` - -The corresponding graph looks like this - -Folding Range Result - -### Ranges - -For requests that take a position as its input, we need to store the position as well. Usually LSP requests return the same result for positions that point to the same word / name in a document. Take the following TypeScript example: - -```typescript -function bar() { -} -``` - -A hover request for a position denoting the `b` in `bar` will return the same result as a position denoting the `a` or `r`. To make the dump more compact, it will use ranges to capture this instead of single positions. The following vertices will be emitted in this case. Note that line, character are zero based as in the LSP: - -```typescript -{ id: 4, type: "vertex", label: "range", start: { line: 0, character: 9}, end: { line: 0, character: 12 } } -``` - -To bind the range to a document, we use a special edge labeled `contains` which points from a document to a set of ranges. - -```typescript -{ id: 5, type: "edge", label: "contains", outV: 1, inVs: [4] } -``` - -LSIF supports 1:n edges for the `contains` relationship which in a graph can easily be mapped to n 1:1 edges. LSIF support this for two reasons: (a) to make the output more compact since a document usually contains hundreds of those ranges and (b) to easy the import and batching for consumers of a LSIF dump. - -To bind the hover result to the range, we use the same pattern as we used for the folding ranges. We emit a vertex representing the hover result and an edge representing the `textDocument/hover` request. - -```typescript -{ - id: 6, - type: "vertex", - label: "hoverResult", - result: { - contents: [ - { language: "typescript", value: "function bar(): void" } - ] - } -} -{ id: 7, type: "edge", label: "textDocument/hover", outV: 4, inV: 6 } -``` - -The corresponding graph looks like this - -Hover Result - -The ranges emitted for a document in the contains relationship must follow these rules: - -1. a given range ID can only be contained in one document or in other words: ranges must not be shared between documents even if they have the same start / end value. -1. No two ranges can be equal. -1. No two ranges can overlap, claiming the same position in a document unless one range is entirely contained by the other. - -If a position in a document is mapped to a range and more than one range covers the position, the following algorithm should be used: - -1. sort the ranges by containment with innermost first -1. for range in ranges do - 1. check if the range has an outgoing edge `textDocument/${method}` - 1. if yes, use it -1. end -1. return `null` - -### Result Set - -Usually the hover result is the same whether you hover over a definition of a function or over a reference of that function. The same is actually true for many LSP requests like `textDocument/definition`, `textDocument/references` or `textDocument/typeDefinition`. In a naïve model, each range would have outgoing edges for all these LSP requests and would point to the corresponding results. To optimize this and to make the graph easier to understand, the concept of a `ResultSet` is introduced. A result set acts as a hub to be able to store information common to a lot of ranges. The `ResultSet` itself doesn't carry any information. So it looks like this: - -```typescript -export interface ResultSet { -} -``` - -The corresponding output of the above example with a hover using a result set looks like this: - -```typescript -{ id: 1, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } -{ id: 2, type: "vertex", label: "resultSet" } -{ id: 3, type: "vertex", label: "range", start: { line: 0, character: 9}, end: { line: 0, character: 12 } } -{ id: 4, type: "edge", label: "contains", outV: 1, inVs: [3] } -{ id: 5, type: "edge", label: "next", outV: 3, inV: 2 } -{ id: 6, type: "vertex", label: "hoverResult", result: {"contents":[{"language":"typescript","value":"function bar(): void"},""] } -{ id: 7, type: "edge", label: "textDocument/hover", outV: 2, inV: 6 } -``` - -Result Set - -Result sets are linked to ranges using a `next` edge. A results set can also forward information to another result set by linking to it using a `next` edge. - -The pattern of storing the result with the `ResultSet` will be used for other requests as well. The lookup algorithm is therefore as follows for a request [document, position, method]: - -1. find all ranges for [document, position]. If none exist, return `null` as the result -1. sort the ranges by containment the innermost first -1. for range in ranges do - 1. assign range to out - 1. while out !== `null` - 1. check if out has an outgoing edge `textDocument/${method}`. if yes, use it and return the corresponding result - 1. check if out has an outgoing `next` edge. If yes, set out to the target vertex. Else set out to `null` - 1. end -1. end -1. otherwise return `null` - -## Language Features - -### Request: `textDocument/definition` - -The same pattern of connecting a range, result set, or a document with a request edge to a method result is used for other requests as well. Let's next look at the `textDocument/definition` request using the following TypeScript sample: - -```typescript -function bar() { -} - -function foo() { - bar(); -} -``` - -This will emit the following vertices and edges to model the `textDocument/definition` request: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } - -// The bar declaration -{ id: 6, type: "vertex", label: "resultSet" } -{ id: 9, type: "vertex", label: "range", start: { line: 0, character: 9 }, end: { line: 0, character: 12 } } -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - - -// The bar reference -{ id: 20, type: "vertex", label: "range", start: { line: 4, character: 2 }, end: { line: 4, character: 5 } } -{ id: 21, type: "edge", label: "next", outV: 20, inV: 6} - -// The definition result linked to the bar result set -{ id: 22, type: "vertex", label: "definitionResult" } -{ id: 23, type: "edge", label: "textDocument/definition", outV: 6, inV: 22 } -{ id: 24, type: "edge", label: "item", outV: 22, inVs: [9], document: 4 } -``` - -Definition Result - -The definition result above has only one value (the range with id '9') and we could have emitted it directly. However, we introduced the definition result vertex for two reasons: - -- To have consistency with all other requests that point to a result. -- To have support for languages where a definition can be spread over multiple ranges or even multiple documents. To support multiple documents ranges are added to a definition result using an 1:N `item` edge. Conceptionally a definition result is an array to which the `item` edge adds items. - -Consider the following TypeScript example: - -```typescript -interface X { - foo(); -} -interface X { - bar(); -} -let x: X; -``` - -Running **Go to Definition** on `X` in `let x: X` will show a dialog which lets the user select between the two definitions of the `interface X`. The emitted JSON in this case looks like this: - -```typescript -{ id : 38, type: "vertex", label: "definitionResult" } -{ id : 40, type: "edge", label: "item", outV: 38, inVs: [9, 13], document: 4 } -``` - -The `item` edge as an additional property document which indicate in which document these declaration are. We added this information to still make it easy to emit the data but also make it easy to process the data to store it in a database. Without that information we would either need to specific an order in which data needs to be emitted (e.g. a item edge and only refer to a range that got already added to a document using a `containes` edge) or we force processing tools to keep a lot of vertices and edges in memory. The approach of having this `document` property looks like a fair balance. - -### Request: `textDocument/declaration` - -There are programming languages that have the concept of declarations and definitions (like C/C++). If this is the case, the dump can contain a corresponding `declarationResult` vertex and a `textDocument/declaration` edge to store the information. They are handled analogously to the entities emitted for the `textDocument/definition` request. - -### More about Request: `textDocument/hover` - -In the LSP, the hover is defined as follows: - -```typescript -export interface Hover { - /** - * The hover's content - */ - contents: MarkupContent | MarkedString | MarkedString[]; - - /** - * An optional range - */ - range?: Range; -} -``` - -where the optional range is the name range of the word hovered over. - -> **Side Note**: This is a pattern used for other LSP requests as well, where the result contains the word range of the word the position parameter pointed to. - -This makes the hover different for every location so we can't really store it with the result set. But wait, the range is the range of one of the `bar` references we already emitted and used to start to compute the result. To make the hover still reusable, we ask the index server to fill in the starting range if no range is defined in the result. So for a hover request executed on range `{ line: 4, character: 2 }, end: { line: 4, character: 5 }` the hover result will be: - -```typescript -{ id: 6, type: "vertex", label: "hoverResult", result: { contents: [ { language: "typescript", value: "function bar(): void" } ], range: { line: 4, character: 2 }, end: { line: 4, character: 5 } } } -``` - -### Request: `textDocument/references` - -Storing references will be done in the same way as storing a hover or go to definition ranges. It uses a reference result vertex and `item` edges to add ranges to the result. - -Look at the following example: - -```typescript -function bar() { -} - -function foo() { - bar(); -} -``` - -The relevant JSON output looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } - -// The bar declaration -{ id: 6, type: "vertex", label: "resultSet" } -{ id: 9, type: "vertex", label: "range", start: { line: 0, character: 9 }, end: { line: 0, character: 12 } } -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - -// The bar reference range -{ id: 20, type: "vertex", label: "range", start: { line: 4, character: 2 }, end: { line: 4, character: 5 } } -{ id: 21, type: "edge", label: "next", outV: 20, inV: 6 } - -// The reference result -{ id : 25, type: "vertex", label: "referenceResult" } -// Link it to the result set -{ id : 26, type: "edge", label: "textDocument/references", outV: 6, inV: 25 } - -// Add the bar definition as a reference to the reference result -{ id: 27, type: "edge", label: "item", outV: 25, inVs: [9], document: 4, property : "definitions" } - -// Add the bar reference as a reference to the reference result -{ id: 28, type: "edge", label: "item", outV: 25, inVs: [20], document:4, property: "references" } -``` - -References Result - -We tag the `item` edge with id 27 as a definition since the reference result distinguishes between definitions, declarations, and references. This is done since the `textDocument/references` request takes an additional input parameter `includeDeclarations` controlling whether declarations and definitions are included in the result as well. Having three distinct properties allows the server to compute the result accordingly. - -The item edge also support linking reference results to other reference results. This is useful when computing references to methods overridden in a type hierarchy. - -Take the following example: - -```typescript -interface I { - foo(): void; -} - -class A implements I { - foo(): void { - } -} - -class B implements I { - foo(): void { - } -} - -let i: I; -i.foo(); - -let b: B; -b.foo(); -``` - -The reference result for the method `foo` in TypeScript contains all three declarations and both references. While parsing the document, one reference result is created and then shared between all result sets. - -The output looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } - -// The declaration of I#foo -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 16, type: "vertex", label: "range", start: { line: 1, character: 2 }, end: { line: 1, character: 5 } } -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } -// The reference result for I#foo -{ id: 30, type: "vertex", label: "referenceResult" } -{ id: 31, type: "edge", label: "textDocument/references", outV: 13, inV: 30 } - -// The declaration of A#foo -{ id: 29, type: "vertex", label: "resultSet" } -{ id: 34, type: "vertex", label: "range", start: { line: 5, character: 2 }, end: { line: 5, character: 5 } } -{ id: 35, type: "edge", label: "next", outV: 34, inV: 29 } - -// The declaration of B#foo -{ id: 47, type: "vertex", label: "resultSet" } -{ id: 50, type: "vertex", label: "range", start: { line: 10, character: 2 }, end: { line: 10, character: 5 } } -{ id: 51, type: "edge", label: "next", outV: 50, inV: 47 } - -// The reference i.foo() -{ id: 65, type: "vertex", label: "range", start: { line: 15, character: 2 }, end: { line: 15, character: 5 } } - -// The reference b.foo() -{ id: 78, type: "vertex", label: "range", start: { line: 18, character: 2 }, end: { line: 18, character: 5 } } - -// The insertion of the ranges into the shared reference result -{ id: 90, type: "edge", label: "item", outV: 30, inVs: [16,34,50], document: 4, property: definitions } -{ id: 91, type: "edge", label: "item", outV: 30, inVs: [65,78], document: 4, property: references } - -// Linking A#foo to I#foo -{ id: 101, type: "vertex", label: "referenceResult" } -{ id: 102, type: "edge", label: "textDocument/references", outV: 29, inV: 101 } -{ id: 103, type: "edge", label: "item", outV: 101, inVs: [30], document: 4, property: referenceResults } - -// Linking B#foo to I#foo -{ id: 114, type: "vertex", label: "referenceResult" } -{ id: 115, type: "edge", label: "textDocument/references", outV: 47, inV: 114 } -{ id: 116, type: "edge", label: "item", outV: 114, inVs: [30], document: 4, property: referenceResults } -``` - -One goal of the language server index format is that the information can be emitted as soon as possible without caching too much information in memory. With languages that support overriding methods defined in more than one interface, this can be more complicated since the whole inheritance tree might only be known after parsing all documents. - -Take the following TypeScript example: - -```typescript -interface I { - foo(): void; -} - -interface II { - foo(): void; -} - -class B implements I, II { - foo(): void { - } -} - -let i: I; -i.foo(); - -let b: B; -b.foo(); -``` - -Searching for `I#foo()` finds 4 references, searching for `II#foo()` finds 3 reference, and searching on `B#foo()` finds 5 results. The interesting part here is when the declaration of `class B` gets processed which implements `I` and `II`, neither the reference result bound to `I#foo()` nor the one bound to `II#foo()` can be reused. So we need to create a new one. To still be able to profit from the results generated for `I#foo` and `II#foo`, the LSIF supports nested references results. This way the one referenced from `B#foo` will reuse the one from `I#foo` and `II#foo`. Depending on how these declarations are parsed, the two reference results might contain the same references. When a language server interprets reference results consisting of other reference results, the server is responsible to de-dup the final ranges. - -In the above example, there will be three reference results - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } - -// Declaration of I#foo -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 16, type: "vertex", label: "range", start: { line: 1, character: 2 }, end: { line: 1, character: 5 } } -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } - -// Declaration of II#foo -{ id: 27, type: "vertex", label: "resultSet" } -{ id: 30, type: "vertex", label: "range", start: { line: 5, character: 2 }, end: { line: 5, character: 5 } } -{ id: 31, type: "edge", label: "next", outV: 30, inV: 27 } - -// Declaration of B#foo -{ id: 45, type: "vertex", label: "resultSet" } -{ id: 52, type: "vertex", label: "range", start: { line: 9, character: 2 }, end: { line: 9, character: 5 } } -{ id: 53, type: "edge", label: "next", outV: 52, inV: 45 } - -// Reference result for I#foo -{ id: 46, type: "vertex", label: "referenceResult" } -{ id: 47, type: "edge", label: "textDocument/references", outV: 13, inV: 46 } - -// Reference result for II#foo -{ id: 48, type: "vertex", label: "referenceResult" } -{ id: 49, type: "edge", label: "textDocument/references", outV: 27, inV: 48 } - -// Reference result for B#foo -{ id: 116 "typ" :"vertex", label: "referenceResult" } -{ id: 117 "typ" :"edge", label: "textDocument/references", outV: 45, inV: 116 } - -// Link B#foo reference result to I#foo and II#foo -{ id: 118 "typ" :"edge", label: "item", outV: 116, inVs: [46,48], document: 4, property: "referenceResults" } -``` - -For Typescript, method references are recorded at their most abstract declaration and if methods are merged (`B#foo`), they are combined using a reference result pointing to other results. - -### Request: `textDocument/implementation` - -Supporting a `textDocument/implementation` request is done reusing what we implemented for a `textDocument/references` request. In most cases, the `textDocument/implementation` returns the declaration values of the reference result that a symbol declaration points to. For cases where the result differs, the LSIF provides an `ImplementationResult`. To nest implementation results the `item` edge supports a `property` value `"implementationResults"`. - -The corresponding `ImplementationResult` looks like this: - -```typescript -interface ImplementationResult { - - label: `implementationResult` -} -``` - -### Request: `textDocument/typeDefinition` - -Supporting `textDocument/typeDefinition` is straightforward. The edge is either recorded at the range or at the `ResultSet`. - -The corresponding `TypeDefinitionResult` looks like this: - -```typescript -interface TypeDefinitionResult { - - label: `typeDefinitionResult` -} -``` - -For the following TypeScript example: - -```typescript -interface I { - foo(): void; -} - -let i: I; -``` - -The relevant emitted vertices and edges looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } - -// The declaration of I -{ id: 6, type: "vertex", label: "resultSet" } -{ id: 9, type: "vertex", label: "range", start: { line: 0, character: 10 }, end: { line: 0, character: 11 } } -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - -// The declaration of i -{ id: 26, type: "vertex", label: "resultSet" } -// The type definition result -{ id: 37, type: "vertex", label: "typeDefinitionResult" } -// Hook the result to the declaration -{ id: 38, type: "edge", label: "textDocument/typeDefinition", outV: 26, inV:37 } -// Add the declaration of I as a target range. -{ id: 51, type: "edge", label: "item", outV: 37, inVs: [9], document: 4 } -``` - -As with other results ranges get added using a `item` edge. In this case without a `property` since there is only one kind of range. - -## Document requests - -The Language Server Protocol also supports requests for documents only (without any position information). These requests are `textDocument/foldingRange`, `textDocument/documentLink`, and `textDocument/documentSymbol`. We follow the same pattern as before to model these, the difference being that the result is linked to the document instead of to a range. - -### Request: `textDocument/foldingRange` - -For the folding range result this looks like this: - -```typescript -function hello() { - console.log('Hello'); -} - -function world() { - console.log('world'); -} - -function space() { - console.log(' '); -} -hello();space();world(); -``` - -```typescript -{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } -{ id: 112, type: "vertex", label: "foldingRangeResult", result:[ - { startLine: 0, startCharacter: 16, endLine: 2, endCharacter: 1 }, - { startLine: 4, startCharacter: 16, endLine: 6, endCharacter: 1 }, - { startLine: 8, startCharacter: 16, endLine: 10, endCharacter: 1 } -]} -{ id: 113, type: "edge", label: "textDocument/foldingRange", outV: 2, inV: 112 } -``` - -The corresponding `FoldingRangeResult` is defined as follows: - -```typescript -export interface FoldingRangeResult { - label: 'foldingRangeResult'; - - result: lsp.FoldingRange[]; -} -``` - -### Request: `textDocument/documentLink` - -Again, for document links, we define a result type and a corresponding edge to link it to a document. Since the link location usually appear in comments, the ranges don't denote any symbol declarations or references. We therefore inline the range into the result like we do with folding ranges. - -```typescript -export interface DocumentLinkResult { - label: 'documentLinkResult'; - - result: lsp.DocumentLink[]; -} -``` - -### Request: `textDocument/documentSymbol` - -Next we look at the `textDocument/documentSymbol` request. This request usually returns an outline view of the document in hierarchical form. However, not all programming symbols declared or defined in a document are part of the result (for example, locals are usually omitted). In addition, an outline item needs to provide additional information like the full range and a symbol kind. There are two ways we can model this: either we do the same as we do for folding ranges and the document links and store the information in a document symbol result as literals, or we extend the range vertex with some additional information and refer to these ranges in the document symbol result. Since the additional information for ranges might be helpful in other scenarios as well, we support adding additional tags to these ranges by defining a `tag` property on the `range` vertex. - -The following tags are currently supported: - -```typescript -/** - * The range represents a declaration - */ -export interface DeclarationTag { - - /** - * A type identifier for the declaration tag. - */ - type: 'declaration'; - - /** - * The text covered by the range - */ - text: string; - - /** - * The kind of the declaration. - */ - kind: lsp.SymbolKind; - - /** - * The full range of the declaration not including leading/trailing whitespace but everything else, e.g comments and code. - * The range must be included in fullRange. - */ - fullRange: lsp.Range; - - /** - * Optional detail information for the declaration. - */ - detail?: string; -} - -/** - * The range respresents a definition - */ -export interface DefinitionTag { - /** - * A type identifier for the declaration tag. - */ - type: 'definition'; - - /** - * The text covered by the range - */ - text: string; - - /** - * The symbol kind. - */ - kind: lsp.SymbolKind; - - /** - * The full range of the definition not including leading/trailing whitespace but everything else, e.g comments and code. - * The range must be included in fullRange. - */ - fullRange: lsp.Range; - - /** - * Optional detail information for the definition. - */ - detail?: string; -} - -/** - * The range represents a reference - */ -export interface ReferenceTag { - - /** - * A type identifier for the reference tag. - */ - type: 'reference'; - - /** - * The text covered by the range - */ - text: string; -} - -/** - * The type of the range is unknown. - */ -export interface UnknownTag { - - /** - * A type identifier for the unknown tag. - */ - type: 'unknown'; - - /** - * The text covered by the range - */ - text: string; -} -``` - -Emitting the tags for the following TypeScript example: - -```typescript -function hello() { -} - -hello(); -``` - -Will look like this: - -```typescript -{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } -{ id: 4, type: "vertex", label: "resultSet" } -{ id: 7, type: "vertex", label: "range", - start: { line: 0, character: 9 }, end: { line: 0, character: 14 }, - tag: { type: "definition", text: "hello", kind: 12, fullRange: { start: { line: 0, character: 0 }, end: { line: 1, character: 1 }}} -} -``` - -The document symbol result is then modeled as follows: - -```typescript -export interface RangeBasedDocumentSymbol { - - id: RangeId - - children?: RangeBasedDocumentSymbol[]; -} - -export interface DocumentSymbolResult extends V { - - label: 'documentSymbolResult'; - - result: lsp.DocumentSymbol[] | RangeBasedDocumentSymbol[]; -} -``` - -The given TypeScript example: - -```typescript -namespace Main { - function hello() { - } - function world() { - let i: number = 10; - } -} -``` - -Produces the following output: - -```typescript -// The document -{ id: 2 , type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } -// The declaration of Main -{ id: 7 , type: "vertex", label: "range", start: { line: 0, character: 10 }, end: { line: 0, character: 14 }, tag: { type: "definition", text: "Main", kind: 7, fullRange: { start: { line: 0, character: 0 }, end: { line: 5, character: 1 } } } } -// The declaration of hello -{ id: 18 , type: "vertex", label: "range", start: { line: 1, character: 11 }, end: { line: 1, character: 16 }, tag: { type: "definition", text: "hello", kind: 12, fullRange: { start: { line: 1, character: 2 }, end: { line: 2, character: 3 } } } } -// The declaration of world -{ id: 29 , type: "vertex", label: "range", start: { line: 3, character: 11 }, end: { line: 3, character: 16 }, tag: { type: "definition", text: "world", kind: 12, fullRange: { start: { line: 3, character: 2 }, end: { line: 4, character: 3 } } } } -// The document symbol -{ id: 39 , type: "vertex", label: "documentSymbolResult", result: [ { id: 7 , children: [ { id: 18 }, { id: 29 } ] } ] } -{ id: 40 , type: "edge", label: "textDocument/documentSymbol", outV: 2, inV: 39 } -``` - -### Request: `textDocument/diagnostic` - -The only information missing that is useful in a dump are the diagnostics associated with documents. Diagnostics in the LSP are modeled as a push notifications sent from the server to the client. This doesn't work well with a dump modeled on request method names. However, the push notification can be emulated as a request where the request's result is the value sent during the push as a parameter. - -In the dump, we model diagnostics as follows: - -- We introduce a pseudo request `textDocument/diagnostic`. -- We introduce a diagnostic result which contains the diagnostics associated with a document. - -The result looks like this: - -```typescript -export interface DiagnosticResult { - - label: 'diagnosticResult'; - - result: lsp.Diagnostic[]; -} -``` - -The given TypeScript example: - -```typescript -function foo() { - let x: string = 10; -} -``` - -Produces the following output: - -```typescript -{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } -{ id: 18, type: "vertex", label: "diagnosticResult", result: [{ severity: 1, code: 2322, message: "Type '10' is not assignable to type 'string'.", range: { start : { line: 1, character: 5 }, end: { line: 1, character: 6 } } } ] } -{ id: 19, type: "edge", label: "textDocument/diagnostic", outV: 2, inV: 18 } -``` - -Since diagnostics are not very common in dumps, no effort has been made to reuse ranges in diagnostics. - -### The Project vertex - -Usually language servers operate in some sort of project context. In TypeScript, a project is defined using a `tsconfig.json` file. C# and C++ have their own means. The project file usually contains information about compile options and other parameters. Having these in the dump can be valuable. The LSIF therefore defines a project vertex. In addition, all documents that belong to that project are connected to the project using a `contains` edge. If there was a `tsconfig.json` in the previous examples, the first emitted edges and vertices would look like this: - -```typescript -{ id: 1, type: "vertex", label: "project", resource: "file:///Users/dirkb/tsconfig.json", kind: "typescript"} -{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } -{ id: 3, type: "edge", label: "contains", outV: 1, inVs: [2] } -``` - -The definition of the `project` vertex looks as follows: - -```ts -export interface Project extends V { - - /** - * The label property. - */ - label: VertexLabels.project; - - /** - * The project kind like 'typescript' or 'csharp'. See also the language ids - * in the [specification](https://microsoft.github.io/language-server-protocol/specification) - */ - kind: string; - - /** - * The resource URI of the project file. - */ - resource?: Uri; - - /** - * Optional the content of the project file, `base64` encoded. - */ - contents?: string; -} -``` - -### Embedding contents - -It can be valuable to embed the contents of a document or project file into the dump as well. For example, if the content of the document is a virtual document generated from program meta data. The index format therefore supports an optional `contents` property on the `document` and `project` vertex. If used the content needs to be `base64` encoded. - -## Advanced Concepts - -### Events - -To ease the processing of an LSIF dump to for example import it into a database the dump emits begin and end events for documents and projects. After the end event of a document has been emitted the dump must not contain any further data referencing that document. For example no ranges from that document can be referenced in `item` edges. Nor can result sets or other vertices linked to the ranges in that document. The document can however be referenced in a `contains` edge adding the document to a project. The begin / end events for documents look like this: - -```ts -// The actual document -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", contents: "..." } -// The begin event -{ id: 5, type: "vertex", label: "$event", kind: "begin", scope: "document" , data: 4 } -// The end event -{ id: 53, type: "vertex", label: "$event", kind: "end", scope: "document" , data: 4 } -``` - -Between the document vertex `4` and the document begin event `5` no information specific to document `4` can be emitted. Please note that more than one document can be open at a given point in time meaning that there have been n different document begin events without corresponding document end events. - -The events for projects looks similar: - -```ts -{ id: 2, type: "vertex", label: "project", kind: "typescript" } -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", contents: "..." } -{ id: 5, type: "vertex", label: "$event", kind: "begin", scope: "document" , data: 4 } -{ id: 3, type: "vertex", label: "$event", kind: "begin", scope: "project", data: 2 } -{ id: 53, type: "vertex", label: "$event", kind: "end", scope: "document", data: 4 } -{ id: 54, type: "edge", label: "contains", outV: 2, inVs: [4] } -{ id: 55, type: "vertex", label: "$event", kind: "end", scope: "project", data: 2 } -``` - -### Project exports and external imports (Monikers) - -One use case of the LSIF is to create dumps for released versions of a product, either a library or a program. If a project **A** references a library **B**, it would also be useful if the information in these two dumps could be related. To make this possible, the LSIF introduces optional monikers which can be linked to ranges using a corresponding edge. The monikers can be used to describe what a project exports and what it imports. Let's first look at the export case. - -Consider the following TypeScript file called `index.ts`: - -```typescript -export function func(): void { -} - -export class Emitter { - private doEmit() { - } - - public emit() { - this.doEmit(); - } -} -``` - -```typescript -{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/index.ts", languageId: "typescript", contents: "..." } -{ id: 11, type: "vertex", label: "resultSet" } -{ id: 12, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:func" } -{ id: 13, type: "edge", label: "moniker", outV: 11, inV: 12 } -{ id: 14, type: "vertex", label: "range", start: { line: 0, character: 16 }, end: { line: 0, character: 20 } } -{ id: 15, type: "edge", label: "next", outV: 14, inV: 11 } - -{ id: 18, type: "vertex", label: "resultSet" } -{ id: 19, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:Emitter" } -{ id: 20, type: "edge", label: "moniker", outV: 18, inV: 19 } -{ id: 21, type: "vertex", label: "range", start: { line: 3, character: 13 }, end: { line: 3, character: 20 } } -{ id: 22, type: "edge", label: "next", outV: 21, inV: 18 } - -{ id: 25, type: "vertex", label: "resultSet" } -{ id: 26, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.doEmit" } -{ id: 27, type: "edge", label: "moniker", outV: 25, inV: 26 } -{ id: 28, type: "vertex", label: "range", start: { line: 4, character: 10 }, end: { line: 4, character: 16 } } -{ id: 29, type: "edge", label: "next", outV: 28, inV: 25 } - -{ id: 32, type: "vertex", label: "resultSet" } -{ id: 33, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.emit" } -{ id: 34, type: "edge", label: "moniker", outV: 32, inV: 33 } -{ id: 35, type: "vertex", label: "range", start: { line: 7, character: 9 }, end: { line: 7, character: 13 } } -{ id: 36, type: "edge", label: "next", outV: 35, inV: 32 } -``` - -This describes the exported declaration inside `index.ts` with a moniker (e.g. a handle in string format) that is bound to the corresponding range declaration. The generated moniker must be position independent and stable so that it can be used to identify the symbol in other projects or documents. It should be sufficiently unique so as to avoid matching other monikers in other projects unless they actually refer to the same symbol. A moniker therefore has two properties: a `scheme` to indicate how the `identifiers` is to be interpreted. And the `identifier` to actually identify the symbol. Its structure is opaque to the scheme owner. In the above example the monikers are created by the TypeScript compiler tsc and can only be compared to monikers also having the scheme `tsc`. - -Please also note that the method `Emitter#doEmit` has a moniker although the method is private. If private elements do have monikers depends on the programming language. Since TypeScript cant enforce visibility (it compiles to JS which doesn't have the concept) we treat them as visible. Even the TypeScript language server does so. Find all references does find all references to private methods even if it is flagged as a visibility violation. - -How these exported elements are visible in other projects in most programming languages depends on how many files are packaged into a library or program. In TypeScript, the standard package manager is npm. - -Consider that the following `package.json` file exists: - -```json -{ - "name": "lsif-ts-sample", - "version": "1.0.0", - "description": "", - "main": "lib/index.js", - "author": "MS", - "license": "MIT", -} -``` - -then these monikers can be translated into monikers that are `npm` dependent. Instead of replacing the monikers we emit a second set of monikers and link the `tsc` monikers to corresponding `npm` monikers using a `nextMoniker`edge: - -```typescript -{ id: 991, type: "vertex", label: "packageInformation", name: "lsif-ts-sample", manager: "npm", version: "1.0.0" } - -{ id: 987, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::func" } -{ id: 986, type: "edge", label: "packageInformation", outV: 987, inV: 991 } -{ id: 985, type: "edge", label: "nextMoniker", outV: 12, inV: 987 } - -{ id: 984, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter" } -{ id: 983, type: "edge", label: "packageInformation", outV: 984, inV: 991 } -{ id: 982, type: "edge", label: "nextMoniker", outV: 19, inV: 984 } - -{ id: 981, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter.doEmit" } -{ id: 980, type: "edge", label: "packageInformation", outV: 981, inV: 991 } -{ id: 979, type: "edge", label: "nextMoniker", outV: 26, inV: 981 } - -{id: 978, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter.emit" } -{id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } -{id: 976, type: "edge", label: "nextMoniker", outV: 33, inV: 978 } -``` -Things to observe: - -- a special `packageInformation`vertex got emitted to point to the corresponding npm package information. -- the npm moniker refer to the package name. -- since the file `index.ts` is the npm main file the moniker identifier as no file path. The is comparable to importing this module into TypeScript or JavaScript were only the module name and no file path is used (e.g. `import * as lsif from 'lsif-ts-sample'`). -- the `nextMoniker` edge points from the tsc moniker vertex to the npm moniker vertex. - -For LSIF we recommend that a second tool is used to make the monikers emitted by the indexer be package manager dependent. This supports the use of different package managers and allows incorporating custom build tools. In the TypeScript implementation, this is done by a npm specific tool which rewrites the monikers taking the npm package information into account. - -Reporting importing external symbols is done using the same approach. The LSIF emits monikers of kind `import`. Consider the following typescript example: - -```typescript -import * as mobx from 'mobx'; - -let map: mobx.ObservableMap = new mobx.ObservableMap(); -``` - -where `mobx` is the [npm mobx package](https://www.npmjs.com/package/mobx). Running the tsc index tools produces: - -```typescript -{ id: 41, type: "vertex", label: "document", uri: "file:///Users/dirkb/samples/node_modules/mobx/lib/types/observablemap.d.ts", languageId: "typescript", contents: "..." } -{ id: 55, type: "vertex", label: "resultSet" } -{ id: 57, type: "vertex", label: "moniker", kind: "import", scheme: "tsc", identifier: "node_modules/mobx/lib/mobx:ObservableMap" } -{ id: 58, type: "edge", label: "moniker", outV: 55, inV: 57 } -{ id: 59, type: "vertex", label: "range", start: { line: 17, character: 538 }, end: { line: 17, character: 551 } } -{ id: 60, type: "edge", label: "next", outV: 59, inV: 55 } -``` - -Three things to note here: First, TypeScript uses declarations files for externally imported symbols. That has the nice effect that the moniker information can be attached to the declaration ranges in these files. In other languages, the information might be attached to the file actually referencing the symbol. Or a virtual document for the referenced item is generated. Second, the tool only generates this information for symbols actually referenced, not for all available symbols. Third these monikers are `tsc` specific and point to the `node_modules` folder. - -However piping this information through the npm tool will generate the following information: - -```typescript -{id: 991, type: "vertex", label: "packageInformation", name: "mobx", manager: "npm", version: "5.6.0", repository: { type: "git", url: "git+https://github.com/mobxjs/mobx.git" } } -{ id: 978, type: "vertex", label: "moniker", kind: "import", scheme: "npm", identifier: "mobx::ObservableMap" } -{ id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } -{ id: 976, type: "edge", label: "nextMoniker", outV: 978, inV: 57 } -``` - -which made the moniker specific to the npm `mobx` package. In addition information about the `mobx` package itself got emitted. Please note that since this is an import moniker the `nextMoniker` edge points from the `npm` moniker to the `tsc` moniker. - -Usually monikers are attached to result sets since they are the same for all ranges pointing to the result set. However for dumps that don't use result sets, monikers can also be emitted on ranges. - -For tools processing the dump and importing it into a database it is sometime useful to know whether a result is local to a file or not (for example function arguments can only be navigated inside the file). To help postprocessing tools to decide this LSIF generation tools should generate a moniker for locals as well. The corresponding kind to use is `local`. The identifier should still be unique inside the document. - -For the following example - -```ts -funciton foo(x: number): void { -} -``` - -The moniker for `x` looks like this: - -```ts -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 14, type: "vertex", label: "moniker", kind: "local", scheme: "tsc", identifier: "SfeOP6s53Y2HAkcViolxYA==" } -{ id: 15, type: "edge", label: "moniker", outV: 13, inV: 14 } -{ id: 16, type: "vertex", label: "range", start: { line: 0, character: 13 }, end: { line: 0, character: 14 }, tag: { type: "definition", text: "x", kind: 7, fullRange: { start: { line: 0, character: 13 }, end: { line: 0, character: 22 } } } } -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } -``` - -In addition to this moniker schemes starting with `$` are reserved and shouldn't be used by a LSIF tool. - -### Result ranges - -Ranges in LSIF have currently two meanings: - -1. they act as LSP request sensitive areas in a document (e.g. we use them to decide if for a given position a corresponding LSP request result exists) -1. they act as navigation targets (e.g. they are the result of a Go To declaration navigation). - -To fulfil the first LSIF specifies that ranges can't overlap or be the same. However this constraint is not necessary for the second meaning. To support equal or overlapping target ranges we introduce a vertex `resultRange`. It is not allowed to use a `resultRange` as a target in a `contains` edge. - -### Meta Data Vertex - -To support versioning the LSIF defines a meta data vertex as follows: - -```typescript -export interface MetaData { - - /** - * The label property. - */ - label: 'metaData'; - - /** - * The version of the LSIF format using semver notation. See https://semver.org/. Please note - * the version numbers starting with 0 don't adhere to semver and adopters have to assume - * the each new version is breaking. - */ - version: string; - - /** - * The project root (in form of an URI) used to compute this dump. - */ - projectRoot: Uri; - - /** - * The string encoding used to compute line and character values in - * positions and ranges. Currently only 'utf-16' is support due to the - * limitations in LSP. - */ - positionEncoding: 'utf-16', - - /** - * Information about the tool that created the dump - */ - toolInfo?: { - name: string; - version?: string; - args?: string[]; - } -} -``` - -### Emitting constraints - -The following emitting constraints (some of which have already been mentioned in the document) exist: - -- a vertex needs to be emitted before it can be referenced in an edge. -- a `range` and `resultRange` can only be contained in one document. -- a `resultRange` can not be used as a target in a `contains` edge. -- after a document end event has been emitted only result sets, reference or implementation results emitted through that document can be referenced in edges. It is for example not allowed to reference ranges or result ranges from that document. This also includes adding monikers to ranges or result sets. The document data so to speak can not be altered anymore. -- if ranges point to result sets and monikers are emitted, they must be emitted on the result set and can't be emitted on individual ranges. - -## Additional Information - -### Tools - -- [`lsif-protocol`](https://github.com/Microsoft/lsif-node/tree/master/protocol): Protocol defined as TypeScript interfaces -- [`lsif-util`](https://github.com/jumattos/lsif-util): Utility tools for LSIF development -- [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc): LSIF indexer for TypeScript -- [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm): Linker for NPM monikers - -### Open Questions - -While implementing this for TypeScript and npm we collected a list of [open questions](https://github.com/Microsoft/lsif-typescript/labels/discussion) in form of GitHub issues we are already aware of. diff --git a/language-server-protocol/_specifications/lsif/0.5.0/img/definitionResult.png b/language-server-protocol/_specifications/lsif/0.5.0/img/definitionResult.png deleted file mode 100644 index 47c49414e57921d071b3a809f56c7057bcc5038a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59343 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 P4iFtpLyc0zP0arQ1YpX2 diff --git a/language-server-protocol/_specifications/lsif/0.5.0/img/foldingRange.png b/language-server-protocol/_specifications/lsif/0.5.0/img/foldingRange.png deleted file mode 100644 index a5ad00176be08ce938f254cb9b6f1418fb958848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11616 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 Mr9VqmNf-tF4~$Reu>b%7 diff --git a/language-server-protocol/_specifications/lsif/0.5.0/img/hoverResult.png b/language-server-protocol/_specifications/lsif/0.5.0/img/hoverResult.png deleted file mode 100644 index 33705d1007afe740b4a43db17ee7e3f336454206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13606 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 Are we missing an implementation? File a new issue on GitHub to add it here. - -## LSIF exporter skeleton - -As [detailed in the spec](specification.md#project-exports-and-external-imports), the LSIF exporter consists of two tools: the index exporter and the package linker. - -### Index exporter - -The index exporter generates an LSIF dump for a workspace by traversing through source files and storing LSP responses. For TypeScript/JavaScript, [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc) is the index exporter. - -### Package linker - -The package linker converts the LSIF output of the index exporter into a global friendly index. By using package metadata, export `moniker` vertices are linked to packages available on a registry. For instance, the `observable` export from the mobx dependency is linked to the mobx dependency available on NPM. The package metadata is used to create the `packageInformation` vertices that reference external packages. - -For TypeScript/JavaScript, [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm) is the package manager linker for NPM. - -## Testing and validation - -### LSIF validation utility - -The [`lsif-util`](https://github.com/microsoft/lsif-node/tree/master/util) tool can validate your generated LSIF output. Additionally, the tool can also be used to search the output and visualize via Graphviz. - -### VS Code LSIF extension - -With the [LSIF extension for VS Code](https://github.com/Microsoft/vscode-lsif-extension), you can dogfood an LSIF index to power navigation inside VS Code. - -## Performance - -Generating LSIF for a project is expected to take roughly the same time as compilation. - -A primitive LSIF index exporter loops over source files, and for every symbol encountered, queries the language server for responses to LSP requests. With this approach, computing references can become very expensive: references are computed multiple times for the same symbol spread over files. This can be inefficient, depending on the language server implementation. - -This approach can optimized by computing references only once for a symbol spread over files. The approach taken by the [lsif-tsc](https://github.com/Microsoft/lsif-node) tool is outlined below: - -- Parse the project configuration to get source files -- Loop over files, and run the following on the AST of each file - - When you encounter a symbol, find out the binding of the symbol (declaration) - - If the binding is local to the file, create a referencesResult data structure and add symbols with the same binding. When the parsing of the file is complete, we know that the referenceResult is complete and can be emitted. - - If the binding is not local, keep result set in memory, and keep parsing other files. - -## Recommended checklist - -We have seen the following patterns work well in existing implementations. - -### Method checklist - -For an ideal integration with Rich Code Navigation, the following methods are required. For some languages, methods such as `textDocument/declaration` might not be applicable. - -- [ ] `textDocument/hover` -- [ ] `textDocument/definition` -- [ ] `textDocument/references` -- [ ] `textDocument/implementation` -- [ ] `textDocument/declaration` -- [ ] `textDocument/typeDefinition` -- [ ] `textDocument/diagnostic` -- [ ] Cross-repo navigation for dependencies - -### Cross-platform - -If the LSIF exporter does not work across platforms (Windows, Linux, Mac), platform dependencies should be called out. - -### Output format - -The LSIF exporter is expected to implement the [line-delimited JSON](https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON) (also known as [JSON lines](http://jsonlines.org/)) output format: series of JSON objects (vertex or edge) separated by newline. Since JSON lines is suitable for streaming output and works better for larger repos, it is preferred over a JSON array output. - -If an LSIF consumer requires a valid JSON array as input (for example, the VS Code LSIF extension), the JSON lines output can be converted into a JSON array by piping into a conversion tool. - -``` -cat lsif.jsonl | sed '1s/^/[/;$!s/$/,/;$s/$/]/' -``` - -If the LSIF exporter needs to log additional output, it is recommended to use `stderr`, since `stdout` is reserved for JSON line output. - -### Project configuration - -The LSIF index exporter can expose a flag to specify the root of the project directory. For example, the [TypeScript implementation](https://github.com/Microsoft/lsif-node) exposes the `--project` (`-p`) to specify the root of the tsconfig.json file. - -``` -lsif-tsc --project ./frontend/tsconfig.json -``` - -### Error behavior - -The LSIF tool is expected to signal for error conditions, with a numeric exit code. A successful execution returns a 0, whereas error conditions (unable to build project, unable to find project file) return 1. - -### Required documentation - -Since LSIF is an evolving protocol, it is critical to document the [protocol version](specification.md#changelog) supported by the exporter. - -## Support - -Feel free to reach out to us for questions by raising an issue on GitHub. diff --git a/language-server-protocol/_specifications/lsif/0.5.0/specification.md b/language-server-protocol/_specifications/lsif/0.5.0/specification.md deleted file mode 100644 index 35297d70b..000000000 --- a/language-server-protocol/_specifications/lsif/0.5.0/specification.md +++ /dev/null @@ -1,1490 +0,0 @@ ---- -title: LSIF Specification -shortTitle: 0.5.0 (Previous) -layout: specifications -sectionid: lsif-0-5-0 -toc: lsif-0-5-0-toc -index: 2 -fullTitle: Language Server Index Format Specification - 0.5.0 -lspVersion: 3.17 ---- - -The 0.5.0 version of LSIF is currently under construction. - -## Language Server Index Format - -The purpose of the Language Server Index Format (LSIF) is it to define a standard format for language servers or other programming tools to dump their knowledge about a workspace. This dump can later be used to answer language server [LSP](https://microsoft.github.io/language-server-protocol/) requests for the same workspace without running the language server itself. Since much of the information would be invalidated by a change to the workspace, the dumped information typically excludes requests used when mutating a document. So, for example, the result of a code complete request is typically not part of such a dump. - -### Changelog - -#### Version 0.5.0 - -In version 0.4.0 support was added to dump larger systems project by project (in their reverse dependency order) and then combine the dumps again in a database by linking result sets using their corresponding monikers. Use of the format has shown that a couple of features are missing to make this work nicely: - -1. support to logical group projects. To support this a `Group` vertex got added. -1. knowing how unique a moniker is. To support this a `unique` property got added to the `Moniker`. -1. the `nextMoniker` edge got replaced by a more generic `attach` edge. This was possible since monikers now carry a `unique` property which was before encoded in the direction of the `nextMoniker` edge. -1. In programming languages supporting polymorphism calls at runtime can be bound to a different type then statically know. An example are overridden methods in object oriented programming languages. Since dumps can be created on a per project basis we need to add additional information to the dumps so that these polymorphic binds can be capture. The general concept of reference links got therefore introduced (see section [Multiple Project](#multiProjects)). In short it allows a tool to annotate an `item` edge with a property values `referenceLinks`. -1. To better shard the output into chunks the `items` edge carry an additional property `shard`. This property was named `document` in an early version of the 0.5 specification. - -An old 0.4.0 version of the specification is available [here](../../0.4.0/specification) - -#### Version 0.4.0 - -Up to version 0.4.0 the focus of the LSIF format was to ease the generation of the dump for language tool providers. However this made it very hard for consumers of the dump to efficiently import them into a DB unless the DB format one to one mapped to the LSIF format. This version of the specification tries to balance this by requiring tools providers to emit additional events of when certain data is ready to be consumed. It also adds support to partition data per document. - -Since 0.4.0 changes some of the LSIF aspects more deeply an old 0.3.x version of the specification is available [here](https://github.com/microsoft/language-server-protocol/blob/master/indexFormat/versions/specification-0-3-x.md) - -## Motivation - -Principal design goals: - -- The format should not imply the use of a certain persistence technology. -- The data defined should be modeled as closely as possible to the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) to make it possible to serve the data through the LSP without further transformation. -- The data stored is result data usually returned from a LSP request. The dump doesn't contain any program symbol information nor does the LSIF define any symbol semantics (e.g. where a symbol is defined or referenced or when a method overrides another method). The LSIF therefore doesn't define a symbol database. Please note that this is consistent with the LSP itself which doesn't define any symbol semantics either. -- The output format will be based on JSON as with the LSP. - -LSP requests that are good candidates to be supported in LSIF are: - -- [`textDocument/documentSymbol`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_documentSymbol) -- [`textDocument/foldingRange`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_foldingRange) -- [`textDocument/documentLink`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_documentLink) -- [`textDocument/definition`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_definition) -- [`textDocument/declaration`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_declaration) -- [`textDocument/typeDefinition`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_typeDefinition) -- [`textDocument/hover`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_hover) -- [`textDocument/references`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_references) -- [`textDocument/implementation`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification#textDocument_implementation) - -The corresponding LSP requests have one of the following two forms: - -```typescript -request(uri, method) -> result -request(uri, position, method) -> result -``` - -where method is the JSON-RPC request method. - -Concrete examples are - -```typescript -request( - 'file:///Users/dirkb/sample/test.ts', - 'textDocument/foldingRange' -) -> FoldingRange[]; -request( - 'file:///Users/dirkb/sample/test.ts', - { line: 10, character: 17 }, - 'textDocument/hover' -) -> Hover; -``` - -The input tuple to a request is either `[uri, method]` or `[uri, position, method]` and the output is some form of result. For the same `uri` and `[uri, position]` tuple, there are many different requests to execute. - -The dump format therefore should support the following features: - -- Input data must be easily queryable (e.g. the document and the position). -- Each element has a unique id (which may be a string or a number). -- It should be possible to emit data as soon as it is available to allow streaming rather than large memory requirements. For example, emitting data based on document syntax should be done for each file as parsing progresses. -- It should be easy to add additional requests later on. -- It should be easy for a tool to consume a dump and for example import it into a database without holding the dump in memory. - - -We came to the conclusion that the most flexible way to emit this is a graph, where edges represent the method and vertices are `[uri]`, `[uri, position]` or a request result. This data could then be stored as JSON or read into a database that can represent these vertices and relationships. - -Assume there is a file `/Users/dirkb/sample.ts` and we want to store the folding range information with it then the indexer emits two vertices: one representing the document with its URI `file:///Users/dirkb/sample.ts`, the other representing the folding result. In addition, an edge would be emitted representing the `textDocument/foldingRange` request. - -```typescript -{ id: 1, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 2, type: "vertex", label: "foldingRangeResult", - result: [ { ... }, { ... }, ... ] -} -{ id: 3, type: "edge", label: "textDocument/foldingRange", outV: 1, inV: 2 } -``` - -The corresponding graph looks like this - -Folding Range Result - -### Ranges - -For requests that take a position as its input, we need to store the position as well. Usually LSP requests return the same result for positions that point to the same word / name in a document. Take the following TypeScript example: - -```typescript -function bar() { -} -``` - -A hover request for a position denoting the `b` in `bar` will return the same result as a position denoting the `a` or `r`. To make the dump more compact, it will use ranges to capture this instead of single positions. The following vertices will be emitted in this case. Note that line, character are zero based as in the LSP: - -```typescript -{ id: 4, type: "vertex", label: "range", - start: { line: 0, character: 9}, end: { line: 0, character: 12 } -} -``` - -To bind the range to a document, we use a special edge labeled `contains` which points from a document to a set of ranges. - -```typescript -{ id: 5, type: "edge", label: "contains", outV: 1, inVs: [4] } -``` - -LSIF supports 1:n edges for the `contains` relationship which in a graph can easily be mapped to n 1:1 edges. LSIF support this for two reasons: (a) to make the output more compact since a document usually contains hundreds of those ranges and (b) to easy the import and batching for consumers of a LSIF dump. - -To bind the hover result to the range, we use the same pattern as we used for the folding ranges. We emit a vertex representing the hover result and an edge representing the `textDocument/hover` request. - -```typescript -{ - id: 6, - type: "vertex", - label: "hoverResult", - result: { - contents: [ - { language: "typescript", value: "function bar(): void" } - ] - } -} -{ id: 7, type: "edge", label: "textDocument/hover", outV: 4, inV: 6 } -``` - -The corresponding graph looks like this - -Hover Result - -The ranges emitted for a document in the contains relationship must follow these rules: - -1. a given range ID can only be contained in one document or in other words: ranges must not be shared between documents even if they have the same start / end value. -1. No two ranges can be equal. -1. No two ranges can overlap, claiming the same position in a document unless one range is entirely contained by the other. - -If a position in a document is mapped to a range and more than one range covers the position, the following algorithm should be used: - -1. sort the ranges by containment with innermost first -1. for range in ranges do - 1. check if the range has an outgoing edge `textDocument/${method}` - 1. if yes, use it -1. end -1. return `null` - -### Result Set - -Usually the hover result is the same whether you hover over a definition of a function or over a reference of that function. The same is actually true for many LSP requests like `textDocument/definition`, `textDocument/references` or `textDocument/typeDefinition`. In a naïve model, each range would have outgoing edges for all these LSP requests and would point to the corresponding results. To optimize this and to make the graph easier to understand, the concept of a `ResultSet` is introduced. A result set acts as a hub to be able to store information common to a lot of ranges. The `ResultSet` itself doesn't carry any information. So it looks like this: - -```typescript -export interface ResultSet { -} -``` - -The corresponding output of the above example with a hover using a result set looks like this: - -```typescript -{ id: 1, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 2, type: "vertex", label: "resultSet" } -{ id: 3, type: "vertex", label: "range", - start: { line: 0, character: 9}, end: { line: 0, character: 12 } -} -{ id: 4, type: "edge", label: "contains", outV: 1, inVs: [3] } -{ id: 5, type: "edge", label: "next", outV: 3, inV: 2 } -{ id: 6, type: "vertex", label: "hoverResult", - result: { - "contents":[ { - language: "typescript", value:"function bar(): void" - }] - } -} -{ id: 7, type: "edge", label: "textDocument/hover", outV: 2, inV: 6 } -``` - -Result Set - -Result sets are linked to ranges using a `next` edge. A results set can also forward information to another result set by linking to it using a `next` edge. - -The pattern of storing the result with the `ResultSet` will be used for other requests as well. The lookup algorithm is therefore as follows for a request [document, position, method]: - -1. find all ranges for [document, position]. If none exist, return `null` as the result -1. sort the ranges by containment the innermost first -1. for range in ranges do - 1. assign range to out - 1. while out !== `null` - 1. check if out has an outgoing edge `textDocument/${method}`. if yes, use it and return the corresponding result - 1. check if out has an outgoing `next` edge. If yes, set out to the target vertex. Else set out to `null` - 1. end -1. end -1. otherwise return `null` - -## Language Features - -### Request: `textDocument/definition` - -The same pattern of connecting a range, result set, or a document with a request edge to a method result is used for other requests as well. Let's next look at the `textDocument/definition` request using the following TypeScript sample: - -```typescript -function bar() { -} - -function foo() { - bar(); -} -``` - -This will emit the following vertices and edges to model the `textDocument/definition` request: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The result set -{ id: 6, type: "vertex", label: "resultSet" } - -// The bar declaration -{ id: 9, type: "vertex", label: "range", - start: { line: 0, character: 9 }, end: { line: 0, character: 12 } -} -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - - -// The bar reference -{ id: 20, type: "vertex", label: "range", - start: { line: 4, character: 2 }, end: { line: 4, character: 5 } -} -{ id: 21, type: "edge", label: "next", outV: 20, inV: 6} - -// The definition result linked to the bar result set -{ id: 22, type: "vertex", label: "definitionResult" } -{ id: 23, type: "edge", label: "textDocument/definition", outV: 6, inV: 22 } -{ id: 24, type: "edge", label: "item", outV: 22, inVs: [9], shard: 4 } -``` - -Definition Result - -The definition result above has only one value (the range with id '9') and we could have emitted it directly. However, we introduced the definition result vertex for two reasons: - -- To have consistency with all other requests that point to a result. -- To have support for languages where a definition can be spread over multiple ranges or even multiple documents. To support multiple documents ranges are added to a definition result using an 1:N `item` edge. Conceptually a definition result is an array to which the `item` edge adds items. - -Consider the following TypeScript example: - -```typescript -interface X { - foo(); -} -interface X { - bar(); -} -let x: X; -``` - -Running **Go to Definition** on `X` in `let x: X` will show a dialog which lets the user select between the two definitions of the `interface X`. The emitted JSON in this case looks like this: - -```typescript -{ id : 38, type: "vertex", label: "definitionResult" } -{ id : 40, type: "edge", label: "item", outV: 38, inVs: [9, 13], shard: 4 } -``` - -The `item` edge as an additional property shard which indicate the vertex that is the source (e.g. a document or a project) of these declarations. We added this information to still make it easy to emit the data but also make it easy to process and shard the data when storing into a database. Without that information we would either need to specific an order in which data needs to be emitted (e.g. a item edge and only refer to a range that got already added to a document using a `contains` edge) or we force processing tools to keep a lot of vertices and edges in memory. The approach of having this `shard` property looks like a fair balance. - -### Request: `textDocument/declaration` - -There are programming languages that have the concept of declarations and definitions (like C/C++). If this is the case, the dump can contain a corresponding `declarationResult` vertex and a `textDocument/declaration` edge to store the information. They are handled analogously to the entities emitted for the `textDocument/definition` request. - -### More about Request: `textDocument/hover` - -In the LSP, the hover is defined as follows: - -```typescript -export interface Hover { - /** - * The hover's content - */ - contents: MarkupContent | MarkedString | MarkedString[]; - - /** - * An optional range - */ - range?: Range; -} -``` - -where the optional range is the name range of the word hovered over. - -> **Side Note**: This is a pattern used for other LSP requests as well, where the result contains the word range of the word the position parameter pointed to. - -This makes the hover different for every location so we can't really store it with the result set. But wait, the range is the range of one of the `bar` references we already emitted and used to start to compute the result. To make the hover still reusable, we ask the index server to fill in the starting range if no range is defined in the result. So for a hover request executed on range `{ line: 4, character: 2 }, end: { line: 4, character: 5 }` the hover result will be: - -```typescript -{ id: 6, type: "vertex", label: "hoverResult", - result: { - contents: [ { language: "typescript", value: "function bar(): void" } ], - range: { line: 4, character: 2 }, end: { line: 4, character: 5 } - } -} -``` - -### Request: `textDocument/references` - -Storing references will be done in the same way as storing a hover or go to definition ranges. It uses a reference result vertex and `item` edges to add ranges to the result. - -Look at the following example: - -```typescript -function bar() { -} - -function foo() { - bar(); -} -``` - -The relevant JSON output looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The bar declaration -{ id: 6, type: "vertex", label: "resultSet" } -{ id: 9, type: "vertex", label: "range", - start: { line: 0, character: 9 }, end: { line: 0, character: 12 } -} -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - -// The bar reference range -{ id: 20, type: "vertex", label: "range", - start: { line: 4, character: 2 }, end: { line: 4, character: 5 } -} -{ id: 21, type: "edge", label: "next", outV: 20, inV: 6 } - -// The reference result -{ id : 25, type: "vertex", label: "referenceResult" } -// Link it to the result set -{ id : 26, type: "edge", label: "textDocument/references", outV: 6, inV: 25 } - -// Add the bar definition as a reference to the reference result -{ id: 27, type: "edge", label: "item", - outV: 25, inVs: [9], shard: 4, property: "definitions" -} - -// Add the bar reference as a reference to the reference result -{ id: 28, type: "edge", label: "item", - outV: 25, inVs: [20], shard: 4, property: "references" -} -``` - -References Result - -We tag the `item` edge with id 27 as a definition since the reference result distinguishes between definitions, declarations, and references. This is done since the `textDocument/references` request takes an additional input parameter `includeDeclarations` controlling whether declarations and definitions are included in the result as well. Having three distinct properties allows the server to compute the result accordingly. - -The item edge also support linking reference results to other reference results. This is useful when computing references to methods overridden in a type hierarchy. - -Take the following example: - -```typescript -interface I { - foo(): void; -} - -class A implements I { - foo(): void { - } -} - -class B implements I { - foo(): void { - } -} - -let i: I; -i.foo(); - -let b: B; -b.foo(); -``` - -The reference result for the method `foo` in TypeScript contains all three declarations and both references. While parsing the document, one reference result is created and then shared between all result sets. - -The output looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The declaration of I#foo -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 16, type: "vertex", label: "range", - start: { line: 1, character: 2 }, end: { line: 1, character: 5 } -} -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } -// The reference result for I#foo -{ id: 30, type: "vertex", label: "referenceResult" } -{ id: 31, type: "edge", label: "textDocument/references", outV: 13, inV: 30 } - -// The declaration of A#foo -{ id: 29, type: "vertex", label: "resultSet" } -{ id: 34, type: "vertex", label: "range", - start: { line: 5, character: 2 }, end: { line: 5, character: 5 } -} -{ id: 35, type: "edge", label: "next", outV: 34, inV: 29 } - -// The declaration of B#foo -{ id: 47, type: "vertex", label: "resultSet" } -{ id: 50, type: "vertex", label: "range", - start: { line: 10, character: 2 }, end: { line: 10, character: 5 } -} -{ id: 51, type: "edge", label: "next", outV: 50, inV: 47 } - -// The reference i.foo() -{ id: 65, type: "vertex", label: "range", - start: { line: 15, character: 2 }, end: { line: 15, character: 5 } -} - -// The reference b.foo() -{ id: 78, type: "vertex", label: "range", - start: { line: 18, character: 2 }, end: { line: 18, character: 5 } -} - -// The insertion of the ranges into the shared reference result -{ id: 90, type: "edge", label: "item", - outV: 30, inVs: [16,34,50], shard: 4, property: "definitions" -} -{ id: 91, type: "edge", label: "item", - outV: 30, inVs: [65,78], shard: 4, property: "references" -} - -// Linking A#foo to I#foo -{ id: 101, type: "vertex", label: "referenceResult" } -{ id: 102, type: "edge", label: "textDocument/references", outV: 29, inV: 101 } -{ id: 103, type: "edge", label: "item", - outV: 101, inVs: [30], shard: 4, property: "referenceResults" -} - -// Linking B#foo to I#foo -{ id: 114, type: "vertex", label: "referenceResult" } -{ id: 115, type: "edge", label: "textDocument/references", outV: 47, inV: 114 } -{ id: 116, type: "edge", label: "item", - outV: 114, inVs: [30], shard: 4, property: "referenceResults" -} -``` - -One goal of the language server index format is that the information can be emitted as soon as possible without caching too much information in memory. With languages that support overriding methods defined in more than one interface, this can be more complicated since the whole inheritance tree might only be known after parsing all documents. - -Take the following TypeScript example: - -```typescript -interface I { - foo(): void; -} - -interface II { - foo(): void; -} - -class B implements I, II { - foo(): void { - } -} - -let i: I; -i.foo(); - -let b: B; -b.foo(); -``` - -Searching for `I#foo()` finds 4 references, searching for `II#foo()` finds 3 reference, and searching on `B#foo()` finds 5 results. The interesting part here is when the declaration of `class B` gets processed which implements `I` and `II`, neither the reference result bound to `I#foo()` nor the one bound to `II#foo()` can be reused. So we need to create a new one. To still be able to profit from the results generated for `I#foo` and `II#foo`, the LSIF supports nested references results. This way the one referenced from `B#foo` will reuse the one from `I#foo` and `II#foo`. Depending on how these declarations are parsed, the two reference results might contain the same references. When a language server interprets reference results consisting of other reference results, the server is responsible to de-duplicate the final ranges. - -In the above example, there will be three reference results - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// Declaration of I#foo -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 16, type: "vertex", label: "range", - start: { line: 1, character: 2 }, end: { line: 1, character: 5 } -} -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } - -// Declaration of II#foo -{ id: 27, type: "vertex", label: "resultSet" } -{ id: 30, type: "vertex", label: "range", - start: { line: 5, character: 2 }, end: { line: 5, character: 5 } -} -{ id: 31, type: "edge", label: "next", outV: 30, inV: 27 } - -// Declaration of B#foo -{ id: 45, type: "vertex", label: "resultSet" } -{ id: 52, type: "vertex", label: "range", - start: { line: 9, character: 2 }, end: { line: 9, character: 5 } -} -{ id: 53, type: "edge", label: "next", outV: 52, inV: 45 } - -// Reference result for I#foo -{ id: 46, type: "vertex", label: "referenceResult" } -{ id: 47, type: "edge", label: "textDocument/references", outV: 13, inV: 46 } - -// Reference result for II#foo -{ id: 48, type: "vertex", label: "referenceResult" } -{ id: 49, type: "edge", label: "textDocument/references", outV: 27, inV: 48 } - -// Reference result for B#foo -{ id: 116 "typ" :"vertex", label: "referenceResult" } -{ id: 117 "typ" :"edge", label: "textDocument/references", outV: 45, inV: 116 } - -// Link B#foo reference result to I#foo and II#foo -{ id: 118 "typ" :"edge", label: "item", - outV: 116, inVs: [46,48], document: 4, property: "referenceResults" -} -``` - -For Typescript, method references are recorded at their most abstract declaration and if methods are merged (`B#foo`), they are combined using a reference result pointing to other results. - -### Request: `textDocument/implementation` - -Supporting a `textDocument/implementation` request is done reusing what we implemented for a `textDocument/references` request. In most cases, the `textDocument/implementation` returns the declaration values of the reference result that a symbol declaration points to. For cases where the result differs, the LSIF provides an `ImplementationResult`. To nest implementation results the `item` edge supports a `property` value `"implementationResults"`. - -The corresponding `ImplementationResult` looks like this: - -```typescript -interface ImplementationResult { - - label: `implementationResult` -} -``` - -### Request: `textDocument/typeDefinition` - -Supporting `textDocument/typeDefinition` is straightforward. The edge is either recorded at the range or at the `ResultSet`. - -The corresponding `TypeDefinitionResult` looks like this: - -```typescript -interface TypeDefinitionResult { - - label: `typeDefinitionResult` -} -``` - -For the following TypeScript example: - -```typescript -interface I { - foo(): void; -} - -let i: I; -``` - -The relevant emitted vertices and edges looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The declaration of I -{ id: 6, type: "vertex", label: "resultSet" } -{ id: 9, type: "vertex", label: "range", - start: { line: 0, character: 10 }, end: { line: 0, character: 11 } -} -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - -// The declaration of i -{ id: 26, type: "vertex", label: "resultSet" } -// The type definition result -{ id: 37, type: "vertex", label: "typeDefinitionResult" } -// Hook the result to the declaration -{ id: 38, type: "edge", label: "textDocument/typeDefinition", outV: 26, inV:37 } -// Add the declaration of I as a target range. -{ id: 51, type: "edge", label: "item", outV: 37, inVs: [9], shard: 4 } -``` - -As with other results ranges get added using a `item` edge. In this case without a `property` since there is only one kind of range. - -## Document requests - -The Language Server Protocol also supports requests for documents only (without any position information). These requests are `textDocument/foldingRange`, `textDocument/documentLink`, and `textDocument/documentSymbol`. We follow the same pattern as before to model these, the difference being that the result is linked to the document instead of to a range. - -### Request: `textDocument/foldingRange` - -For the folding range result this looks like this: - -```typescript -function hello() { - console.log('Hello'); -} - -function world() { - console.log('world'); -} - -function space() { - console.log(' '); -} -hello();space();world(); -``` - -```typescript -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 112, type: "vertex", label: "foldingRangeResult", result:[ - { startLine: 0, startCharacter: 16, endLine: 2, endCharacter: 1 }, - { startLine: 4, startCharacter: 16, endLine: 6, endCharacter: 1 }, - { startLine: 8, startCharacter: 16, endLine: 10, endCharacter: 1 } -]} -{ id: 113, type: "edge", label: "textDocument/foldingRange", outV: 2, inV: 112 } -``` - -The corresponding `FoldingRangeResult` is defined as follows: - -```typescript -export interface FoldingRangeResult { - label: 'foldingRangeResult'; - - result: lsp.FoldingRange[]; -} -``` - -### Request: `textDocument/documentLink` - -Again, for document links, we define a result type and a corresponding edge to link it to a document. Since the link location usually appear in comments, the ranges don't denote any symbol declarations or references. We therefore inline the range into the result like we do with folding ranges. - -```typescript -export interface DocumentLinkResult { - label: 'documentLinkResult'; - - result: lsp.DocumentLink[]; -} -``` - -### Request: `textDocument/documentSymbol` - -Next we look at the `textDocument/documentSymbol` request. This request usually returns an outline view of the document in hierarchical form. However, not all programming symbols declared or defined in a document are part of the result (for example, locals are usually omitted). In addition, an outline item needs to provide additional information like the full range and a symbol kind. There are two ways we can model this: either we do the same as we do for folding ranges and the document links and store the information in a document symbol result as literals, or we extend the range vertex with some additional information and refer to these ranges in the document symbol result. Since the additional information for ranges might be helpful in other scenarios as well, we support adding additional tags to these ranges by defining a `tag` property on the `range` vertex. - -The following tags are currently supported: - -```typescript -/** - * The range represents a declaration - */ -export interface DeclarationTag { - - /** - * A type identifier for the declaration tag. - */ - type: 'declaration'; - - /** - * The text covered by the range - */ - text: string; - - /** - * The kind of the declaration. - */ - kind: lsp.SymbolKind; - - /** - * The full range of the declaration not including leading/trailing whitespace - * but everything else, e.g comments and code. The range must be included in - * fullRange. - */ - fullRange: lsp.Range; - - /** - * Optional detail information for the declaration. - */ - detail?: string; -} - -/** - * The range represents a definition - */ -export interface DefinitionTag { - /** - * A type identifier for the declaration tag. - */ - type: 'definition'; - - /** - * The text covered by the range - */ - text: string; - - /** - * The symbol kind. - */ - kind: lsp.SymbolKind; - - /** - * The full range of the definition not including leading/trailing whitespace - * but everything else, e.g comments and code. The range must be included in - * fullRange. - */ - fullRange: lsp.Range; - - /** - * Optional detail information for the definition. - */ - detail?: string; -} - -/** - * The range represents a reference - */ -export interface ReferenceTag { - - /** - * A type identifier for the reference tag. - */ - type: 'reference'; - - /** - * The text covered by the range - */ - text: string; -} - -/** - * The type of the range is unknown. - */ -export interface UnknownTag { - - /** - * A type identifier for the unknown tag. - */ - type: 'unknown'; - - /** - * The text covered by the range - */ - text: string; -} -``` - -Emitting the tags for the following TypeScript example: - -```typescript -function hello() { -} - -hello(); -``` - -Will look like this: - -```typescript -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 4, type: "vertex", label: "resultSet" } -{ id: 7, type: "vertex", label: "range", - start: { line: 0, character: 9 }, end: { line: 0, character: 14 }, - tag: { - type: "definition", text: "hello", kind: 12, - fullRange: { - start: { line: 0, character: 0 }, end: { line: 1, character: 1 } - } - } -} -``` - -The document symbol result is then modeled as follows: - -```typescript -export interface RangeBasedDocumentSymbol { - - id: RangeId - - children?: RangeBasedDocumentSymbol[]; -} - -export interface DocumentSymbolResult extends V { - - label: 'documentSymbolResult'; - - result: lsp.DocumentSymbol[] | RangeBasedDocumentSymbol[]; -} -``` - -The given TypeScript example: - -```typescript -namespace Main { - function hello() { - } - function world() { - let i: number = 10; - } -} -``` - -Produces the following output: - -```typescript -// The document -{ id: 2 , type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -// The declaration of Main -{ id: 7 , type: "vertex", label: "range", - start: { line: 0, character: 10 }, end: { line: 0, character: 14 }, - tag: { - type: "definition", text: "Main", kind: 7, - fullRange: { - start: { line: 0, character: 0 }, end: { line: 5, character: 1 } - } - } -} -// The declaration of hello -{ id: 18 , type: "vertex", label: "range", - start: { line: 1, character: 11 }, end: { line: 1, character: 16 }, - tag: { - type: "definition", text: "hello", kind: 12, - fullRange: { - start: { line: 1, character: 2 }, end: { line: 2, character: 3 } - } - } -} -// The declaration of world -{ id: 29 , type: "vertex", label: "range", - start: { line: 3, character: 11 }, end: { line: 3, character: 16 }, - tag: { - type: "definition", text: "world", kind: 12, - fullRange: { - start: { line: 3, character: 2 }, end: { line: 4, character: 3 } - } - } -} -// The document symbol -{ id: 39 , type: "vertex", label: "documentSymbolResult", - result: [ { id: 7 , children: [ { id: 18 }, { id: 29 } ] } ] -} -{ id: 40 , type: "edge", label: "textDocument/documentSymbol", - outV: 2, inV: 39 -} -``` - -### Request: `textDocument/diagnostic` - -The only information missing that is useful in a dump are the diagnostics associated with documents. Diagnostics in the LSP are modeled as a push notifications sent from the server to the client. This doesn't work well with a dump modeled on request method names. However, the push notification can be emulated as a request where the request's result is the value sent during the push as a parameter. - -In the dump, we model diagnostics as follows: - -- We introduce a pseudo request `textDocument/diagnostic`. -- We introduce a diagnostic result which contains the diagnostics associated with a document. - -The result looks like this: - -```typescript -export interface DiagnosticResult { - - label: 'diagnosticResult'; - - result: lsp.Diagnostic[]; -} -``` - -The given TypeScript example: - -```typescript -function foo() { - let x: string = 10; -} -``` - -Produces the following output: - -```typescript -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 18, type: "vertex", label: "diagnosticResult", - result: [ - { - severity: 1, code: 2322, - message: "Type '10' is not assignable to type 'string'.", - range: { - start : { line: 1, character: 5 }, end: { line: 1, character: 6 } - } - } - ] -} -{ id: 19, type: "edge", label: "textDocument/diagnostic", outV: 2, inV: 18 } -``` - -Since diagnostics are not very common in dumps, no effort has been made to reuse ranges in diagnostics. - -### The Project vertex - -Usually language servers operate in some sort of project context. In TypeScript, a project is defined using a `tsconfig.json` file. C# and C++ have their own means. The project file usually contains information about compile options and other parameters. Having these in the dump can be valuable. The LSIF therefore defines a project vertex. In addition, all documents that belong to that project are connected to the project using a `contains` edge. If there was a `tsconfig.json` in the previous examples, the first emitted edges and vertices would look like this: - -```typescript -{ id: 1, type: "vertex", label: "project", - resource: "file:///Users/dirkb/tsconfig.json", kind: "typescript" -} -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 3, type: "edge", label: "contains", outV: 1, inVs: [2] } -``` - -The definition of the `project` vertex looks as follows: - -```ts -export interface Project extends V { - - /** - * The label property. - */ - label: VertexLabels.project; - - /** - * The project kind like 'typescript' or 'csharp'. See also the language ids - * in the specification. - * See https://microsoft.github.io/language-server-protocol/specification - */ - kind: string; - - /** - * The resource URI of the project file. - */ - resource?: Uri; - - /** - * Optional the content of the project file, `base64` encoded. - */ - contents?: string; -} -``` - -### Embedding contents - -It can be valuable to embed the contents of a document or project file into the dump as well. For example, if the content of the document is a virtual document generated from program meta data. The index format therefore supports an optional `contents` property on the `document` and `project` vertex. If used the content needs to be `base64` encoded. - -## Advanced Concepts - -### Events - -To ease the processing of an LSIF dump to for example import it into a database the dump emits begin and end events for documents and projects. After the end event of a document has been emitted the dump must not contain any further data referencing that document. For example no ranges from that document can be referenced in `item` edges. Nor can result sets or other vertices linked to the ranges in that document. The document can however be referenced in a `contains` edge adding the document to a project. The begin / end events for documents look like this: - -```ts -// The actual document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", - contents: "..." -} -// The begin event -{ id: 5, type: "vertex", label: "$event", - kind: "begin", scope: "document" , data: 4 -} -// The end event -{ id: 53, type: "vertex", label: "$event", - kind: "end", scope: "document" , data: 4 -} -``` - -Between the document vertex `4` and the document begin event `5` no information specific to document `4` can be emitted. Please note that more than one document can be open at a given point in time meaning that there have been n different document begin events without corresponding document end events. - -The events for projects looks similar: - -```ts -{ id: 2, type: "vertex", label: "project", kind: "typescript" } -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", - contents: "..." -} -{ id: 5, type: "vertex", label: "$event", - kind: "begin", scope: "document" , data: 4 -} -{ id: 3, type: "vertex", label: "$event", - kind: "begin", scope: "project", data: 2 -} -{ id: 53, type: "vertex", label: "$event", - kind: "end", scope: "document", data: 4 -} -{ id: 54, type: "edge", label: "contains", outV: 2, inVs: [4] } -{ id: 55, type: "vertex", label: "$event", - kind: "end", scope: "project", data: 2 -} -``` - -### Project exports and external imports (Monikers) - -> Changed in 0.5.0 - -One use case of the LSIF is to create dumps for released versions of a product, either a library or a program. If a project **P2** references a library **P1**, it would also be useful if the information in these two dumps could be related. To make this possible, the LSIF introduces optional monikers which can be linked to ranges using a corresponding edge. The monikers can be used to describe what a project exports and what it imports. Let's first look at the export case. - -Consider the following TypeScript file called `index.ts`: - -```typescript -export function func(): void { -} - -export class Emitter { - private doEmit() { - } - - public emit() { - this.doEmit(); - } -} -``` - -```typescript -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/index.ts", languageId: "typescript", - contents: "..." -} -{ id: 11, type: "vertex", label: "resultSet" } -{ id: 12, type: "vertex", label: "moniker", - kind: "export", scheme: "tsc", identifier: "lib/index:func", unique: "group" -} -{ id: 13, type: "edge", label: "moniker", outV: 11, inV: 12 } -{ id: 14, type: "vertex", label: "range", - start: { line: 0, character: 16 }, end: { line: 0, character: 20 } -} -{ id: 15, type: "edge", label: "next", outV: 14, inV: 11 } - -{ id: 18, type: "vertex", label: "resultSet" } -{ id: 19, type: "vertex", label: "moniker", - kind: "export", scheme: "tsc", identifier: "lib/index:Emitter", - unique: "group" -} -{ id: 20, type: "edge", label: "moniker", outV: 18, inV: 19 } -{ id: 21, type: "vertex", label: "range", - start: { line: 3, character: 13 }, end: { line: 3, character: 20 } -} -{ id: 22, type: "edge", label: "next", outV: 21, inV: 18 } - -{ id: 25, type: "vertex", label: "resultSet" } -{ id: 26, type: "vertex", label: "moniker", - kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.doEmit", - unique: "group" -} -{ id: 27, type: "edge", label: "moniker", outV: 25, inV: 26 } -{ id: 28, type: "vertex", label: "range", - start: { line: 4, character: 10 }, end: { line: 4, character: 16 } -} -{ id: 29, type: "edge", label: "next", outV: 28, inV: 25 } - -{ id: 32, type: "vertex", label: "resultSet" } -{ id: 33, type: "vertex", label: "moniker", - kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.emit", - unique: "group" -} -{ id: 34, type: "edge", label: "moniker", outV: 32, inV: 33 } -{ id: 35, type: "vertex", label: "range", - start: { line: 7, character: 9 }, end: { line: 7, character: 13 } -} -{ id: 36, type: "edge", label: "next", outV: 35, inV: 32 } -``` - -This describes the exported declaration inside `index.ts` with a moniker (e.g. a handle in string format) that is bound to the corresponding range declaration. The generated moniker must be position independent and stable so that it can be used to identify the symbol in other projects or documents. It should be sufficiently unique so as to avoid matching other monikers in other projects unless they actually refer to the same symbol. A moniker therefore has the following properties: - -- `scheme` to indicate how the `identifiers` is to be interpreted. -- `identifier` to actually identify the symbol. Its structure is opaque to the scheme owner. In the above example the monikers are created by the TypeScript compiler tsc and can only be compared to monikers also having the scheme `tsc`. -- `kind` to indicate whether the moniker is exported, imported or local to the project. -- `unique` to indicate how unique the moniker is. See the multi project section for more information on this. - -Please also note that the method `Emitter#doEmit` has an export moniker although the method is private. If private elements do have monikers depends on the programming language. Since TypeScript can't enforce visibility (it compiles to JS which doesn't have the concept) we treat them as visible. Even the TypeScript language server does so. Find all references does find all references to private methods even if it is flagged as a visibility violation. - -### Systems with multiple Projects - ->New in 0.5.0 - -Most software systems today consist out of multiple projects. Always creating LSIF dumps for all project of a system even if only one project changes is not very feasible, especially if only internals in a project changed. LSIF since 0.4.0 therefore allows to create an LSIF dump per project and link them to larger system in the DB again. However 0.4.0 was lacking some concepts to make this real. To motivate them consider the following example - -**Project P1** - -Project P1 consist of one `p1Main.ts` file with the following content: - -```typescript -export interface Disposable { - dispose(): void; -} - -let d: Disposable; -d.dispose(); -``` - -**Project P2** - -Project P2 depends on P1 and consists of one `p2Main.ts` file with the following content: - -```typescript -import { Disposable } from 'p1'; - -class Widget implements Disposable { - public dispose(): void { - } -} - -let w: Widget; -w.dispose(); -``` - -Now if a user search for reference to `Widget#dispose` it is expected that the reference `d.dispose` in P1 is included in the result. However when P1 is process the tools doesn't know about P2. And when P2 is processed it usually doesn't know about the source of P1. It only knows about its API shape (e.g. in TypeScript the corresponding `d.ts` file). - -To make this work we first need to group projects into larger units so that we know in which projects `d.dispose` is actually a match. Assume there is a totally unrelated project PX which also uses `Disposable` from P1 but P2 is never linked into one system with PX. So a object of type `Widget` can never flow to code in PX hence reference in PX should not be listed. We therefore introduce the notation of a group to logically group projects into larger systems. Projects belong to a group and groups are identified using a URI. Lets look at the concrete dumps for P1 and P2: - -```typescript -{id: 2, type: "vertex", label: "group", - uri: "https://github.com/microsoft/lsif-node.git/samples/ts-cascade", - conflictResolution: "takeDB", name: "ts-cascade", - rootUri: "file:///Users/dirkb/samples/ts-cascade" -} -{id: 4, type: "vertex", label: "project", kind: "typescript", name: "p1" } -{id: 5, type: "edge", label: "belongsTo", outV: 4, inV:2 } -``` - -As a group URI the path in a GitHub repository is used. However the URI could also be something like `lsif-group:://com.microsoft/vscode/lsif-node/samples/ts-cascade` if the URI should be repository independent. This would be useful if a company store code in many different repository systems. The edge with the id `5` binds the project to the group. - -The dump for project P2 looks like this: - -```typescript -{id: 2, type: "vertex", label: "group", - uri: "https://github.com/Microsoft/lsif-node.git/samples/ts-cascade", - conflictResolution: "takeDB", name: "ts-cascade", - rootUri: "file:///Users/dirkb/samples/ts-cascade" -} -{id: 4, type: "vertex", label: "project", kind: "typescript", name: "p2" } -{id: 5, type: "edge", label: "belongsTo", outV: 4, inV: 2 } -``` - -Note that this binds P2 to the same group P1 belongs to. To avoid any kind of group management the group carries a property `conflictResolution` to tell a DB which group information to use if the DB already contains a group with the given URL. `takeDB` indicates to take the one already store in the DB and `takeDump` indicates that the one from the dump should overwrite the DB value. - -Whenever possible group URIs should be organized hierarchical to allow to group projects into a broader scope. For example a URI `https://github.com/microsoft` should capture all project organized under the GitHub Microsoft organization. - - -Now lets look how we ensure that searching for references for `Widget#dispose` find the `d.dispose()` match in P1 as well. First lets look what kind of information will be in the dump of P1 for `Disposable#dispose`: - -```typescript -// The result set for the Disposable#dispose symbol -{ id: 21, type: "vertex", label: "resultSet" } -// The export moniker of Disposable#dispose in P1 (note kind export). -{ id: 22, type: "vertex", label: "moniker", - scheme: "tsc", identifier: "p1/lib/p1Main:Disposable.dispose", - unique: "group", kind:"export" -} -{ id: 23, type: "edge", label: "moniker", outV: 21, inV: 22 } -// The actual definition of the symbol -{ id: 24, type: "vertex", label: "range", - start: { line: 1, character: 1 }, end: { line: 1, character: 8 }, - tag: { - type: definition, text: "dispose", kind: 7, - fullRange: { - start : { line: 1, character:1 }, end: { line: 1, character: 17 } - } - } -} -// Bind the reference result to the result set -{ id: 57, type: "vertex", label: "referenceResult" } -{ id: 58, type: "edge", label: "textDocument/references", outV: 21, inV: 57 } -``` - -Interesting here is line 22 which defines the moniker for `Disposable#dispose`. It has new a property `unique` telling that the moniker is unique inside a `group` of projects but not necessarily outside. Other possible values for `unique` are: - -- `document` to indicate that the moniker is only unique inside a document. Used for example for locals or private members. -- `project` to indicate that the moniker is only unique inside a project. Used for example for project internal symbols. -- `group` to indicate that the moniker is unique inside a group of projects. Used for example for exported members. -- `scheme` to indicate that the moniker is unique inside the moniker's scheme. For example if the moniker is generated for a specific package manager (see npm example below) then these monikers are usually unique inside the moniker's theme (e.g. all moniker generated for npm carry the `npm` scheme and are unique) -- `global` to indicate that the moniker is globally unique (e.g. its identifer is unique independent of the scheme or kind) - -When generating the dump for P2 the information for `Widget#dispose` will look like this: - -```typescript -// The import moniker for importing Disposable#dispose into P2 -{ id: 22, type: "vertex", label: "moniker", - scheme: "tsc", identifier: "p1/lib/p1Main:Disposable.dispose", - unique: "group", kind: "import" -} - -// The result set for Widget#dispose -{ id: 78, type: "vertex", label: "resultSet" } -// The moniker for Widget#dispose. Note that the moniker is local since the -// Widget class is not exported -{ id: 79, type: "vertex", label: "moniker", - scheme: "tsc", identifier: "2Q46RTVRZTuVW1ajf68/Vw==", - unique: "document", kind: "local" -} -{ id: 80, type: "edge", label: "moniker", outV: 78, inV: 79 } -// The actual definition of the symbol -{ id: 81, type: "vertex", label: "range", - start: { line: 3, character: 8 }, end: { line: 3, character: 15 }, - tag: { - type: "definition", text: "dispose", kind: 6, - fullRange: { - start: { line: 3, character: 1 }, end: { line: 4, character: 2 } - } - } -} -// Bind the reference result to Widget#dispose -{ id: 116, type: "vertex", label: "referenceResult" } -{ id: 117, type: "edge", label: "textDocument/references", outV: 78, inV: 116} -{ id: 118, type: "edge", label: "item", - outV: 116, inVs: [43], shard: 52, property: "referenceResults" -} -// Link the reference result set of Disposable#dispose to this result set -// using a moniker -{ id: 119, type: "edge", label: "item", - outV: 116, inVs: [22], shard: 52, property: "referenceLinks" -} -{ id: 120, type: "edge", label: "item", - outV: 43, inVs: [81], shard: 52, property: "definitions" -} -{ id: 121, type: "edge", label: "item", - outV: 43, inVs: [96], shard: 52, property: "references" -} -``` - -The noteworthy parts are: - -- the vertex with `id: 22`: is the import moniker for `Disposable#dispose` from P1. -- the edge with `id: 119`: this adds a reference link to the reference result of `Widget#dispose`. Item edges with a `referenceLinks` are conceptual like item edges with a `referenceResults` property. They allow for composite reference results. The different is that a `referenceResults` item edge references another result using the vertex id since the reference result is part of the same dump. A `referenceLinks` item edge references another result using a moniker. So the actual resolving needs to happen in a database which has the data for both P1 and P2. As with `referenceResults` item edges a language servers is responsible to de-duplicate the final ranges. - -### Package Managers - -> Changed in 0.5.0 - -How exported elements are visible in other projects in most programming languages depends on how files are packaged into a library or program. In TypeScript, the standard package manager is npm. - -Consider that the following `package.json` file exists: - -```json -{ - "name": "lsif-ts-sample", - "version": "1.0.0", - "description": "", - "main": "lib/index.js", - "author": "MS", - "license": "MIT", -} -``` - -for the following TypeScript file (same as above): - -```typescript -export function func(): void { -} - -export class Emitter { - private doEmit() { - } - - public emit() { - this.doEmit(); - } -} -``` - -then these monikers can be translated into monikers that are `npm` dependent. Instead of replacing the monikers we emit a second set of monikers and link the `tsc` monikers to corresponding `npm` monikers using an `attach`edge: - -```typescript -{ id: 991, type: "vertex", label: "packageInformation", - name: "lsif-ts-sample", manager: "npm", version: "1.0.0" -} - -{ id: 987, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", identifier: "lsif-ts-sample::func", - unique: "scheme" -} -{ id: 986, type: "edge", label: "packageInformation", outV: 987, inV: 991 } -{ id: 985, type: "edge", label: "attach", outV: 987, inV: 12 } - -{ id: 984, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter", - unique: "scheme" -} -{ id: 983, type: "edge", label: "packageInformation", outV: 984, inV: 991 } -{ id: 982, type: "edge", label: "attach", outV: 984, inV: 19 } - -{ id: 981, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", - identifier: "lsif-ts-sample::Emitter.doEmit", unique: "scheme" -} -{ id: 980, type: "edge", label: "packageInformation", outV: 981, inV: 991 } -{ id: 979, type: "edge", label: "attach", outV: 981, inV: 26 } - -{ id: 978, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", - identifier: "lsif-ts-sample::Emitter.emit", unique: "scheme" -} -{ id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } -{ id: 976, type: "edge", label: "attach", outV: 978, inV: 33 } -``` -Things to observe: - -- a special `packageInformation` vertex got emitted to point to the corresponding npm package information. -- the npm moniker refer to the package name. -- its `unique` value is `scheme` denoting that the monikers identifier is unique across all `npm` monikers. -- since the file `index.ts` is the npm main file the moniker identifier as no file path. The is comparable to importing this module into TypeScript or JavaScript were only the module name and no file path is used (e.g. `import * as lsif from 'lsif-ts-sample'`). -- the `attach` edge points from the npm moniker vertex to the tsc moniker vertex. - -For LSIF we recommend that a second tool is used to make the monikers emitted by the indexer be package manager dependent. This supports the use of different package managers and allows incorporating custom build tools. In the TypeScript implementation, this is done by a npm specific tool which attaches the monikers taking the npm package information into account. - -Reporting importing external symbols is done using the same approach. The LSIF emits monikers of kind `import`. Consider the following typescript example: - -```typescript -import * as mobx from 'mobx'; - -let map: mobx.ObservableMap = new mobx.ObservableMap(); -``` - -where `mobx` is the [npm mobx package](https://www.npmjs.com/package/mobx). Running the tsc index tools produces: - -```typescript -{ id: 41, type: "vertex", label: "document", - uri: "file:///samples/node_modules/mobx/lib/types/observablemap.d.ts", - languageId: "typescript", contents: "..." -} -{ id: 55, type: "vertex", label: "resultSet" } -{ id: 57, type: "vertex", label: "moniker", - kind: "import", scheme: "tsc", - identifier: "node_modules/mobx/lib/mobx:ObservableMap", unique: 'group' -} -{ id: 58, type: "edge", label: "moniker", outV: 55, inV: 57 } -{ id: 59, type: "vertex", label: "range", - start: { line: 17, character: 538 }, end: { line: 17, character: 551 } -} -{ id: 60, type: "edge", label: "next", outV: 59, inV: 55 } -``` - -Three things to note here: First, TypeScript uses declarations files for externally imported symbols. That has the nice effect that the moniker information can be attached to the declaration ranges in these files. In other languages, the information might be attached to the file actually referencing the symbol. Or a virtual document for the referenced item is generated. Second, the tool only generates this information for symbols actually referenced, not for all available symbols. Third these monikers are `tsc` specific and point to the `node_modules` folder. - -However piping this information through the npm tool will generate the following information: - -```typescript -{ id: 991, type: "vertex", label: "packageInformation", - name: "mobx", manager: "npm", version: "5.6.0", - repository: { type: "git", url: "git+https://github.com/mobxjs/mobx.git" } -} -{ id: 978, type: "vertex", label: "moniker", - kind: "import", scheme: "npm", identifier: "mobx::ObservableMap", - unique: 'scheme' -} -{ id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } -{ id: 976, type: "edge", label: "attach", outV: 978, inV: 57 } -``` - -which made the moniker specific to the npm `mobx` package. In addition information about the `mobx` package itself got emitted. - -Usually monikers are attached to result sets since they are the same for all ranges pointing to the result set. However for dumps that don't use result sets, monikers can also be emitted on ranges. - -For tools processing the dump and importing it into a database it is sometime useful to know whether a result is local to a file or not (for example function arguments can only be navigated inside the file). To help postprocessing tools to efficiently decide this, LSIF generation tools should generate a moniker for locals as well. The corresponding kind to use is `local`. The identifier should still be unique inside the document. - -For the following example - -```ts -function foo(x: number): void { -} -``` - -The moniker for `x` looks like this: - -```ts -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 14, type: "vertex", label: "moniker", - kind: "local", scheme: "tsc", identifier: "SfeOP6s53Y2HAkcViolxYA==", - unique: 'document' -} -{ id: 15, type: "edge", label: "moniker", outV: 13, inV: 14 } -{ id: 16, type: "vertex", label: "range", - start: { line: 0, character: 13 }, end: { line: 0, character: 14 }, - tag: { - type: "definition", text: "x", kind: 7, - fullRange: { - start: { line: 0, character: 13 }, end: { line: 0, character: 22 } - } - } -} -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } -``` - -In addition to this moniker schemes starting with `$` are reserved and shouldn't be used by a LSIF tool. - -### Result ranges - -Ranges in LSIF have currently two meanings: - -1. they act as LSP request sensitive areas in a document (e.g. we use them to decide if for a given position a corresponding LSP request result exists) -1. they act as navigation targets (e.g. they are the result of a Go To declaration navigation). - -To fulfil the first LSIF specifies that ranges can't overlap or be the same. However this constraint is not necessary for the second meaning. To support equal or overlapping target ranges we introduce a vertex `resultRange`. It is not allowed to use a `resultRange` as a target in a `contains` edge. - -### Meta Data Vertex - -> Changed in 0.5.0 - -To support versioning the LSIF defines a meta data vertex as follows: - -```typescript -export interface MetaData { - - /** - * The label property. - */ - label: 'metaData'; - - /** - * The version of the LSIF format using semver notation. See - * https://semver.org/. Please note the version numbers starting with 0 - * don't adhere to semver and adopters have to assume the each new version - * is breaking. - */ - version: string; - - /** - * The string encoding used to compute line and character values in - * positions and ranges. Currently only 'utf-16' is support due to the - * limitations in LSP. - */ - positionEncoding: 'utf-16', - - /** - * Information about the tool that created the dump - */ - toolInfo?: { - name: string; - version?: string; - args?: string[]; - } -} -``` - -### Emitting constraints - -The following emitting constraints (some of which have already been mentioned in the document) exist: - -- a vertex needs to be emitted before it can be referenced in an edge. -- a `range` and `resultRange` can only be contained in one document. -- a `resultRange` can not be used as a target in a `contains` edge. -- after a document end event has been emitted only result sets, reference or implementation results emitted through that document can be referenced in edges. It is for example not allowed to reference ranges or result ranges from that document. This also includes adding monikers to ranges or result sets. The document data so to speak can not be altered anymore. -- if ranges point to result sets and monikers are emitted, they must be emitted on the result set and can't be emitted on individual ranges. - -## Additional Information - -### Tools - -- [`lsif-protocol`](https://github.com/Microsoft/lsif-node/tree/master/protocol): Protocol defined as TypeScript interfaces -- [`lsif-util`](https://github.com/jumattos/lsif-util): Utility tools for LSIF development -- [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc): LSIF indexer for TypeScript -- [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm): Linker for NPM monikers - -### Open Questions - -While implementing this for TypeScript and npm we collected a list of [open questions](https://github.com/Microsoft/lsif-typescript/labels/discussion) in form of GitHub issues we are already aware of. diff --git a/language-server-protocol/_specifications/lsif/0.6.0/img/definitionResult.png b/language-server-protocol/_specifications/lsif/0.6.0/img/definitionResult.png deleted file mode 100644 index 47c49414e57921d071b3a809f56c7057bcc5038a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59343 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 P4iFtpLyc0zP0arQ1YpX2 diff --git a/language-server-protocol/_specifications/lsif/0.6.0/img/foldingRange.png b/language-server-protocol/_specifications/lsif/0.6.0/img/foldingRange.png deleted file mode 100644 index a5ad00176be08ce938f254cb9b6f1418fb958848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11616 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 Mr9VqmNf-tF4~$Reu>b%7 diff --git a/language-server-protocol/_specifications/lsif/0.6.0/img/hoverResult.png b/language-server-protocol/_specifications/lsif/0.6.0/img/hoverResult.png deleted file mode 100644 index 33705d1007afe740b4a43db17ee7e3f336454206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13606 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 Are we missing an implementation? File a new issue on GitHub to add it here. - -## LSIF exporter skeleton - -As [detailed in the spec](specification.md#project-exports-and-external-imports), the LSIF exporter consists of two tools: the index exporter and the package linker. - -### Index exporter - -The index exporter generates an LSIF dump for a workspace by traversing through source files and storing LSP responses. For TypeScript/JavaScript, [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc) is the index exporter. - -### Package linker - -The package linker converts the LSIF output of the index exporter into a global friendly index. By using package metadata, export `moniker` vertices are linked to packages available on a registry. For instance, the `observable` export from the mobx dependency is linked to the mobx dependency available on NPM. The package metadata is used to create the `packageInformation` vertices that reference external packages. - -For TypeScript/JavaScript, [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm) is the package manager linker for NPM. - -## Testing and validation - -### LSIF validation utility - -The [`lsif-util`](https://github.com/microsoft/lsif-node/tree/master/util) tool can validate your generated LSIF output. Additionally, the tool can also be used to search the output and visualize via Graphviz. - -### VS Code LSIF extension - -With the [LSIF extension for VS Code](https://github.com/Microsoft/vscode-lsif-extension), you can dogfood an LSIF index to power navigation inside VS Code. - -## Performance - -Generating LSIF for a project is expected to take roughly the same time as compilation. - -A primitive LSIF index exporter loops over source files, and for every symbol encountered, queries the language server for responses to LSP requests. With this approach, computing references can become very expensive: references are computed multiple times for the same symbol spread over files. This can be inefficient, depending on the language server implementation. - -This approach can optimized by computing references only once for a symbol spread over files. The approach taken by the [lsif-tsc](https://github.com/Microsoft/lsif-node) tool is outlined below: - -- Parse the project configuration to get source files -- Loop over files, and run the following on the AST of each file - - When you encounter a symbol, find out the binding of the symbol (declaration) - - If the binding is local to the file, create a referencesResult data structure and add symbols with the same binding. When the parsing of the file is complete, we know that the referenceResult is complete and can be emitted. - - If the binding is not local, keep result set in memory, and keep parsing other files. - -## Recommended checklist - -We have seen the following patterns work well in existing implementations. - -### Method checklist - -For an ideal integration with Rich Code Navigation, the following methods are required. For some languages, methods such as `textDocument/declaration` might not be applicable. - -- [ ] `textDocument/hover` -- [ ] `textDocument/definition` -- [ ] `textDocument/references` -- [ ] `textDocument/implementation` -- [ ] `textDocument/declaration` -- [ ] `textDocument/typeDefinition` -- [ ] `textDocument/diagnostic` -- [ ] Cross-repo navigation for dependencies - -### Cross-platform - -If the LSIF exporter does not work across platforms (Windows, Linux, Mac), platform dependencies should be called out. - -### Output format - -The LSIF exporter is expected to implement the [line-delimited JSON](https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON) (also known as [JSON lines](http://jsonlines.org/)) output format: series of JSON objects (vertex or edge) separated by newline. Since JSON lines is suitable for streaming output and works better for larger repos, it is preferred over a JSON array output. - -If an LSIF consumer requires a valid JSON array as input (for example, the VS Code LSIF extension), the JSON lines output can be converted into a JSON array by piping into a conversion tool. - -``` -cat lsif.jsonl | sed '1s/^/[/;$!s/$/,/;$s/$/]/' -``` - -If the LSIF exporter needs to log additional output, it is recommended to use `stderr`, since `stdout` is reserved for JSON line output. - -### Project configuration - -The LSIF index exporter can expose a flag to specify the root of the project directory. For example, the [TypeScript implementation](https://github.com/Microsoft/lsif-node) exposes the `--project` (`-p`) to specify the root of the tsconfig.json file. - -``` -lsif-tsc --project ./frontend/tsconfig.json -``` - -### Error behavior - -The LSIF tool is expected to signal for error conditions, with a numeric exit code. A successful execution returns a 0, whereas error conditions (unable to build project, unable to find project file) return 1. - -### Required documentation - -Since LSIF is an evolving protocol, it is critical to document the [protocol version](specification.md#changelog) supported by the exporter. - -## Support - -Feel free to reach out to us for questions by raising an issue on GitHub. diff --git a/language-server-protocol/_specifications/lsif/0.6.0/specification.md b/language-server-protocol/_specifications/lsif/0.6.0/specification.md deleted file mode 100644 index 50bfadddb..000000000 --- a/language-server-protocol/_specifications/lsif/0.6.0/specification.md +++ /dev/null @@ -1,1497 +0,0 @@ ---- -title: LSIF Specification -shortTitle: 0.6.0 (Current) -layout: specifications -sectionid: lsif-0-6-0 -toc: lsif-0-6-0-toc -index: 2 -fullTitle: Language Server Index Format Specification - 0.6.0 -lspVersion: 3.17 ---- - -The 0.6.0 version of LSIF is currently under construction. - -## Language Server Index Format - -The purpose of the Language Server Index Format (LSIF) is it to define a standard format for language servers or other programming tools to dump their knowledge about a workspace. This dump can later be used to answer language server [LSP](https://microsoft.github.io/language-server-protocol/) requests for the same workspace without running the language server itself. Since much of the information would be invalidated by a change to the workspace, the dumped information typically excludes requests used when mutating a document. So, for example, the result of a code complete request is typically not part of such a dump. - -### Changelog - -#### Version 0.6.0 - -Feedback from store implementors showed that the concept of grouping projects into larger storage units is nothing that should be defined in LSIF itself. It should be left to the storage backend. Due to this the `Group` vertex introduced in 0.5.0 got removed again. Since some information captured in the `Group` vertex is useful in general a `Source` vertex got introduce to store this information. - -#### Version 0.5.0 - -In version 0.4.0 support was added to dump larger systems project by project (in their reverse dependency order) and then combine the dumps again in a database by linking result sets using their corresponding monikers. Use of the format has shown that a couple of features are missing to make this work nicely: - -1. support to logical group projects. To support this a `Group` vertex got added. -1. knowing how unique a moniker is. To support this a `unique` property got added to the `Moniker`. -1. the `nextMoniker` edge got replaced by a more generic `attach` edge. This was possible since monikers now carry a `unique` property which was before encoded in the direction of the `nextMoniker` edge. -1. In programming languages supporting polymorphism calls at runtime can be bound to a different type then statically know. An example are overridden methods in object oriented programming languages. Since dumps can be created on a per project basis we need to add additional information to the dumps so that these polymorphic binds can be capture. The general concept of reference links got therefore introduced (see section [Multiple Project](#multiProjects)). In short it allows a tool to annotate an `item` edge with a property values `referenceLinks`. -1. To better shard the output into chunks the `items` edge carry an additional property `shard`. This property was named `document` in an early version of the 0.5 specification. - -An old 0.4.0 version of the specification is available [here](../../0.4.0/specification) - -#### Version 0.4.0 - -Up to version 0.4.0 the focus of the LSIF format was to ease the generation of the dump for language tool providers. However this made it very hard for consumers of the dump to efficiently import them into a DB unless the DB format one to one mapped to the LSIF format. This version of the specification tries to balance this by requiring tools providers to emit additional events of when certain data is ready to be consumed. It also adds support to partition data per document. - -Since 0.4.0 changes some of the LSIF aspects more deeply an old 0.3.x version of the specification is available [here](https://github.com/microsoft/language-server-protocol/blob/master/indexFormat/versions/specification-0-3-x.md) - -## Motivation - -Principal design goals: - -- The format should not imply the use of a certain persistence technology. -- The data defined should be modeled as closely as possible to the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) to make it possible to serve the data through the LSP without further transformation. -- The data stored is result data usually returned from a LSP request. The dump doesn't contain any program symbol information nor does the LSIF define any symbol semantics (e.g. where a symbol is defined or referenced or when a method overrides another method). The LSIF therefore doesn't define a symbol database. Please note that this is consistent with the LSP itself which doesn't define any symbol semantics either. -- The output format will be based on JSON as with the LSP. - -LSP requests that are good candidates to be supported in LSIF are: - -- `textDocument/documentSymbol` -- `textDocument/foldingRange` -- `textDocument/documentLink` -- `textDocument/definition` -- `textDocument/declaration` -- `textDocument/typeDefinition` -- `textDocument/hover` -- `textDocument/references` -- `textDocument/implementation` - -The corresponding LSP requests have one of the following two forms: - -```typescript -request(uri, method) -> result -request(uri, position, method) -> result -``` - -where method is the JSON-RPC request method. - -Concrete examples are - -```typescript -request( - 'file:///Users/dirkb/sample/test.ts', - 'textDocument/foldingRange' -) -> FoldingRange[]; -request( - 'file:///Users/dirkb/sample/test.ts', - { line: 10, character: 17 }, - 'textDocument/hover' -) -> Hover; -``` - -The input tuple to a request is either `[uri, method]` or `[uri, position, method]` and the output is some form of result. For the same `uri` and `[uri, position]` tuple, there are many different requests to execute. - -The dump format therefore should support the following features: - -- Input data must be easily queryable (e.g. the document and the position). -- Each element has a unique id (which may be a string or a number). -- It should be possible to emit data as soon as it is available to allow streaming rather than large memory requirements. For example, emitting data based on document syntax should be done for each file as parsing progresses. -- It should be easy to add additional requests later on. -- It should be easy for a tool to consume a dump and, for example, import it into a database without holding the dump in memory. - - -We came to the conclusion that the most flexible way to emit this is a graph, where edges represent the method and vertices are `[uri]`, `[uri, position]` or a request result. This data could then be stored as JSON or read into a database that can represent these vertices and relationships. - -Assume there is a file `/Users/dirkb/sample.ts` and we want to store the folding range information with it then the indexer emits two vertices: one representing the document with its URI `file:///Users/dirkb/sample.ts`, the other representing the folding result. In addition, an edge would be emitted representing the `textDocument/foldingRange` request. - -```typescript -{ id: 1, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 2, type: "vertex", label: "foldingRangeResult", - result: [ { ... }, { ... }, ... ] -} -{ id: 3, type: "edge", label: "textDocument/foldingRange", outV: 1, inV: 2 } -``` - -The corresponding graph looks like this - -Folding Range Result - -### Ranges - -For requests that take a position as its input, we need to store the position as well. Usually LSP requests return the same result for positions that point to the same word / name in a document. Take the following TypeScript example: - -```typescript -function bar() { -} -``` - -A hover request for a position denoting the `b` in `bar` will return the same result as a position denoting the `a` or `r`. To make the dump more compact, it will use ranges to capture this instead of single positions. The following vertices will be emitted in this case. Note that line, character are zero based as in the LSP: - -```typescript -{ id: 4, type: "vertex", label: "range", - start: { line: 0, character: 9}, end: { line: 0, character: 12 } -} -``` - -To bind the range to a document, we use a special edge labeled `contains` which points from a document to a set of ranges. - -```typescript -{ id: 5, type: "edge", label: "contains", outV: 1, inVs: [4] } -``` - -LSIF supports 1:n edges for the `contains` relationship which in a graph can easily be mapped to n 1:1 edges. LSIF support this for two reasons: (a) to make the output more compact since a document usually contains hundreds of those ranges and (b) to easy the import and batching for consumers of a LSIF dump. - -To bind the hover result to the range, we use the same pattern as we used for the folding ranges. We emit a vertex representing the hover result and an edge representing the `textDocument/hover` request. - -```typescript -{ - id: 6, - type: "vertex", - label: "hoverResult", - result: { - contents: [ - { language: "typescript", value: "function bar(): void" } - ] - } -} -{ id: 7, type: "edge", label: "textDocument/hover", outV: 4, inV: 6 } -``` - -The corresponding graph looks like this - -Hover Result - -The ranges emitted for a document in the contains relationship must follow these rules: - -1. a given range ID can only be contained in one document or in other words: ranges must not be shared between documents even if they have the same start / end value. -1. No two ranges can be equal. -1. No two ranges can overlap, claiming the same position in a document unless one range is entirely contained by the other. - -If a position in a document is mapped to a range and more than one range covers the position, the following algorithm should be used: - -1. sort the ranges by containment with innermost first -1. for range in ranges do - 1. check if the range has an outgoing edge `textDocument/${method}` - 1. if yes, use it -1. end -1. return `null` - -### Result Set - -Usually the hover result is the same whether you hover over a definition of a function or over a reference of that function. The same is actually true for many LSP requests like `textDocument/definition`, `textDocument/references` or `textDocument/typeDefinition`. In a naïve model, each range would have outgoing edges for all these LSP requests and would point to the corresponding results. To optimize this and to make the graph easier to understand, the concept of a `ResultSet` is introduced. A result set acts as a hub to be able to store information common to a lot of ranges. The `ResultSet` itself doesn't carry any information. So it looks like this: - -```typescript -export interface ResultSet { -} -``` - -The corresponding output of the above example with a hover using a result set looks like this: - -```typescript -{ id: 1, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 2, type: "vertex", label: "resultSet" } -{ id: 3, type: "vertex", label: "range", - start: { line: 0, character: 9}, end: { line: 0, character: 12 } -} -{ id: 4, type: "edge", label: "contains", outV: 1, inVs: [3] } -{ id: 5, type: "edge", label: "next", outV: 3, inV: 2 } -{ id: 6, type: "vertex", label: "hoverResult", - result: { - "contents":[ { - language: "typescript", value:"function bar(): void" - }] - } -} -{ id: 7, type: "edge", label: "textDocument/hover", outV: 2, inV: 6 } -``` - -Result Set - -Result sets are linked to ranges using a `next` edge. A results set can also forward information to another result set by linking to it using a `next` edge. - -The pattern of storing the result with the `ResultSet` will be used for other requests as well. The lookup algorithm is therefore as follows for a request [document, position, method]: - -1. find all ranges for [document, position]. If none exist, return `null` as the result -1. sort the ranges by containment the innermost first -1. for range in ranges do - 1. assign range to out - 1. while out !== `null` - 1. check if out has an outgoing edge `textDocument/${method}`. if yes, use it and return the corresponding result - 1. check if out has an outgoing `next` edge. If yes, set out to the target vertex. Else set out to `null` - 1. end -1. end -1. otherwise return `null` - -## Language Features - -### Request: `textDocument/definition` - -The same pattern of connecting a range, result set, or a document with a request edge to a method result is used for other requests as well. Let's next look at the `textDocument/definition` request using the following TypeScript sample: - -```typescript -function bar() { -} - -function foo() { - bar(); -} -``` - -This will emit the following vertices and edges to model the `textDocument/definition` request: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The result set -{ id: 6, type: "vertex", label: "resultSet" } - -// The bar declaration -{ id: 9, type: "vertex", label: "range", - start: { line: 0, character: 9 }, end: { line: 0, character: 12 } -} -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - - -// The bar reference -{ id: 20, type: "vertex", label: "range", - start: { line: 4, character: 2 }, end: { line: 4, character: 5 } -} -{ id: 21, type: "edge", label: "next", outV: 20, inV: 6} - -// The definition result linked to the bar result set -{ id: 22, type: "vertex", label: "definitionResult" } -{ id: 23, type: "edge", label: "textDocument/definition", outV: 6, inV: 22 } -{ id: 24, type: "edge", label: "item", outV: 22, inVs: [9], shard: 4 } -``` - -Definition Result - -The definition result above has only one value (the range with id '9') and we could have emitted it directly. However, we introduced the definition result vertex for two reasons: - -- To have consistency with all other requests that point to a result. -- To have support for languages where a definition can be spread over multiple ranges or even multiple documents. To support multiple documents ranges are added to a definition result using an 1:N `item` edge. Conceptually a definition result is an array to which the `item` edge adds items. - -Consider the following TypeScript example: - -```typescript -interface X { - foo(); -} -interface X { - bar(); -} -let x: X; -``` - -Running **Go to Definition** on `X` in `let x: X` will show a dialog which lets the user select between the two definitions of the `interface X`. The emitted JSON in this case looks like this: - -```typescript -{ id : 38, type: "vertex", label: "definitionResult" } -{ id : 40, type: "edge", label: "item", outV: 38, inVs: [9, 13], shard: 4 } -``` - -The `item` edge as an additional property shard which indicate the vertex that is the source (e.g. a document or a project) of these declarations. We added this information to still make it easy to emit the data but also make it easy to process and shard the data when storing into a database. Without that information we would either need to specific an order in which data needs to be emitted (e.g. a item edge and only refer to a range that got already added to a document using a `contains` edge) or we force processing tools to keep a lot of vertices and edges in memory. The approach of having this `shard` property looks like a fair balance. - -### Request: `textDocument/declaration` - -There are programming languages that have the concept of declarations and definitions (like C/C++). If this is the case, the dump can contain a corresponding `declarationResult` vertex and a `textDocument/declaration` edge to store the information. They are handled analogously to the entities emitted for the `textDocument/definition` request. - -### More about Request: `textDocument/hover` - -In the LSP, the hover is defined as follows: - -```typescript -export interface Hover { - /** - * The hover's content - */ - contents: MarkupContent | MarkedString | MarkedString[]; - - /** - * An optional range - */ - range?: Range; -} -``` - -where the optional range is the name range of the word hovered over. - -> **Side Note**: This is a pattern used for other LSP requests as well, where the result contains the word range of the word the position parameter pointed to. - -This makes the hover different for every location so we can't really store it with the result set. But wait, the range is the range of one of the `bar` references we already emitted and used to start to compute the result. To make the hover still reusable, we ask the index server to fill in the starting range if no range is defined in the result. So for a hover request executed on range `{ line: 4, character: 2 }, end: { line: 4, character: 5 }` the hover result will be: - -```typescript -{ id: 6, type: "vertex", label: "hoverResult", - result: { - contents: [ { language: "typescript", value: "function bar(): void" } ], - range: { line: 4, character: 2 }, end: { line: 4, character: 5 } - } -} -``` - -### Request: `textDocument/references` - -Storing references will be done in the same way as storing a hover or go to definition ranges. It uses a reference result vertex and `item` edges to add ranges to the result. - -Look at the following example: - -```typescript -function bar() { -} - -function foo() { - bar(); -} -``` - -The relevant JSON output looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The bar declaration -{ id: 6, type: "vertex", label: "resultSet" } -{ id: 9, type: "vertex", label: "range", - start: { line: 0, character: 9 }, end: { line: 0, character: 12 } -} -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - -// The bar reference range -{ id: 20, type: "vertex", label: "range", - start: { line: 4, character: 2 }, end: { line: 4, character: 5 } -} -{ id: 21, type: "edge", label: "next", outV: 20, inV: 6 } - -// The reference result -{ id : 25, type: "vertex", label: "referenceResult" } -// Link it to the result set -{ id : 26, type: "edge", label: "textDocument/references", outV: 6, inV: 25 } - -// Add the bar definition as a reference to the reference result -{ id: 27, type: "edge", label: "item", - outV: 25, inVs: [9], shard: 4, property: "definitions" -} - -// Add the bar reference as a reference to the reference result -{ id: 28, type: "edge", label: "item", - outV: 25, inVs: [20], shard: 4, property: "references" -} -``` - -References Result - -We tag the `item` edge with id 27 as a definition since the reference result distinguishes between definitions, declarations, and references. This is done since the `textDocument/references` request takes an additional input parameter `includeDeclarations` controlling whether declarations and definitions are included in the result as well. Having three distinct properties allows the server to compute the result accordingly. - -The item edge also support linking reference results to other reference results. This is useful when computing references to methods overridden in a type hierarchy. - -Take the following example: - -```typescript -interface I { - foo(): void; -} - -class A implements I { - foo(): void { - } -} - -class B implements I { - foo(): void { - } -} - -let i: I; -i.foo(); - -let b: B; -b.foo(); -``` - -The reference result for the method `foo` in TypeScript contains all three declarations and both references. While parsing the document, one reference result is created and then shared between all result sets. - -The output looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The declaration of I#foo -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 16, type: "vertex", label: "range", - start: { line: 1, character: 2 }, end: { line: 1, character: 5 } -} -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } -// The reference result for I#foo -{ id: 30, type: "vertex", label: "referenceResult" } -{ id: 31, type: "edge", label: "textDocument/references", outV: 13, inV: 30 } - -// The declaration of A#foo -{ id: 29, type: "vertex", label: "resultSet" } -{ id: 34, type: "vertex", label: "range", - start: { line: 5, character: 2 }, end: { line: 5, character: 5 } -} -{ id: 35, type: "edge", label: "next", outV: 34, inV: 29 } - -// The declaration of B#foo -{ id: 47, type: "vertex", label: "resultSet" } -{ id: 50, type: "vertex", label: "range", - start: { line: 10, character: 2 }, end: { line: 10, character: 5 } -} -{ id: 51, type: "edge", label: "next", outV: 50, inV: 47 } - -// The reference i.foo() -{ id: 65, type: "vertex", label: "range", - start: { line: 15, character: 2 }, end: { line: 15, character: 5 } -} - -// The reference b.foo() -{ id: 78, type: "vertex", label: "range", - start: { line: 18, character: 2 }, end: { line: 18, character: 5 } -} - -// The insertion of the ranges into the shared reference result -{ id: 90, type: "edge", label: "item", - outV: 30, inVs: [16,34,50], shard: 4, property: "definitions" -} -{ id: 91, type: "edge", label: "item", - outV: 30, inVs: [65,78], shard: 4, property: "references" -} - -// Linking A#foo to I#foo -{ id: 101, type: "vertex", label: "referenceResult" } -{ id: 102, type: "edge", label: "textDocument/references", outV: 29, inV: 101 } -{ id: 103, type: "edge", label: "item", - outV: 101, inVs: [30], shard: 4, property: "referenceResults" -} - -// Linking B#foo to I#foo -{ id: 114, type: "vertex", label: "referenceResult" } -{ id: 115, type: "edge", label: "textDocument/references", outV: 47, inV: 114 } -{ id: 116, type: "edge", label: "item", - outV: 114, inVs: [30], shard: 4, property: "referenceResults" -} -``` - -One goal of the language server index format is that the information can be emitted as soon as possible without caching too much information in memory. With languages that support overriding methods defined in more than one interface, this can be more complicated since the whole inheritance tree might only be known after parsing all documents. - -Take the following TypeScript example: - -```typescript -interface I { - foo(): void; -} - -interface II { - foo(): void; -} - -class B implements I, II { - foo(): void { - } -} - -let i: I; -i.foo(); - -let b: B; -b.foo(); -``` - -Searching for `I#foo()` finds 4 references, searching for `II#foo()` finds 3 reference, and searching on `B#foo()` finds 5 results. The interesting part here is when the declaration of `class B` gets processed which implements `I` and `II`, neither the reference result bound to `I#foo()` nor the one bound to `II#foo()` can be reused. So we need to create a new one. To still be able to profit from the results generated for `I#foo` and `II#foo`, the LSIF supports nested references results. This way the one referenced from `B#foo` will reuse the one from `I#foo` and `II#foo`. Depending on how these declarations are parsed, the two reference results might contain the same references. When a language server interprets reference results consisting of other reference results, the server is responsible to de-duplicate the final ranges. - -In the above example, there will be three reference results - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// Declaration of I#foo -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 16, type: "vertex", label: "range", - start: { line: 1, character: 2 }, end: { line: 1, character: 5 } -} -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } - -// Declaration of II#foo -{ id: 27, type: "vertex", label: "resultSet" } -{ id: 30, type: "vertex", label: "range", - start: { line: 5, character: 2 }, end: { line: 5, character: 5 } -} -{ id: 31, type: "edge", label: "next", outV: 30, inV: 27 } - -// Declaration of B#foo -{ id: 45, type: "vertex", label: "resultSet" } -{ id: 52, type: "vertex", label: "range", - start: { line: 9, character: 2 }, end: { line: 9, character: 5 } -} -{ id: 53, type: "edge", label: "next", outV: 52, inV: 45 } - -// Reference result for I#foo -{ id: 46, type: "vertex", label: "referenceResult" } -{ id: 47, type: "edge", label: "textDocument/references", outV: 13, inV: 46 } - -// Reference result for II#foo -{ id: 48, type: "vertex", label: "referenceResult" } -{ id: 49, type: "edge", label: "textDocument/references", outV: 27, inV: 48 } - -// Reference result for B#foo -{ id: 116 "typ" :"vertex", label: "referenceResult" } -{ id: 117 "typ" :"edge", label: "textDocument/references", outV: 45, inV: 116 } - -// Link B#foo reference result to I#foo and II#foo -{ id: 118 "typ" :"edge", label: "item", - outV: 116, inVs: [46,48], document: 4, property: "referenceResults" -} -``` - -For Typescript, method references are recorded at their most abstract declaration and if methods are merged (`B#foo`), they are combined using a reference result pointing to other results. - -### Request: `textDocument/implementation` - -Supporting a `textDocument/implementation` request is done reusing what we implemented for a `textDocument/references` request. In most cases, the `textDocument/implementation` returns the declaration values of the reference result that a symbol declaration points to. For cases where the result differs, the LSIF provides an `ImplementationResult`. To nest implementation results the `item` edge supports a `property` value `"implementationResults"`. - -The corresponding `ImplementationResult` looks like this: - -```typescript -interface ImplementationResult { - - label: `implementationResult` -} -``` - -### Request: `textDocument/typeDefinition` - -Supporting `textDocument/typeDefinition` is straightforward. The edge is either recorded at the range or at the `ResultSet`. - -The corresponding `TypeDefinitionResult` looks like this: - -```typescript -interface TypeDefinitionResult { - - label: `typeDefinitionResult` -} -``` - -For the following TypeScript example: - -```typescript -interface I { - foo(): void; -} - -let i: I; -``` - -The relevant emitted vertices and edges looks like this: - -```typescript -// The document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} - -// The declaration of I -{ id: 6, type: "vertex", label: "resultSet" } -{ id: 9, type: "vertex", label: "range", - start: { line: 0, character: 10 }, end: { line: 0, character: 11 } -} -{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } - -// The declaration of i -{ id: 26, type: "vertex", label: "resultSet" } -// The type definition result -{ id: 37, type: "vertex", label: "typeDefinitionResult" } -// Hook the result to the declaration -{ id: 38, type: "edge", label: "textDocument/typeDefinition", outV: 26, inV:37 } -// Add the declaration of I as a target range. -{ id: 51, type: "edge", label: "item", outV: 37, inVs: [9], shard: 4 } -``` - -As with other results ranges get added using a `item` edge. In this case without a `property` since there is only one kind of range. - -## Document requests - -The Language Server Protocol also supports requests for documents only (without any position information). These requests are `textDocument/foldingRange`, `textDocument/documentLink`, and `textDocument/documentSymbol`. We follow the same pattern as before to model these, the difference being that the result is linked to the document instead of to a range. - -### Request: `textDocument/foldingRange` - -For the folding range result this looks like this: - -```typescript -function hello() { - console.log('Hello'); -} - -function world() { - console.log('world'); -} - -function space() { - console.log(' '); -} -hello();space();world(); -``` - -```typescript -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 112, type: "vertex", label: "foldingRangeResult", result:[ - { startLine: 0, startCharacter: 16, endLine: 2, endCharacter: 1 }, - { startLine: 4, startCharacter: 16, endLine: 6, endCharacter: 1 }, - { startLine: 8, startCharacter: 16, endLine: 10, endCharacter: 1 } -]} -{ id: 113, type: "edge", label: "textDocument/foldingRange", outV: 2, inV: 112 } -``` - -The corresponding `FoldingRangeResult` is defined as follows: - -```typescript -export interface FoldingRangeResult { - label: 'foldingRangeResult'; - - result: lsp.FoldingRange[]; -} -``` - -### Request: `textDocument/documentLink` - -Again, for document links, we define a result type and a corresponding edge to link it to a document. Since the link location usually appear in comments, the ranges don't denote any symbol declarations or references. We therefore inline the range into the result like we do with folding ranges. - -```typescript -export interface DocumentLinkResult { - label: 'documentLinkResult'; - - result: lsp.DocumentLink[]; -} -``` - -### Request: `textDocument/documentSymbol` - -Next we look at the `textDocument/documentSymbol` request. This request usually returns an outline view of the document in hierarchical form. However, not all programming symbols declared or defined in a document are part of the result (for example, locals are usually omitted). In addition, an outline item needs to provide additional information like the full range and a symbol kind. There are two ways we can model this: either we do the same as we do for folding ranges and the document links and store the information in a document symbol result as literals, or we extend the range vertex with some additional information and refer to these ranges in the document symbol result. Since the additional information for ranges might be helpful in other scenarios as well, we support adding additional tags to these ranges by defining a `tag` property on the `range` vertex. - -The following tags are currently supported: - -```typescript -/** - * The range represents a declaration - */ -export interface DeclarationTag { - - /** - * A type identifier for the declaration tag. - */ - type: 'declaration'; - - /** - * The text covered by the range - */ - text: string; - - /** - * The kind of the declaration. - */ - kind: lsp.SymbolKind; - - /** - * The full range of the declaration not including leading/trailing whitespace - * but everything else, e.g comments and code. The range must be included in - * fullRange. - */ - fullRange: lsp.Range; - - /** - * Optional detail information for the declaration. - */ - detail?: string; -} - -/** - * The range represents a definition - */ -export interface DefinitionTag { - /** - * A type identifier for the declaration tag. - */ - type: 'definition'; - - /** - * The text covered by the range - */ - text: string; - - /** - * The symbol kind. - */ - kind: lsp.SymbolKind; - - /** - * The full range of the definition not including leading/trailing whitespace - * but everything else, e.g comments and code. The range must be included in - * fullRange. - */ - fullRange: lsp.Range; - - /** - * Optional detail information for the definition. - */ - detail?: string; -} - -/** - * The range represents a reference - */ -export interface ReferenceTag { - - /** - * A type identifier for the reference tag. - */ - type: 'reference'; - - /** - * The text covered by the range - */ - text: string; -} - -/** - * The type of the range is unknown. - */ -export interface UnknownTag { - - /** - * A type identifier for the unknown tag. - */ - type: 'unknown'; - - /** - * The text covered by the range - */ - text: string; -} -``` - -Emitting the tags for the following TypeScript example: - -```typescript -function hello() { -} - -hello(); -``` - -Will look like this: - -```typescript -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 4, type: "vertex", label: "resultSet" } -{ id: 7, type: "vertex", label: "range", - start: { line: 0, character: 9 }, end: { line: 0, character: 14 }, - tag: { - type: "definition", text: "hello", kind: 12, - fullRange: { - start: { line: 0, character: 0 }, end: { line: 1, character: 1 } - } - } -} -``` - -The document symbol result is then modeled as follows: - -```typescript -export interface RangeBasedDocumentSymbol { - - id: RangeId - - children?: RangeBasedDocumentSymbol[]; -} - -export interface DocumentSymbolResult extends V { - - label: 'documentSymbolResult'; - - result: lsp.DocumentSymbol[] | RangeBasedDocumentSymbol[]; -} -``` - -The given TypeScript example: - -```typescript -namespace Main { - function hello() { - } - function world() { - let i: number = 10; - } -} -``` - -Produces the following output: - -```typescript -// The document -{ id: 2 , type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -// The declaration of Main -{ id: 7 , type: "vertex", label: "range", - start: { line: 0, character: 10 }, end: { line: 0, character: 14 }, - tag: { - type: "definition", text: "Main", kind: 7, - fullRange: { - start: { line: 0, character: 0 }, end: { line: 5, character: 1 } - } - } -} -// The declaration of hello -{ id: 18 , type: "vertex", label: "range", - start: { line: 1, character: 11 }, end: { line: 1, character: 16 }, - tag: { - type: "definition", text: "hello", kind: 12, - fullRange: { - start: { line: 1, character: 2 }, end: { line: 2, character: 3 } - } - } -} -// The declaration of world -{ id: 29 , type: "vertex", label: "range", - start: { line: 3, character: 11 }, end: { line: 3, character: 16 }, - tag: { - type: "definition", text: "world", kind: 12, - fullRange: { - start: { line: 3, character: 2 }, end: { line: 4, character: 3 } - } - } -} -// The document symbol -{ id: 39 , type: "vertex", label: "documentSymbolResult", - result: [ { id: 7 , children: [ { id: 18 }, { id: 29 } ] } ] -} -{ id: 40 , type: "edge", label: "textDocument/documentSymbol", - outV: 2, inV: 39 -} -``` - -### Request: `textDocument/diagnostic` - -The only information missing that is useful in a dump are the diagnostics associated with documents. Diagnostics in the LSP are modeled as a push notifications sent from the server to the client. This doesn't work well with a dump modeled on request method names. However, the push notification can be emulated as a request where the request's result is the value sent during the push as a parameter. - -In the dump, we model diagnostics as follows: - -- We introduce a pseudo request `textDocument/diagnostic`. -- We introduce a diagnostic result which contains the diagnostics associated with a document. - -The result looks like this: - -```typescript -export interface DiagnosticResult { - - label: 'diagnosticResult'; - - result: lsp.Diagnostic[]; -} -``` - -The given TypeScript example: - -```typescript -function foo() { - let x: string = 10; -} -``` - -Produces the following output: - -```typescript -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 18, type: "vertex", label: "diagnosticResult", - result: [ - { - severity: 1, code: 2322, - message: "Type '10' is not assignable to type 'string'.", - range: { - start : { line: 1, character: 5 }, end: { line: 1, character: 6 } - } - } - ] -} -{ id: 19, type: "edge", label: "textDocument/diagnostic", outV: 2, inV: 18 } -``` - -Since diagnostics are not very common in dumps, no effort has been made to reuse ranges in diagnostics. - -### The Project vertex - -Usually language servers operate in some sort of project context. In TypeScript, a project is defined using a `tsconfig.json` file. C# and C++ have their own means. The project file usually contains information about compile options and other parameters. Having these in the dump can be valuable. The LSIF therefore defines a project vertex. In addition, all documents that belong to that project are connected to the project using a `contains` edge. If there was a `tsconfig.json` in the previous examples, the first emitted edges and vertices would look like this: - -```typescript -{ id: 1, type: "vertex", label: "project", - resource: "file:///Users/dirkb/tsconfig.json", kind: "typescript" -} -{ id: 2, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" -} -{ id: 3, type: "edge", label: "contains", outV: 1, inVs: [2] } -``` - -The definition of the `project` vertex looks as follows: - -```ts -export interface Project extends V { - - /** - * The label property. - */ - label: VertexLabels.project; - - /** - * The project kind like 'typescript' or 'csharp'. See also the language ids - * in the specification. - * See https://microsoft.github.io/language-server-protocol/specification - */ - kind: string; - - /** - * The resource URI of the project file. - */ - resource?: Uri; - - /** - * Optional the content of the project file, `base64` encoded. - */ - contents?: string; -} -``` - -### Embedding contents - -It can be valuable to embed the contents of a document or project file into the dump as well. For example, if the content of the document is a virtual document generated from program meta data. The index format therefore supports an optional `contents` property on the `document` and `project` vertex. If used the content needs to be `base64` encoded. - -## Advanced Concepts - -### Events - -To ease the processing of an LSIF dump to, for example, import it into a database the dump emits begin and end events for documents and projects. After the end event of a document has been emitted the dump must not contain any further data referencing that document. For example, no ranges from that document can be referenced in `item` edges. Nor can result sets or other vertices linked to the ranges in that document. The document can however be referenced in a `contains` edge adding the document to a project. The begin / end events for documents look like this: - -```ts -// The actual document -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", - contents: "..." -} -// The begin event -{ id: 5, type: "vertex", label: "$event", - kind: "begin", scope: "document" , data: 4 -} -// The end event -{ id: 53, type: "vertex", label: "$event", - kind: "end", scope: "document" , data: 4 -} -``` - -Between the document vertex `4` and the document begin event `5` no information specific to document `4` can be emitted. Please note that more than one document can be open at a given point in time meaning that there have been n different document begin events without corresponding document end events. - -The events for projects looks similar: - -```ts -{ id: 2, type: "vertex", label: "project", kind: "typescript" } -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", - contents: "..." -} -{ id: 5, type: "vertex", label: "$event", - kind: "begin", scope: "document" , data: 4 -} -{ id: 3, type: "vertex", label: "$event", - kind: "begin", scope: "project", data: 2 -} -{ id: 53, type: "vertex", label: "$event", - kind: "end", scope: "document", data: 4 -} -{ id: 54, type: "edge", label: "contains", outV: 2, inVs: [4] } -{ id: 55, type: "vertex", label: "$event", - kind: "end", scope: "project", data: 2 -} -``` - -### Project exports and external imports (Monikers) - -> Changed in 0.5.0 - -One use case of the LSIF is to create dumps for released versions of a product, either a library or a program. If a project **P2** references a library **P1**, it would also be useful if the information in these two dumps could be related. To make this possible, the LSIF introduces optional monikers which can be linked to ranges using a corresponding edge. The monikers can be used to describe what a project exports and what it imports. Let's first look at the export case. - -Consider the following TypeScript file called `index.ts`: - -```typescript -export function func(): void { -} - -export class Emitter { - private doEmit() { - } - - public emit() { - this.doEmit(); - } -} -``` - -```typescript -{ id: 4, type: "vertex", label: "document", - uri: "file:///Users/dirkb/index.ts", languageId: "typescript", - contents: "..." -} -{ id: 11, type: "vertex", label: "resultSet" } -{ id: 12, type: "vertex", label: "moniker", kind: "export", - scheme: "tsc", identifier: "lib/index:func", unique: "workspace" -} -{ id: 13, type: "edge", label: "moniker", outV: 11, inV: 12 } -{ id: 14, type: "vertex", label: "range", - start: { line: 0, character: 16 }, end: { line: 0, character: 20 } -} -{ id: 15, type: "edge", label: "next", outV: 14, inV: 11 } - -{ id: 18, type: "vertex", label: "resultSet" } -{ id: 19, type: "vertex", label: "moniker", - kind: "export", scheme: "tsc", identifier: "lib/index:Emitter", - unique: "workspace" -} -{ id: 20, type: "edge", label: "moniker", outV: 18, inV: 19 } -{ id: 21, type: "vertex", label: "range", - start: { line: 3, character: 13 }, end: { line: 3, character: 20 } -} -{ id: 22, type: "edge", label: "next", outV: 21, inV: 18 } - -{ id: 25, type: "vertex", label: "resultSet" } -{ id: 26, type: "vertex", label: "moniker", - kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.doEmit", - unique: "workspace" -} -{ id: 27, type: "edge", label: "moniker", outV: 25, inV: 26 } -{ id: 28, type: "vertex", label: "range", - start: { line: 4, character: 10 }, end: { line: 4, character: 16 } -} -{ id: 29, type: "edge", label: "next", outV: 28, inV: 25 } - -{ id: 32, type: "vertex", label: "resultSet" } -{ id: 33, type: "vertex", label: "moniker", - kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.emit", - unique: "workspace" -} -{ id: 34, type: "edge", label: "moniker", outV: 32, inV: 33 } -{ id: 35, type: "vertex", label: "range", - start: { line: 7, character: 9 }, end: { line: 7, character: 13 } -} -{ id: 36, type: "edge", label: "next", outV: 35, inV: 32 } -``` - -This describes the exported declaration inside `index.ts` with a moniker (e.g. a handle in string format) that is bound to the corresponding range declaration. The generated moniker must be position independent and stable so that it can be used to identify the symbol in other projects or documents. It should be sufficiently unique so as to avoid matching other monikers in other projects unless they actually refer to the same symbol. A moniker therefore has the following properties: - -- `scheme` to indicate how the `identifiers` is to be interpreted. -- `identifier` to actually identify the symbol. Its structure is opaque to the scheme owner. In the above example the monikers are created by the TypeScript compiler tsc and can only be compared to monikers also having the scheme `tsc`. -- `kind` to indicate whether the moniker is exported, imported or local to the project. -- `unique` to indicate how unique the moniker is. See the multi project section for more information on this. - -Please also note that the method `Emitter#doEmit` has an export moniker although the method is private. If private elements do have monikers depends on the programming language. Since TypeScript can't enforce visibility (it compiles to JS which doesn't have the concept) we treat them as visible. Even the TypeScript language server does so. Find all references does find all references to private methods even if it is flagged as a visibility violation. - -### Systems with multiple Projects - ->New in 0.5.0, changed in 0.6.0 - -Most software systems today consist out of multiple projects. Always creating LSIF dumps for all project of a system even if only one project changes is not very feasible, especially if only internals in a project changed. LSIF since 0.4.0 therefore allows to create an LSIF dump per project and link them to larger system in the DB again. However 0.4.0 was lacking some concepts to make this real. To motivate them consider the following example - -**Project P1** - -Project P1 consist of one `p1Main.ts` file with the following content: - -```typescript -export interface Disposable { - dispose(): void; -} - -let d: Disposable; -d.dispose(); -``` - -**Project P2** - -Project P2 depends on P1 and consists of one `p2Main.ts` file with the following content: - -```typescript -import { Disposable } from 'p1'; - -class Widget implements Disposable { - public dispose(): void { - } -} - -let w: Widget; -w.dispose(); -``` - -Now if a user search for reference to `Widget#dispose` it is expected that the reference `d.dispose` in P1 is included in the result. However when P1 is process the tools doesn't know about P2. And when P2 is processed it usually doesn't know about the source of P1. It only knows about its API shape (e.g. in TypeScript the corresponding `d.ts` file). - -To make this work we first need to put projects into larger units so that we know in which projects `d.dispose` is actually a match. Assume there is a totally unrelated project PX which also uses `Disposable` from P1 but P2 is never linked into one system with PX. So an object of type `Widget` can never flow to code in PX hence reference in PX should not be listed. How projects can be group mainly depends on the programming language. In addition whether that information is useful also depends on the storage backend an LSIF dump is stored into. However a good indication in the source from which a dump got generated. We therefore introduce the notation of a `Source` vertex to indicate the dump's source. The source vertex is a root vertex in the dump and not connected to any other nodes. Lets look at the concrete dumps for P1 and P2: - -```typescript -{ id:2, type: "vertex", label: "source", - workspaceRoot: "file:///Users/dirkb/samples/ts-cascade", - repository: { - type: "git", - url: "git+https://github.com/samples/ts-cascade.git" - } -} -``` - -The source vertex carries the following useful information: - -- the `workspaceRoot`: it is the workspace root URI used when creating the dump. It allows for a relative interpretation of other URI's in the dump like document URIs. -- the `repository`: it indicates the repository in which the source code is stored, if available. - -The dump for project P2 includes the same source vertex: - -```typescript -{ id:2, type: "vertex", label: "source", - workspaceRoot: "file:///Users/dirkb/samples/ts-cascade", - repository: { - type: "git", - url: "git+https://github.com/samples/ts-cascade.git" - } -} -``` - -Note that P1 and P2 have the same source information which is a good indication for the storage backend to resolve references across these two projects. However project grouping might not be limited to source repositories. Therefore a storage backend should define a way to group projects in a hierarchal way. This will, for example, allow searches like: find all references to function `foo` in the organization O. - -Now lets look how we ensure that searching for references for `Widget#dispose` find the `d.dispose()` match in P1 as well. First lets look what kind of information will be in the dump of P1 for `Disposable#dispose`: - -```typescript -// The result set for the Disposable#dispose symbol -{ id: 21, type: "vertex", label: "resultSet" } -// The export moniker of Disposable#dispose in P1 (note kind export). -{ id: 22, type: "vertex", label: "moniker", - scheme: "tsc", identifier: "p1/lib/p1Main:Disposable.dispose", - unique: "workspace", kind:"export" -} -{ id: 23, type: "edge", label: "moniker", outV: 21, inV: 22 } -// The actual definition of the symbol -{ id: 24, type: "vertex", label: "range", - start: { line: 1, character: 1 }, end: { line: 1, character: 8 }, - tag: { - type: definition, text: "dispose", kind: 7, - fullRange: { - start : { line: 1, character:1 }, end: { line: 1, character: 17 } - } - } -} -// Bind the reference result to the result set -{ id: 57, type: "vertex", label: "referenceResult" } -{ id: 58, type: "edge", label: "textDocument/references", outV: 21, inV: 57 } -``` - -Interesting here is line 22 which defines the moniker for `Disposable#dispose`. It has new a property `unique` telling that the moniker is unique inside a `workspace` of projects but not necessarily outside. Other possible values for `unique` are: - -- `document` to indicate that the moniker is only unique inside a document. Used, for example, for locals or private members. -- `project` to indicate that the moniker is only unique inside a project. Used, for example, for project internal symbols. -- `workspace` to indicate that the moniker is unique inside a workspace of projects. Used, for example, for exported members. -- `scheme` to indicate that the moniker is unique inside the moniker's scheme. For example, if the moniker is generated for a specific package manager (see npm example below) then these monikers are usually unique inside the moniker's theme (e.g. all moniker generated for npm carry the `npm` scheme and are unique) -- `global` to indicate that the moniker is globally unique (e.g. its identifer is unique independent of the scheme or kind) - -When generating the dump for P2 the information for `Widget#dispose` will look like this: - -```typescript -// The import moniker for importing Disposable#dispose into P2 -{ id: 22, type: "vertex", label: "moniker", - scheme: "tsc", identifier: "p1/lib/p1Main:Disposable.dispose", - unique: "workspace", kind: "import" -} - -// The result set for Widget#dispose -{ id: 78, type: "vertex", label: "resultSet" } -// The moniker for Widget#dispose. Note that the moniker is local since the -// Widget class is not exported -{ id: 79, type: "vertex", label: "moniker", - scheme: "tsc", identifier: "2Q46RTVRZTuVW1ajf68/Vw==", - unique: "document", kind: "local" -} -{ id: 80, type: "edge", label: "moniker", outV: 78, inV: 79 } -// The actual definition of the symbol -{ id: 81, type: "vertex", label: "range", - start: { line: 3, character: 8 }, end: { line: 3, character: 15 }, - tag: { - type: "definition", text: "dispose", kind: 6, - fullRange: { - start: { line: 3, character: 1 }, end: { line: 4, character: 2 } - } - } -} -// Bind the reference result to Widget#dispose -{ id: 116, type: "vertex", label: "referenceResult" } -{ id: 117, type: "edge", label: "textDocument/references", outV: 78, inV: 116} -{ id: 118, type: "edge", label: "item", - outV: 116, inVs: [43], shard: 52, property: "referenceResults" -} -// Link the reference result set of Disposable#dispose to this result set -// using a moniker -{ id: 119, type: "edge", label: "item", - outV: 116, inVs: [22], shard: 52, property: "referenceLinks" -} -{ id: 120, type: "edge", label: "item", - outV: 43, inVs: [81], shard: 52, property: "definitions" -} -{ id: 121, type: "edge", label: "item", - outV: 43, inVs: [96], shard: 52, property: "references" -} -``` - -The noteworthy parts are: - -- the vertex with `id: 22`: is the import moniker for `Disposable#dispose` from P1. -- the edge with `id: 119`: this adds a reference link to the reference result of `Widget#dispose`. Item edges with a `referenceLinks` are conceptual like item edges with a `referenceResults` property. They allow for composite reference results. The different is that a `referenceResults` item edge references another result using the vertex id since the reference result is part of the same dump. A `referenceLinks` item edge references another result using a moniker. So the actual resolving needs to happen in a database which has the data for both P1 and P2. As with `referenceResults` item edges a language servers is responsible to de-duplicate the final ranges. - -### Package Managers - -> Changed in 0.5.0 - -How exported elements are visible in other projects in most programming languages depends on how files are packaged into a library or program. In TypeScript, the standard package manager is npm. - -Consider that the following `package.json` file exists: - -```json -{ - "name": "lsif-ts-sample", - "version": "1.0.0", - "description": "", - "main": "lib/index.js", - "author": "MS", - "license": "MIT", -} -``` - -for the following TypeScript file (same as above): - -```typescript -export function func(): void { -} - -export class Emitter { - private doEmit() { - } - - public emit() { - this.doEmit(); - } -} -``` - -then these monikers can be translated into monikers that are `npm` dependent. Instead of replacing the monikers we emit a second set of monikers and link the `tsc` monikers to corresponding `npm` monikers using an `attach`edge: - -```typescript -{ id: 991, type: "vertex", label: "packageInformation", - name: "lsif-ts-sample", manager: "npm", version: "1.0.0" -} - -{ id: 987, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", identifier: "lsif-ts-sample::func", - unique: "scheme" -} -{ id: 986, type: "edge", label: "packageInformation", outV: 987, inV: 991 } -{ id: 985, type: "edge", label: "attach", outV: 987, inV: 12 } - -{ id: 984, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter", - unique: "scheme" -} -{ id: 983, type: "edge", label: "packageInformation", outV: 984, inV: 991 } -{ id: 982, type: "edge", label: "attach", outV: 984, inV: 19 } - -{ id: 981, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", - identifier: "lsif-ts-sample::Emitter.doEmit", unique: "scheme" -} -{ id: 980, type: "edge", label: "packageInformation", outV: 981, inV: 991 } -{ id: 979, type: "edge", label: "attach", outV: 981, inV: 26 } - -{ id: 978, type: "vertex", label: "moniker", - kind: "export", scheme: "npm", - identifier: "lsif-ts-sample::Emitter.emit", unique: "scheme" -} -{ id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } -{ id: 976, type: "edge", label: "attach", outV: 978, inV: 33 } -``` -Things to observe: - -- a special `packageInformation` vertex got emitted to point to the corresponding npm package information. -- the npm moniker refer to the package name. -- its `unique` value is `scheme` denoting that the monikers identifier is unique across all `npm` monikers. -- since the file `index.ts` is the npm main file the moniker identifier as no file path. The is comparable to importing this module into TypeScript or JavaScript were only the module name and no file path is used (e.g. `import * as lsif from 'lsif-ts-sample'`). -- the `attach` edge points from the npm moniker vertex to the tsc moniker vertex. - -For LSIF we recommend that a second tool is used to make the monikers emitted by the indexer be package manager dependent. This supports the use of different package managers and allows incorporating custom build tools. In the TypeScript implementation, this is done by a npm specific tool which attaches the monikers taking the npm package information into account. - -Reporting importing external symbols is done using the same approach. The LSIF emits monikers of kind `import`. Consider the following typescript example: - -```typescript -import * as mobx from 'mobx'; - -let map: mobx.ObservableMap = new mobx.ObservableMap(); -``` - -where `mobx` is the [npm mobx package](https://www.npmjs.com/package/mobx). Running the tsc index tools produces: - -```typescript -{ id: 41, type: "vertex", label: "document", - uri: "file:///samples/node_modules/mobx/lib/types/observablemap.d.ts", - languageId: "typescript", contents: "..." -} -{ id: 55, type: "vertex", label: "resultSet" } -{ id: 57, type: "vertex", label: "moniker", - kind: "import", scheme: "tsc", - identifier: "node_modules/mobx/lib/mobx:ObservableMap", unique: 'workspace' -} -{ id: 58, type: "edge", label: "moniker", outV: 55, inV: 57 } -{ id: 59, type: "vertex", label: "range", - start: { line: 17, character: 538 }, end: { line: 17, character: 551 } -} -{ id: 60, type: "edge", label: "next", outV: 59, inV: 55 } -``` - -Three things to note here: First, TypeScript uses declarations files for externally imported symbols. That has the nice effect that the moniker information can be attached to the declaration ranges in these files. In other languages, the information might be attached to the file actually referencing the symbol. Or a virtual document for the referenced item is generated. Second, the tool only generates this information for symbols actually referenced, not for all available symbols. Third these monikers are `tsc` specific and point to the `node_modules` folder. - -However piping this information through the npm tool will generate the following information: - -```typescript -{ id: 991, type: "vertex", label: "packageInformation", - name: "mobx", manager: "npm", version: "5.6.0", - repository: { type: "git", url: "git+https://github.com/mobxjs/mobx.git" } -} -{ id: 978, type: "vertex", label: "moniker", - kind: "import", scheme: "npm", identifier: "mobx::ObservableMap", - unique: 'scheme' -} -{ id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } -{ id: 976, type: "edge", label: "attach", outV: 978, inV: 57 } -``` - -which made the moniker specific to the npm `mobx` package. In addition information about the `mobx` package itself got emitted. - -Usually monikers are attached to result sets since they are the same for all ranges pointing to the result set. However for dumps that don't use result sets, monikers can also be emitted on ranges. - -For tools processing the dump and importing it into a database it is sometime useful to know whether a result is local to a file or not (for example, function arguments can only be navigated inside the file). To help postprocessing tools to efficiently decide this, LSIF generation tools should generate a moniker for locals as well. The corresponding kind to use is `local`. The identifier should still be unique inside the document. - -For the following example - -```ts -function foo(x: number): void { -} -``` - -The moniker for `x` looks like this: - -```ts -{ id: 13, type: "vertex", label: "resultSet" } -{ id: 14, type: "vertex", label: "moniker", - kind: "local", scheme: "tsc", identifier: "SfeOP6s53Y2HAkcViolxYA==", - unique: 'document' -} -{ id: 15, type: "edge", label: "moniker", outV: 13, inV: 14 } -{ id: 16, type: "vertex", label: "range", - start: { line: 0, character: 13 }, end: { line: 0, character: 14 }, - tag: { - type: "definition", text: "x", kind: 7, - fullRange: { - start: { line: 0, character: 13 }, end: { line: 0, character: 22 } - } - } -} -{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } -``` - -In addition to this moniker schemes starting with `$` are reserved and shouldn't be used by a LSIF tool. - -### Result ranges - -Ranges in LSIF have currently two meanings: - -1. they act as LSP request sensitive areas in a document (e.g. we use them to decide if for a given position a corresponding LSP request result exists) -1. they act as navigation targets (e.g. they are the result of a Go To declaration navigation). - -To fulfil the first LSIF specifies that ranges can't overlap or be the same. However this constraint is not necessary for the second meaning. To support equal or overlapping target ranges we introduce a vertex `resultRange`. It is not allowed to use a `resultRange` as a target in a `contains` edge. - -### Meta Data Vertex - -> Changed in 0.5.0 - -To support versioning the LSIF defines a meta data vertex as follows: - -```typescript -export interface MetaData { - - /** - * The label property. - */ - label: 'metaData'; - - /** - * The version of the LSIF format using semver notation. See - * https://semver.org/. Please note the version numbers starting with 0 - * don't adhere to semver and adopters have to assume the each new version - * is breaking. - */ - version: string; - - /** - * The string encoding used to compute line and character values in - * positions and ranges. Currently only 'utf-16' is support due to the - * limitations in LSP. - */ - positionEncoding: 'utf-16', - - /** - * Information about the tool that created the dump - */ - toolInfo?: { - name: string; - version?: string; - args?: string[]; - } -} -``` - -### Emitting constraints - -> Extended in 0.6.0 - -The following emitting constraints (some of which have already been mentioned in the document) exist: - -- a vertex needs to be emitted before it can be referenced in an edge. -- a `range` and `resultRange` can only be contained in one document. -- a `resultRange` can not be used as a target in a `contains` edge. -- after a document end event has been emitted only result sets, reference or implementation results emitted through that document can be referenced in edges. It is, for example, not allowed to reference ranges or result ranges from that document. This also includes adding monikers to ranges or result sets. The document data so to speak can not be altered anymore. -- if ranges point to result sets and monikers are emitted, they must be emitted on the result set and can't be emitted on individual ranges. -- if a range is references in a items edge the range must have been attached to a document using the contains edge. This ensures that that target document of a range is known. (@since 0.6.0) - -## Additional Information - -### Tools - -- [`lsif-protocol`](https://github.com/Microsoft/lsif-node/tree/master/protocol): Protocol defined as TypeScript interfaces -- [`lsif-util`](https://github.com/jumattos/lsif-util): Utility tools for LSIF development -- [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc): LSIF indexer for TypeScript -- [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm): Linker for NPM monikers - -### Open Questions - -While implementing this for TypeScript and npm we collected a list of [open questions](https://github.com/Microsoft/lsif-typescript/labels/discussion) in form of GitHub issues we are already aware of. diff --git a/language-server-protocol/_specifications/lsp/3.17/client/registerCapability.md b/language-server-protocol/_specifications/lsp/3.17/client/registerCapability.md deleted file mode 100644 index aa946169e..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/client/registerCapability.md +++ /dev/null @@ -1,107 +0,0 @@ -#### Register Capability (:arrow_right_hook:) - -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). - -Server must not register the same capability both statically through the initialize result and dynamically for the same document selector. If a server wants to support both static and dynamic registration it needs to check the client capability in the initialize request and only register the capability statically if the client doesn't support dynamic registration for that capability. - -_Request_: -* method: 'client/registerCapability' -* params: `RegistrationParams` - -Where `RegistrationParams` are defined as follows: - -

- -```typescript -/** - * General parameters to register for a capability. - */ -export interface Registration { - /** - * The id used to register the request. The id can be used to deregister - * the request again. - */ - id: string; - - /** - * The method / capability to register for. - */ - method: string; - - /** - * Options necessary for the registration. - */ - registerOptions?: LSPAny; -} -``` - -
- -```typescript -export interface RegistrationParams { - registrations: Registration[]; -} -``` - -Since most of the registration options require to specify a document selector there is a base interface that can be used. See `TextDocumentRegistrationOptions`. - -An example JSON-RPC message to register dynamically for the `textDocument/willSaveWaitUntil` feature on the client side is as follows (only details shown): - -```json -{ - "method": "client/registerCapability", - "params": { - "registrations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil", - "registerOptions": { - "documentSelector": [ - { "language": "javascript" } - ] - } - } - ] - } -} -``` - -This message is sent from the server to the client and after the client has successfully executed the request further `textDocument/willSaveWaitUntil` requests for JavaScript text documents are sent from the client to the server. - -_Response_: -* 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. - -
- -```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. - -
- -```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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/client/unregisterCapability.md b/language-server-protocol/_specifications/lsp/3.17/client/unregisterCapability.md deleted file mode 100644 index 0d56e6778..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/client/unregisterCapability.md +++ /dev/null @@ -1,59 +0,0 @@ -#### Unregister Capability (:arrow_right_hook:) - -The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability. - -_Request_: -* method: 'client/unregisterCapability' -* params: `UnregistrationParams` - -Where `UnregistrationParams` are defined as follows: - -
- -```typescript -/** - * General parameters to unregister a capability. - */ -export interface Unregistration { - /** - * The id used to unregister the request or notification. Usually an id - * provided during the register request. - */ - id: string; - - /** - * The method / capability to unregister for. - */ - method: string; -} -``` - -
- -```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 - // of the specification. - unregisterations: Unregistration[]; -} -``` - -An example JSON-RPC message to unregister the above registered `textDocument/willSaveWaitUntil` feature looks like this: - -```json -{ - "method": "client/unregisterCapability", - "params": { - "unregisterations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil" - } - ] - } -} -``` -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. diff --git a/language-server-protocol/_specifications/lsp/3.17/general/exit.md b/language-server-protocol/_specifications/lsp/3.17/general/exit.md deleted file mode 100644 index e696e4a9a..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/general/exit.md +++ /dev/null @@ -1,8 +0,0 @@ -#### Exit Notification (:arrow_right:) - -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 diff --git a/language-server-protocol/_specifications/lsp/3.17/general/initialize.md b/language-server-protocol/_specifications/lsp/3.17/general/initialize.md deleted file mode 100644 index 70f998b69..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/general/initialize.md +++ /dev/null @@ -1,931 +0,0 @@ -#### Initialize Request (:leftwards_arrow_with_hook:) - -The initialize request is sent as the first request from the client to the server. If the server receives a request or notification before the `initialize` request it should act as follows: - -* For a request the response should be an error with `code: -32002`. The message can be picked by the server. -* Notifications should be dropped, except for the exit notification. This will allow the exit of a server without an initialize request. - -Until the server has responded to the `initialize` request with an `InitializeResult`, the client must not send any additional requests or notifications to the server. In addition the server is not allowed to send any requests or notifications to the client until it has responded with an `InitializeResult`, with the exception that during the `initialize` request the server is allowed to send the notifications `window/showMessage`, `window/logMessage` and `telemetry/event` as well as the `window/showMessageRequest` request to the client. In case the client sets up a progress token in the initialize params (e.g. property `workDoneToken`) the server is also allowed to use that token (and only that token) using the `$/progress` notification sent from the server to the client. - -The `initialize` request may only be sent once. - -_Request_: -* method: 'initialize' -* params: `InitializeParams` defined as follows: - -
- -```typescript -interface InitializeParams extends WorkDoneProgressParams { - /** - * The process Id of the parent process that started the server. Is null if - * the process has not been started by another process. If the parent - * process is not alive then the server should exit (see exit notification) - * its process. - */ - processId: integer | null; - - /** - * Information about the client - * - * @since 3.15.0 - */ - clientInfo?: { - /** - * The name of the client as defined by the client. - */ - name: string; - - /** - * The client's version as defined by the client. - */ - version?: string; - }; - - /** - * The locale the client is currently showing the user interface - * in. This must not necessarily be the locale of the operating - * system. - * - * Uses IETF language tags as the value's syntax - * (See https://en.wikipedia.org/wiki/IETF_language_tag) - * - * @since 3.16.0 - */ - locale?: string; - - /** - * The rootPath of the workspace. Is null - * if no folder is open. - * - * @deprecated in favour of `rootUri`. - */ - rootPath?: string | null; - - /** - * The rootUri of the workspace. Is null if no - * folder is open. If both `rootPath` and `rootUri` are set - * `rootUri` wins. - * - * @deprecated in favour of `workspaceFolders` - */ - rootUri: DocumentUri | null; - - /** - * User provided initialization options. - */ - initializationOptions?: LSPAny; - - /** - * The capabilities provided by the client (editor or tool) - */ - capabilities: ClientCapabilities; - - /** - * The initial trace setting. If omitted trace is disabled ('off'). - */ - trace?: TraceValue; - - /** - * The workspace folders configured in the client when the server starts. - * This property is only available if the client supports workspace folders. - * It can be `null` if the client supports workspace folders but none are - * configured. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFolder[] | null; -} -``` -Where `ClientCapabilities` and `TextDocumentClientCapabilities` are defined as follows: - - -##### TextDocumentClientCapabilities - -`TextDocumentClientCapabilities` define capabilities the editor / tool provides on text documents. - -
- -```typescript -/** - * Text document specific client capabilities. - */ -export interface TextDocumentClientCapabilities { - - synchronization?: TextDocumentSyncClientCapabilities; - - /** - * Capabilities specific to the `textDocument/completion` request. - */ - completion?: CompletionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/hover` request. - */ - hover?: HoverClientCapabilities; - - /** - * Capabilities specific to the `textDocument/signatureHelp` request. - */ - signatureHelp?: SignatureHelpClientCapabilities; - - /** - * Capabilities specific to the `textDocument/declaration` request. - * - * @since 3.14.0 - */ - declaration?: DeclarationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/definition` request. - */ - definition?: DefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/typeDefinition` request. - * - * @since 3.6.0 - */ - typeDefinition?: TypeDefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/implementation` request. - * - * @since 3.6.0 - */ - implementation?: ImplementationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/references` request. - */ - references?: ReferenceClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentHighlight` request. - */ - documentHighlight?: DocumentHighlightClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentSymbol` request. - */ - documentSymbol?: DocumentSymbolClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeAction` request. - */ - codeAction?: CodeActionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeLens` request. - */ - codeLens?: CodeLensClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentLink` request. - */ - documentLink?: DocumentLinkClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentColor` and the - * `textDocument/colorPresentation` request. - * - * @since 3.6.0 - */ - colorProvider?: DocumentColorClientCapabilities; - - /** - * Capabilities specific to the `textDocument/formatting` request. - */ - formatting?: DocumentFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/rangeFormatting` request. - */ - rangeFormatting?: DocumentRangeFormattingClientCapabilities; - - /** request. - * Capabilities specific to the `textDocument/onTypeFormatting` request. - */ - onTypeFormatting?: DocumentOnTypeFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/rename` request. - */ - rename?: RenameClientCapabilities; - - /** - * Capabilities specific to the `textDocument/publishDiagnostics` - * notification. - */ - publishDiagnostics?: PublishDiagnosticsClientCapabilities; - - /** - * Capabilities specific to the `textDocument/foldingRange` request. - * - * @since 3.10.0 - */ - foldingRange?: FoldingRangeClientCapabilities; - - /** - * Capabilities specific to the `textDocument/selectionRange` request. - * - * @since 3.15.0 - */ - selectionRange?: SelectionRangeClientCapabilities; - - /** - * Capabilities specific to the `textDocument/linkedEditingRange` request. - * - * @since 3.16.0 - */ - linkedEditingRange?: LinkedEditingRangeClientCapabilities; - - /** - * Capabilities specific to the various call hierarchy requests. - * - * @since 3.16.0 - */ - callHierarchy?: CallHierarchyClientCapabilities; - - /** - * Capabilities specific to the various semantic token requests. - * - * @since 3.16.0 - */ - semanticTokens?: SemanticTokensClientCapabilities; - - /** - * Capabilities specific to the `textDocument/moniker` request. - * - * @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. - -
- -```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). - -
- -```typescript -interface ClientCapabilities { - /** - * Workspace specific client capabilities. - */ - workspace?: { - /** - * The client supports applying batch edits - * to the workspace by supporting the request - * 'workspace/applyEdit' - */ - applyEdit?: boolean; - - /** - * Capabilities specific to `WorkspaceEdit`s - */ - workspaceEdit?: WorkspaceEditClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeConfiguration` - * notification. - */ - didChangeConfiguration?: DidChangeConfigurationClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeWatchedFiles` - * notification. - */ - didChangeWatchedFiles?: DidChangeWatchedFilesClientCapabilities; - - /** - * Capabilities specific to the `workspace/symbol` request. - */ - symbol?: WorkspaceSymbolClientCapabilities; - - /** - * Capabilities specific to the `workspace/executeCommand` request. - */ - executeCommand?: ExecuteCommandClientCapabilities; - - /** - * The client has support for workspace folders. - * - * @since 3.6.0 - */ - workspaceFolders?: boolean; - - /** - * The client supports `workspace/configuration` requests. - * - * @since 3.6.0 - */ - configuration?: boolean; - - /** - * Capabilities specific to the semantic token requests scoped to the - * workspace. - * - * @since 3.16.0 - */ - semanticTokens?: SemanticTokensWorkspaceClientCapabilities; - - /** - * Capabilities specific to the code lens requests scoped to the - * workspace. - * - * @since 3.16.0 - */ - codeLens?: CodeLensWorkspaceClientCapabilities; - - /** - * The client has support for file requests/notifications. - * - * @since 3.16.0 - */ - fileOperations?: { - /** - * Whether the client supports dynamic registration for file - * requests/notifications. - */ - dynamicRegistration?: boolean; - - /** - * The client has support for sending didCreateFiles notifications. - */ - didCreate?: boolean; - - /** - * The client has support for sending willCreateFiles requests. - */ - willCreate?: boolean; - - /** - * The client has support for sending didRenameFiles notifications. - */ - didRename?: boolean; - - /** - * The client has support for sending willRenameFiles requests. - */ - willRename?: boolean; - - /** - * The client has support for sending didDeleteFiles notifications. - */ - didDelete?: boolean; - - /** - * The client has support for sending willDeleteFiles requests. - */ - 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; - }; - - /** - * Text document specific client capabilities. - */ - textDocument?: TextDocumentClientCapabilities; - - /** - * Capabilities specific to the notebook document support. - * - * @since 3.17.0 - */ - notebookDocument?: NotebookDocumentClientCapabilities; - - /** - * Window specific client capabilities. - */ - window?: { - /** - * 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 - */ - workDoneProgress?: boolean; - - /** - * Capabilities specific to the showMessage request - * - * @since 3.16.0 - */ - showMessage?: ShowMessageRequestClientCapabilities; - - /** - * Client capabilities for the show document request. - * - * @since 3.16.0 - */ - showDocument?: ShowDocumentClientCapabilities; - }; - - /** - * General client capabilities. - * - * @since 3.16.0 - */ - 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 - */ - regularExpressions?: RegularExpressionsClientCapabilities; - - /** - * Client capabilities specific to the client's markdown parser. - * - * @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?: LSPAny; -} -``` - -_Response_: -* result: `InitializeResult` defined as follows: - -
- -```typescript -interface InitializeResult { - /** - * The capabilities the language server provides. - */ - capabilities: ServerCapabilities; - - /** - * Information about the server. - * - * @since 3.15.0 - */ - serverInfo?: { - /** - * The name of the server as defined by the server. - */ - name: string; - - /** - * The server's version as defined by the server. - */ - version?: string; - }; -} -``` -* error.code: - -
- -```typescript -/** - * Known error codes for an `InitializeErrorCodes`; - */ -export namespace InitializeErrorCodes { - - /** - * 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: - -
- -```typescript -interface InitializeError { - /** - * Indicates whether the client execute the following retry logic: - * (1) show the message provided by the ResponseError to the user - * (2) user selects retry or cancel - * (3) if user selected retry the initialize method is sent again. - */ - retry: boolean; -} -``` - -The server can signal the following capabilities: - -
- -```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 - * TextDocumentSyncKind number. If omitted it defaults to - * `TextDocumentSyncKind.None`. - */ - textDocumentSync?: TextDocumentSyncOptions | TextDocumentSyncKind; - - /** - * Defines how notebook documents are synced. - * - * @since 3.17.0 - */ - notebookDocumentSync?: NotebookDocumentSyncOptions - | NotebookDocumentSyncRegistrationOptions; - - /** - * The server provides completion support. - */ - completionProvider?: CompletionOptions; - - /** - * The server provides hover support. - */ - hoverProvider?: boolean | HoverOptions; - - /** - * The server provides signature help support. - */ - signatureHelpProvider?: SignatureHelpOptions; - - /** - * The server provides go to declaration support. - * - * @since 3.14.0 - */ - declarationProvider?: boolean | DeclarationOptions - | DeclarationRegistrationOptions; - - /** - * The server provides goto definition support. - */ - definitionProvider?: boolean | DefinitionOptions; - - /** - * The server provides goto type definition support. - * - * @since 3.6.0 - */ - typeDefinitionProvider?: boolean | TypeDefinitionOptions - | TypeDefinitionRegistrationOptions; - - /** - * The server provides goto implementation support. - * - * @since 3.6.0 - */ - implementationProvider?: boolean | ImplementationOptions - | ImplementationRegistrationOptions; - - /** - * The server provides find references support. - */ - referencesProvider?: boolean | ReferenceOptions; - - /** - * The server provides document highlight support. - */ - documentHighlightProvider?: boolean | DocumentHighlightOptions; - - /** - * The server provides document symbol support. - */ - documentSymbolProvider?: boolean | DocumentSymbolOptions; - - /** - * The server provides code actions. The `CodeActionOptions` return type is - * only valid if the client signals code action literal support via the - * property `textDocument.codeAction.codeActionLiteralSupport`. - */ - codeActionProvider?: boolean | CodeActionOptions; - - /** - * The server provides code lens. - */ - codeLensProvider?: CodeLensOptions; - - /** - * The server provides document link support. - */ - documentLinkProvider?: DocumentLinkOptions; - - /** - * The server provides color provider support. - * - * @since 3.6.0 - */ - colorProvider?: boolean | DocumentColorOptions - | DocumentColorRegistrationOptions; - - /** - * The server provides document formatting. - */ - documentFormattingProvider?: boolean | DocumentFormattingOptions; - - /** - * The server provides document range formatting. - */ - documentRangeFormattingProvider?: boolean | DocumentRangeFormattingOptions; - - /** - * The server provides document formatting on typing. - */ - documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions; - - /** - * The server provides rename support. RenameOptions may only be - * specified if the client states that it supports - * `prepareSupport` in its initial `initialize` request. - */ - renameProvider?: boolean | RenameOptions; - - /** - * The server provides folding provider support. - * - * @since 3.10.0 - */ - foldingRangeProvider?: boolean | FoldingRangeOptions - | FoldingRangeRegistrationOptions; - - /** - * The server provides execute command support. - */ - executeCommandProvider?: ExecuteCommandOptions; - - /** - * The server provides selection range support. - * - * @since 3.15.0 - */ - selectionRangeProvider?: boolean | SelectionRangeOptions - | SelectionRangeRegistrationOptions; - - /** - * The server provides linked editing range support. - * - * @since 3.16.0 - */ - linkedEditingRangeProvider?: boolean | LinkedEditingRangeOptions - | LinkedEditingRangeRegistrationOptions; - - /** - * The server provides call hierarchy support. - * - * @since 3.16.0 - */ - callHierarchyProvider?: boolean | CallHierarchyOptions - | CallHierarchyRegistrationOptions; - - /** - * The server provides semantic tokens support. - * - * @since 3.16.0 - */ - semanticTokensProvider?: SemanticTokensOptions - | SemanticTokensRegistrationOptions; - - /** - * Whether server provides moniker support. - * - * @since 3.16.0 - */ - 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; - - /** - * Workspace specific server capabilities - */ - workspace?: { - /** - * The server supports workspace folder. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFoldersServerCapabilities; - - /** - * The server is interested in file notifications/requests. - * - * @since 3.16.0 - */ - fileOperations?: { - /** - * The server is interested in receiving didCreateFiles - * notifications. - */ - didCreate?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willCreateFiles requests. - */ - willCreate?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving didRenameFiles - * notifications. - */ - didRename?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willRenameFiles requests. - */ - willRename?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving didDeleteFiles file - * notifications. - */ - didDelete?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willDeleteFiles file - * requests. - */ - willDelete?: FileOperationRegistrationOptions; - }; - }; - - /** - * Experimental server capabilities. - */ - experimental?: LSPAny; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/general/initialized.md b/language-server-protocol/_specifications/lsp/3.17/general/initialized.md deleted file mode 100644 index f6da6e54e..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/general/initialized.md +++ /dev/null @@ -1,12 +0,0 @@ -#### Initialized Notification (:arrow_right:) - -The initialized notification is sent from the client to the server after the client received the result of the `initialize` request but before the client is sending any other request or notification to the server. The server can use the `initialized` notification for example to dynamically register capabilities. The `initialized` notification may only be sent once. - -_Notification_: -* method: 'initialized' -* params: `InitializedParams` defined as follows: - -```typescript -interface InitializedParams { -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/general/logTrace.md b/language-server-protocol/_specifications/lsp/3.17/general/logTrace.md deleted file mode 100644 index 6c04a7b76..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/general/logTrace.md +++ /dev/null @@ -1,27 +0,0 @@ -#### LogTrace Notification (:arrow_left:) - -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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/general/setTrace.md b/language-server-protocol/_specifications/lsp/3.17/general/setTrace.md deleted file mode 100644 index 1c9b0f088..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/general/setTrace.md +++ /dev/null @@ -1,16 +0,0 @@ -#### SetTrace Notification (:arrow_right:) - -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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/general/shutdown.md b/language-server-protocol/_specifications/lsp/3.17/general/shutdown.md deleted file mode 100644 index 4055ac8de..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/general/shutdown.md +++ /dev/null @@ -1,13 +0,0 @@ -#### Shutdown Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/callHierarchy.md b/language-server-protocol/_specifications/lsp/3.17/language/callHierarchy.md deleted file mode 100644 index 4486ea14d..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/callHierarchy.md +++ /dev/null @@ -1,209 +0,0 @@ -#### Prepare Call Hierarchy Request (:leftwards_arrow_with_hook:) - -> *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 - -#### Call Hierarchy Incoming Calls (:leftwards_arrow_with_hook:) - -> *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 - -#### Call Hierarchy Outgoing Calls (:leftwards_arrow_with_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/lsp/3.17/language/codeAction.md b/language-server-protocol/_specifications/lsp/3.17/language/codeAction.md deleted file mode 100644 index 7fe27736c..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/codeAction.md +++ /dev/null @@ -1,459 +0,0 @@ -#### Code Action Request (:leftwards_arrow_with_hook:) - -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. - -*Since version 3.16.0:* a client can offer a server to delay the computation of code action properties during a 'textDocument/codeAction' request: - -This is useful for cases where it is expensive to compute the value of a property (for example the `edit` property). Clients signal this through the `codeAction.resolveSupport` capability which lists all properties a client can resolve lazily. The server capability `codeActionProvider.resolveProvider` signals that a server will offer a `codeAction/resolve` route. To help servers to uniquely identify a code action in the resolve request, a code action literal can optional carry a data property. This is also guarded by an additional client capability `codeAction.dataSupport`. In general, a client should offer data support if it offers resolve support. It should also be noted that servers shouldn't alter existing attributes of a code action in a codeAction/resolve request. - -> *Since version 3.8.0:* support for CodeAction literals to enable the following scenarios: - -- the ability to directly return a workspace edit from the code action request. This avoids having another server roundtrip to execute an actual code action. However server providers should be aware that if the code action is expensive to compute or the edits are huge it might still be beneficial if the result is simply a command and the actual edit is only computed when needed. -- the ability to group code actions using a kind. Clients are allowed to ignore that information. However it allows them to better group code action for example into corresponding menus (e.g. all refactor code actions into a refactor menu). - -Clients need to announce their support for code action literals (e.g. literals of type `CodeAction`) and code action kinds via the corresponding client capability `codeAction.codeActionLiteralSupport`. - -_Client Capability_: -* property name (optional): `textDocument.codeAction` -* property type: `CodeActionClientCapabilities` defined as follows: - -
- -```typescript -export interface CodeActionClientCapabilities { - /** - * Whether code action supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports code action literals as a valid - * response of the `textDocument/codeAction` request. - * - * @since 3.8.0 - */ - codeActionLiteralSupport?: { - /** - * The code action kind is supported with the following value - * set. - */ - codeActionKind: { - - /** - * The code action kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - */ - valueSet: CodeActionKind[]; - }; - }; - - /** - * Whether code action supports the `isPreferred` property. - * - * @since 3.15.0 - */ - isPreferredSupport?: boolean; - - /** - * Whether code action supports the `disabled` property. - * - * @since 3.16.0 - */ - disabledSupport?: boolean; - - /** - * Whether code action supports the `data` property which is - * preserved between a `textDocument/codeAction` and a - * `codeAction/resolve` request. - * - * @since 3.16.0 - */ - dataSupport?: boolean; - - - /** - * Whether the client supports resolving additional code action - * properties via a separate `codeAction/resolve` request. - * - * @since 3.16.0 - */ - resolveSupport?: { - /** - * The properties that a client can resolve lazily. - */ - properties: string[]; - }; - - /** - * Whether the client honors the change annotations in - * text edits and resource operations returned via the - * `CodeAction#edit` property by for example presenting - * the workspace edit in the user interface and asking - * for confirmation. - * - * @since 3.16.0 - */ - honorsChangeAnnotations?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `codeActionProvider` -* property type: `boolean | CodeActionOptions` where `CodeActionOptions` is defined as follows: - -
- -```typescript -export interface CodeActionOptions extends WorkDoneProgressOptions { - /** - * CodeActionKinds that this server may return. - * - * The list of kinds may be generic, such as `CodeActionKind.Refactor`, - * or the server may list out every specific kind they provide. - */ - codeActionKinds?: CodeActionKind[]; - - /** - * The server provides support to resolve additional - * information for a code action. - * - * @since 3.16.0 - */ - resolveProvider?: boolean; -} -``` - -_Registration Options_: `CodeActionRegistrationOptions` defined as follows: - -
- -```typescript -export interface CodeActionRegistrationOptions extends - TextDocumentRegistrationOptions, CodeActionOptions { -} -``` - -_Request_: -* method: `textDocument/codeAction` -* params: `CodeActionParams` defined as follows: - -
- -```typescript -/** - * Params for the CodeActionRequest - */ -export interface CodeActionParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The document in which the command was invoked. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range for which the command was invoked. - */ - range: Range; - - /** - * Context carrying additional information. - */ - context: CodeActionContext; -} -``` - -
- -```typescript -/** - * The kind of a code action. - * - * Kinds are a hierarchical list of identifiers separated by `.`, - * e.g. `"refactor.extract.function"`. - * - * The set of kinds is open and client needs to announce the kinds it supports - * to the server during initialization. - */ -export type CodeActionKind = string; - -/** - * A set of predefined code action kinds. - */ -export namespace CodeActionKind { - - /** - * Empty kind. - */ - export const Empty: CodeActionKind = ''; - - /** - * Base kind for quickfix actions: 'quickfix'. - */ - export const QuickFix: CodeActionKind = 'quickfix'; - - /** - * Base kind for refactoring actions: 'refactor'. - */ - export const Refactor: CodeActionKind = 'refactor'; - - /** - * Base kind for refactoring extraction actions: 'refactor.extract'. - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - export const RefactorExtract: CodeActionKind = 'refactor.extract'; - - /** - * Base kind for refactoring inline actions: 'refactor.inline'. - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - export const RefactorInline: CodeActionKind = 'refactor.inline'; - - /** - * Base kind for refactoring rewrite actions: 'refactor.rewrite'. - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - Move method to base class - * - ... - */ - export const RefactorRewrite: CodeActionKind = 'refactor.rewrite'; - - /** - * Base kind for source actions: `source`. - * - * Source code actions apply to the entire file. - */ - export const Source: CodeActionKind = 'source'; - - /** - * Base kind for an organize imports source action: - * `source.organizeImports`. - */ - 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'; -} -``` - -
- -```typescript -/** - * Contains additional diagnostic information about the context in which - * a code action is run. - */ -export interface CodeActionContext { - /** - * An array of diagnostics known on the client side overlapping the range - * provided to the `textDocument/codeAction` request. They are provided so - * that the server knows which errors are currently presented to the user - * for the given range. There is no guarantee that these accurately reflect - * the error state of the resource. The primary parameter - * to compute code actions is the provided range. - */ - diagnostics: Diagnostic[]; - - /** - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out by the client before being - * shown. So servers can omit computing them. - */ - only?: CodeActionKind[]; - - /** - * The reason why code actions were requested. - * - * @since 3.17.0 - */ - triggerKind?: CodeActionTriggerKind; -} -``` - -
- -```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: - -
- -```typescript -/** - * A code action represents a change that can be performed in code, e.g. to fix - * a problem or to refactor code. - * - * A CodeAction must set either `edit` and/or a `command`. If both are supplied, - * the `edit` is applied first, then the `command` is executed. - */ -export interface CodeAction { - - /** - * A short, human-readable, title for this code action. - */ - title: string; - - /** - * The kind of the code action. - * - * Used to filter code actions. - */ - kind?: CodeActionKind; - - /** - * The diagnostics that this code action resolves. - */ - diagnostics?: Diagnostic[]; - - /** - * Marks this as a preferred action. Preferred actions are used by the - * `auto fix` command and can be targeted by keybindings. - * - * A quick fix should be marked preferred if it properly addresses the - * underlying error. A refactoring should be marked preferred if it is the - * most reasonable choice of actions to take. - * - * @since 3.15.0 - */ - isPreferred?: boolean; - - /** - * Marks that the code action cannot currently be applied. - * - * Clients should follow the following guidelines regarding disabled code - * actions: - * - * - Disabled code actions are not shown in automatic lightbulbs code - * action menus. - * - * - Disabled actions are shown as faded out in the code action menu when - * the user request a more specific type of code action, such as - * refactorings. - * - * - If the user has a keybinding that auto applies a code action and only - * a disabled code actions are returned, the client should show the user - * an error message with `reason` in the editor. - * - * @since 3.16.0 - */ - disabled?: { - - /** - * Human readable description of why the code action is currently - * disabled. - * - * This is displayed in the code actions UI. - */ - reason: string; - }; - - /** - * The workspace edit this code action performs. - */ - edit?: WorkspaceEdit; - - /** - * A command this code action executes. If a code action - * provides an edit and a command, first the edit is - * executed and then the command. - */ - command?: Command; - - /** - * A data entry field that is preserved on a code action between - * a `textDocument/codeAction` and a `codeAction/resolve` request. - * - * @since 3.16.0 - */ - data?: LSPAny; -} -``` -* partial result: `(Command | CodeAction)[]` -* error: code and message set in case an exception happens during the code action request. - -#### Code Action Resolve Request (:leftwards_arrow_with_hook:) - -> *Since version 3.16.0* - -The request is sent from the client to the server to resolve additional information for a given code action. This is usually used to compute -the `edit` property of a code action to avoid its unnecessary computation during the `textDocument/codeAction` request. - -Consider the clients announces the `edit` property as a property that can be resolved lazy using the client capability - -```typescript -textDocument.codeAction.resolveSupport = { properties: ['edit'] }; -``` - -then a code action - -```typescript -{ - "title": "Do Foo" -} -``` - -needs to be resolved using the `codeAction/resolve` request before it can be applied. - -_Client Capability_: -* property name (optional): `textDocument.codeAction.resolveSupport` -* property type: `{ properties: string[]; }` - -_Request_: -* method: `codeAction/resolve` -* params: `CodeAction` - -_Response_: -* result: `CodeAction` -* error: code and message set in case an exception happens during the code action resolve request. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/codeLens.md b/language-server-protocol/_specifications/lsp/3.17/language/codeLens.md deleted file mode 100644 index 3d8c9d232..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/codeLens.md +++ /dev/null @@ -1,144 +0,0 @@ -#### Code Lens Request (:leftwards_arrow_with_hook:) - -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?: LSPAny; -} -``` -* partial result: `CodeLens[]` -* error: code and message set in case an exception happens during the code lens request. - -#### Code Lens Resolve Request (:leftwards_arrow_with_hook:) - -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. - -#### Code Lens Refresh Request (:arrow_right_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/lsp/3.17/language/colorPresentation.md b/language-server-protocol/_specifications/lsp/3.17/language/colorPresentation.md deleted file mode 100644 index b02ac3503..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/colorPresentation.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Color Presentation Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The color presentation request is sent from the client to the server to obtain a list of presentations for a color value at a given location. Clients can use the result to -- modify a color reference. -- show in a color picker and let users pick one of the presentations - -This request has no special capabilities and registration options since it is send as a resolve request for the `textDocument/documentColor` request. - -_Request_: - -* method: `textDocument/colorPresentation` -* params: `ColorPresentationParams` defined as follows - -
- -```typescript -interface ColorPresentationParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The color information to request presentations for. - */ - color: Color; - - /** - * The range where the color would be inserted. Serves as a context. - */ - range: Range; -} -``` - -_Response_: -* result: `ColorPresentation[]` defined as follows: - -
- -```typescript -interface ColorPresentation { - /** - * The label of this color presentation. It will be shown on the color - * picker header. By default this is also the text that is inserted when - * selecting this color presentation. - */ - label: string; - /** - * An [edit](#TextEdit) which is applied to a document when selecting - * this presentation for the color. When `falsy` the - * [label](#ColorPresentation.label) is used. - */ - textEdit?: TextEdit; - /** - * An optional array of additional [text edits](#TextEdit) that are applied - * when selecting this color presentation. Edits must not overlap with the - * main [edit](#ColorPresentation.textEdit) nor with themselves. - */ - additionalTextEdits?: TextEdit[]; -} -``` - -* partial result: `ColorPresentation[]` -* error: code and message set in case an exception happens during the 'textDocument/colorPresentation' request diff --git a/language-server-protocol/_specifications/lsp/3.17/language/completion.md b/language-server-protocol/_specifications/lsp/3.17/language/completion.md deleted file mode 100644 index 4352c88fc..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/completion.md +++ /dev/null @@ -1,850 +0,0 @@ -#### Completion Request (:leftwards_arrow_with_hook:) - -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: - -
- -```typescript -export interface CompletionClientCapabilities { - /** - * Whether completion supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `CompletionItem` specific - * capabilities. - */ - completionItem?: { - /** - * Client supports snippets as insert text. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are - * linked, that is typing in one will update others too. - */ - snippetSupport?: boolean; - - /** - * Client supports commit characters on a completion item. - */ - commitCharactersSupport?: boolean; - - /** - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client supports the deprecated property on a completion item. - */ - deprecatedSupport?: boolean; - - /** - * Client supports the preselect property on a completion item. - */ - preselectSupport?: boolean; - - /** - * Client supports the tag property on a completion item. Clients - * supporting tags have to handle unknown tags gracefully. Clients - * especially need to preserve unknown tags when sending a completion - * item back to the server in a resolve call. - * - * @since 3.15.0 - */ - tagSupport?: { - /** - * The tags supported by the client. - */ - valueSet: CompletionItemTag[]; - }; - - /** - * Client supports insert replace edit to control different behavior if - * a completion item is inserted in the text or should replace text. - * - * @since 3.16.0 - */ - insertReplaceSupport?: boolean; - - /** - * Indicates which properties a client can resolve lazily on a - * completion item. Before version 3.16.0 only the predefined properties - * `documentation` and `detail` could be resolved lazily. - * - * @since 3.16.0 - */ - resolveSupport?: { - /** - * The properties that a client can resolve lazily. - */ - properties: string[]; - }; - - /** - * The client supports the `insertTextMode` property on - * a completion item to override the whitespace handling mode - * 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?: { - /** - * The completion item 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 completion items kinds from `Text` to `Reference` as defined in - * the initial version of the protocol. - */ - valueSet?: CompletionItemKind[]; - }; - - /** - * The client supports to send additional context information for a - * `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 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[]; - } -} -``` - -_Server Capability_: -* property name (optional): `completionProvider` -* property type: `CompletionOptions` defined as follows: - -
- -```typescript -/** - * Completion options. - */ -export interface CompletionOptions extends WorkDoneProgressOptions { - /** - * The additional characters, beyond the defaults provided by the client (typically - * [a-zA-Z]), that should automatically trigger a completion request. For example - * `.` in JavaScript represents the beginning of an object property or method and is - * thus a good candidate for triggering a completion request. - * - * Most tools trigger a completion request automatically without explicitly - * requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they - * do so when the user starts to type an identifier. For example if the user - * types `c` in a JavaScript file code complete will automatically pop up - * present `console` besides others as a completion item. Characters that - * make up identifiers don't need to be listed here. - */ - triggerCharacters?: string[]; - - /** - * The list of all possible characters that commit a completion. This field - * can be used if clients don't support individual commit characters per - * completion item. See client capability - * `completion.completionItem.commitCharactersSupport`. - * - * If a server provides both `allCommitCharacters` and commit characters on - * an individual completion item the ones on the completion item win. - * - * @since 3.2.0 - */ - allCommitCharacters?: string[]; - - /** - * The server provides support to resolve additional - * 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: - -
- -```typescript -export interface CompletionRegistrationOptions - extends TextDocumentRegistrationOptions, CompletionOptions { -} -``` - -_Request_: -* method: `textDocument/completion` -* params: `CompletionParams` defined as follows: - -
- -```typescript -export interface CompletionParams extends TextDocumentPositionParams, - WorkDoneProgressParams, PartialResultParams { - /** - * The completion context. This is only available if the client specifies - * to send this using the client capability - * `completion.contextSupport === true` - */ - context?: CompletionContext; -} -``` - -
- -```typescript -/** - * How a completion was triggered - */ -export namespace CompletionTriggerKind { - /** - * Completion was triggered by typing an identifier (24x7 code - * complete), manual invocation (e.g Ctrl+Space) or via API. - */ - export const Invoked: 1 = 1; - - /** - * Completion was triggered by a trigger character specified by - * the `triggerCharacters` properties of the - * `CompletionRegistrationOptions`. - */ - export const TriggerCharacter: 2 = 2; - - /** - * Completion was re-triggered as the current completion list is incomplete. - */ - export const TriggerForIncompleteCompletions: 3 = 3; -} -export type CompletionTriggerKind = 1 | 2 | 3; -``` - -
- -```typescript -/** - * Contains additional information about the context in which a completion - * request is triggered. - */ -export interface CompletionContext { - /** - * How the completion was triggered. - */ - triggerKind: CompletionTriggerKind; - - /** - * The trigger character (a single character) that has trigger code - * complete. Is undefined if - * `triggerKind !== CompletionTriggerKind.TriggerCharacter` - */ - triggerCharacter?: string; -} -``` - -_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 }` - -
- -```typescript -/** - * Represents a collection of [completion items](#CompletionItem) to be - * presented in the editor. - */ -export interface CompletionList { - /** - * This list is not complete. Further typing should result in recomputing - * this list. - * - * Recomputed lists have all their items replaced (not appended) in the - * incomplete completion sessions. - */ - 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; - - /** - * A default data value. - * - * @since 3.17.0 - */ - data?: LSPAny; - } - - /** - * The completion items. - */ - items: CompletionItem[]; -} -``` - -
- -```typescript -/** - * Defines whether the insert text in a completion item should be interpreted as - * plain text or a snippet. - */ -export namespace InsertTextFormat { - /** - * The primary text to be inserted is treated as a plain string. - */ - export const PlainText = 1; - - /** - * The primary text to be inserted is treated as a snippet. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - */ - export const Snippet = 2; -} - -export type InsertTextFormat = 1 | 2; -``` - -
- -```typescript -/** - * Completion item tags are extra annotations that tweak the rendering of a - * completion item. - * - * @since 3.15.0 - */ -export namespace CompletionItemTag { - /** - * Render a completion as obsolete, usually using a strike-out. - */ - export const Deprecated = 1; -} - -export type CompletionItemTag = 1; -``` - -
- -```typescript -/** - * A special text edit to provide an insert and a replace operation. - * - * @since 3.16.0 - */ -export interface InsertReplaceEdit { - /** - * The string to be inserted. - */ - newText: string; - - /** - * The range if the insert is requested - */ - insert: Range; - - /** - * The range if the replace is requested. - */ - replace: Range; -} -``` - -
- -```typescript -/** - * How whitespace and indentation is handled during completion - * item insertion. - * - * @since 3.16.0 - */ -export namespace InsertTextMode { - /** - * The insertion or replace strings is taken as it is. If the - * value is multi line the lines below the cursor will be - * inserted using the indentation defined in the string value. - * The client will not apply any kind of adjustments to the - * string. - */ - export const asIs: 1 = 1; - - /** - * The editor adjusts leading whitespace of new lines so that - * they match the indentation up to the cursor of the line for - * which the item is accepted. - * - * Consider a line like this: <2tabs><3tabs>foo. Accepting a - * multi line completion item is indented using 2 tabs and all - * following lines inserted will be indented using 2 tabs as well. - */ - export const adjustIndentation: 2 = 2; -} - -export type InsertTextMode = 1 | 2; -``` - -
- -```typescript -/** - * Additional details for a completion item label. - * - * @since 3.17.0 - */ -export interface CompletionItemLabelDetails { - - /** - * 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; -} -``` - -
- -```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`. - */ - kind?: CompletionItemKind; - - /** - * Tags for this completion item. - * - * @since 3.15.0 - */ - tags?: CompletionItemTag[]; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - detail?: string; - - /** - * A human-readable string that represents a doc-comment. - */ - documentation?: string | MarkupContent; - - /** - * Indicates if this item is deprecated. - * - * @deprecated Use `tags` instead if supported. - */ - deprecated?: boolean; - - /** - * Select this item when showing. - * - * *Note* that only one completion item can be selected and that the - * tool / client decides which item that is. The rule is that the *first* - * item of those that match best is selected. - */ - preselect?: boolean; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the label is used - * as the sort text for this item. - */ - sortText?: string; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the label is used as the - * filter text for this item. - */ - filterText?: string; - - /** - * A string that should be inserted into a document when selecting - * this completion. When `falsy` the label is used as the insert text - * for this item. - * - * The `insertText` is subject to interpretation by the client side. - * Some tools might not take the string literally. For example - * VS Code when code complete is requested in this example - * `con` and a completion item with an `insertText` of - * `console` is provided it will only insert `sole`. Therefore it is - * recommended to use `textEdit` instead since it avoids additional client - * side interpretation. - */ - insertText?: string; - - /** - * 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 depends on - * the `textDocument.completion.insertTextMode` client capability. - * - * @since 3.16.0 - * @since 3.17.0 - support for `textDocument.completion.insertTextMode` - */ - insertTextMode?: InsertTextMode; - - /** - * An edit which is applied to a document when selecting this completion. - * When an edit is provided the value of `insertText` is ignored. - * - * *Note:* The range of the edit must be a single line range and it must - * contain the position at which completion has been requested. - * - * Most editors support two different operations when accepting a completion - * item. One is to insert a completion text and the other is to replace an - * 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.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 which completion has been requested. - * *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range - * must be a prefix of the edit's replace range, that means it must be - * contained and starting at the same position. - * - * @since 3.16.0 additional type `InsertReplaceEdit` - */ - 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. - * - * Additional text edits should be used to change text unrelated to the - * current cursor position (for example adding an import statement at the - * top of the file if the completion item will insert an unqualified type). - */ - additionalTextEdits?: TextEdit[]; - - /** - * An optional set of characters that when pressed while this completion is - * active will accept it first and then type that character. *Note* that all - * commit characters should have `length=1` and that superfluous characters - * will be ignored. - */ - commitCharacters?: string[]; - - /** - * An optional command that is executed *after* inserting this completion. - * *Note* that additional modifications to the current document should be - * described with the additionalTextEdits-property. - */ - command?: Command; - - /** - * A data entry field that is preserved on a completion item between - * a completion and a completion resolve request. - */ - data?: LSPAny; -} -``` - -
- -```typescript -/** - * The kind of a completion entry. - */ -export namespace CompletionItemKind { - export const Text = 1; - export const Method = 2; - export const Function = 3; - export const Constructor = 4; - export const Field = 5; - export const Variable = 6; - export const Class = 7; - export const Interface = 8; - export const Module = 9; - export const Property = 10; - export const Unit = 11; - export const Value = 12; - export const Enum = 13; - export const Keyword = 14; - export const Snippet = 15; - export const Color = 16; - export const File = 17; - export const Reference = 18; - export const Folder = 19; - export const EnumMember = 20; - export const Constant = 21; - export const Struct = 22; - export const Event = 23; - export const Operator = 24; - export const TypeParameter = 25; -} - -export type CompletionItemKind = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25; -``` -* partial result: `CompletionItem[]` or `CompletionList` followed by `CompletionItem[]`. If the first provided result item is of type `CompletionList` subsequent partial results of `CompletionItem[]` add to the `items` property of the `CompletionList`. -* error: code and message set in case an exception happens during the completion request. - -Completion items support snippets (see `InsertTextFormat.Snippet`). The snippet format is as follows: - -##### Snippet Syntax - -The `body` of a snippet can use special constructs to control cursors and the text being inserted. The following are supported features and their syntaxes: - -##### Tab stops - -With tab stops, you can make the editor cursor move inside a snippet. Use `$1`, `$2` to specify cursor locations. The number is the order in which tab stops will be visited, whereas `$0` denotes the final cursor position. Multiple tab stops are linked and updated in sync. - -##### Placeholders - -Placeholders are tab stops with values, like `${1:foo}`. The placeholder text will be inserted and selected such that it can be easily changed. Placeholders can be nested, like `${1:another ${2:placeholder}}`. - -##### Choice - -Placeholders can have choices as values. The syntax is a comma separated enumeration of values, enclosed with the pipe-character, for example `${1|one,two,three|}`. When the snippet is inserted and the placeholder selected, choices will prompt the user to pick one of the values. - -##### Variables - -With `$name` or `${name:default}` you can insert the value of a variable. When a variable isn’t set, its *default* or the empty string is inserted. When a variable is unknown (that is, its name isn’t defined) the name of the variable is inserted and it is transformed into a placeholder. - -The following variables can be used: - -* `TM_SELECTED_TEXT` The currently selected text or the empty string -* `TM_CURRENT_LINE` The contents of the current line -* `TM_CURRENT_WORD` The contents of the word under cursor or the empty string -* `TM_LINE_INDEX` The zero-index based line number -* `TM_LINE_NUMBER` The one-index based line number -* `TM_FILENAME` The filename of the current document -* `TM_FILENAME_BASE` The filename of the current document without its extensions -* `TM_DIRECTORY` The directory of the current document -* `TM_FILEPATH` The full file path of the current document - -##### Variable Transforms - -Transformations allow you to modify the value of a variable before it is inserted. The definition of a transformation consists of three parts: - -1. A [regular expression](#regExp) that is matched against the value of a variable, or the empty string when the variable cannot be resolved. -2. A "format string" that allows to reference matching groups from the regular expression. The format string allows for conditional inserts and simple modifications. -3. Options that are passed to the regular expression. - -The following example inserts the name of the current file without its ending, so from `foo.txt` it makes `foo`. - -``` -${TM_FILENAME/(.*)\..+$/$1/} - | | | | - | | | |-> no options - | | | - | | |-> references the contents of the first - | | capture group - | | - | |-> regex to capture everything before - | the final `.suffix` - | - |-> resolves to the filename -``` - -##### Grammar - -Below is the EBNF ([extended Backus-Naur form](https://en.wikipedia.org/wiki/Extended_Backus-Naur_form)) for snippets. With `\` (backslash), you can escape `$`, `}` and `\`. Within choice elements, the backslash also escapes comma and pipe characters. - -``` -any ::= tabstop | placeholder | choice | variable | text -tabstop ::= '$' int | '${' int '}' -placeholder ::= '${' int ':' any '}' -choice ::= '${' int '|' text (',' text)* '|}' -variable ::= '$' var | '${' var }' - | '${' var ':' any '}' - | '${' var '/' regex '/' (format | text)+ '/' options '}' -format ::= '$' int | '${' int '}' - | '${' int ':' '/upcase' | '/downcase' | '/capitalize' '}' - | '${' int ':+' if '}' - | '${' int ':?' if ':' else '}' - | '${' int ':-' else '}' | '${' int ':' else '}' -regex ::= Regular Expression value (ctor-string) -options ::= Regular Expression option (ctor-options) -var ::= [_a-zA-Z] [_a-zA-Z0-9]* -int ::= [0-9]+ -text ::= .* -if ::= text -else ::= text -``` - -#### Completion Item Resolve Request (:leftwards_arrow_with_hook:) - -The request is sent from the client to the server to resolve additional information for a given completion item. - -_Request_: -* method: `completionItem/resolve` -* params: `CompletionItem` - -_Response_: -* result: `CompletionItem` -* error: code and message set in case an exception happens during the completion resolve request. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/declaration.md b/language-server-protocol/_specifications/lsp/3.17/language/declaration.md deleted file mode 100644 index 8cef5fbe3..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/declaration.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Goto Declaration Request (:leftwards_arrow_with_hook:) - -> *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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/definition.md b/language-server-protocol/_specifications/lsp/3.17/language/definition.md deleted file mode 100644 index bf9693bf9..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/definition.md +++ /dev/null @@ -1,65 +0,0 @@ -#### Goto Definition Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/documentColor.md b/language-server-protocol/_specifications/lsp/3.17/language/documentColor.md deleted file mode 100644 index eaa00d97c..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/documentColor.md +++ /dev/null @@ -1,114 +0,0 @@ -#### Document Color Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The document color request is sent from the client to the server to list all color references found in a given text document. Along with the range, a color value in RGB is returned. - -Clients can use the result to decorate color references in an editor. For example: -- Color boxes showing the actual color next to the reference -- Show a color picker when a color reference is edited - -_Client Capability_: -* property name (optional): `textDocument.colorProvider` -* property type: `DocumentColorClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentColorClientCapabilities { - /** - * Whether document color supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `colorProvider` -* property type: `boolean | DocumentColorOptions | DocumentColorRegistrationOptions` where `DocumentColorOptions` is defined as follows: - -
- -```typescript -export interface DocumentColorOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentColorRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentColorRegistrationOptions extends - TextDocumentRegistrationOptions, StaticRegistrationOptions, - DocumentColorOptions { -} -``` - -_Request_: - -* method: `textDocument/documentColor` -* params: `DocumentColorParams` defined as follows - -
- -```typescript -interface DocumentColorParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: -* result: `ColorInformation[]` defined as follows: - -
- -```typescript -interface ColorInformation { - /** - * The range in the document where this color appears. - */ - range: Range; - - /** - * The actual color value for this color range. - */ - color: Color; -} -``` - -
- -```typescript -/** - * Represents a color in RGBA space. - */ -interface Color { - - /** - * The red component of this color in the range [0-1]. - */ - readonly red: decimal; - - /** - * The green component of this color in the range [0-1]. - */ - readonly green: decimal; - - /** - * The blue component of this color in the range [0-1]. - */ - readonly blue: decimal; - - /** - * The alpha component of this color in the range [0-1]. - */ - readonly alpha: decimal; -} -``` -* partial result: `ColorInformation[]` -* error: code and message set in case an exception happens during the 'textDocument/documentColor' request diff --git a/language-server-protocol/_specifications/lsp/3.17/language/documentHighlight.md b/language-server-protocol/_specifications/lsp/3.17/language/documentHighlight.md deleted file mode 100644 index a27e99f2a..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/documentHighlight.md +++ /dev/null @@ -1,108 +0,0 @@ -#### Document Highlights Request (:leftwards_arrow_with_hook:) - -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; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/documentLink.md b/language-server-protocol/_specifications/lsp/3.17/language/documentLink.md deleted file mode 100644 index 8ed5b4bc6..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/documentLink.md +++ /dev/null @@ -1,121 +0,0 @@ -#### Document Link Request (:leftwards_arrow_with_hook:) - -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?: URI; - - /** - * 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. - -#### Document Link Resolve Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/documentSymbol.md b/language-server-protocol/_specifications/lsp/3.17/language/documentSymbol.md deleted file mode 100644 index 5e28907c3..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/documentSymbol.md +++ /dev/null @@ -1,295 +0,0 @@ -#### Document Symbols Request (:leftwards_arrow_with_hook:) - -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; -} - -export type SymbolKind = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26; -``` - -
- -```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; -``` - -
- -```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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/foldingRange.md b/language-server-protocol/_specifications/lsp/3.17/language/foldingRange.md deleted file mode 100644 index 7d2d754f2..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/foldingRange.md +++ /dev/null @@ -1,195 +0,0 @@ -#### Folding Range Request (:leftwards_arrow_with_hook:) - -> *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; - - /** - * 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: - -
- -```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 -/** - * 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; -``` - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.17/language/formatting.md b/language-server-protocol/_specifications/lsp/3.17/language/formatting.md deleted file mode 100644 index 26ef83018..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/formatting.md +++ /dev/null @@ -1,108 +0,0 @@ -#### Document Formatting Request (:leftwards_arrow_with_hook:) - -The document formatting request is sent from the client to the server to format a whole document. - -_Client Capability_: -* property name (optional): `textDocument.formatting` -* property type: `DocumentFormattingClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentFormattingProvider` -* property type: `boolean | DocumentFormattingOptions` where `DocumentFormattingOptions` is defined as follows: - -
- -```typescript -export interface DocumentFormattingOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentFormattingOptions { -} -``` - -_Request_: -* method: `textDocument/formatting` -* params: `DocumentFormattingParams` defined as follows - -
- -```typescript -interface DocumentFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The format options. - */ - options: FormattingOptions; -} -``` - -
- -```typescript -/** - * Value-object describing what options formatting should use. - */ -interface FormattingOptions { - /** - * Size of a tab in spaces. - */ - tabSize: uinteger; - - /** - * Prefer spaces over tabs. - */ - insertSpaces: boolean; - - /** - * Trim trailing whitespace on a line. - * - * @since 3.15.0 - */ - trimTrailingWhitespace?: boolean; - - /** - * Insert a newline character at the end of the file if one does not exist. - * - * @since 3.15.0 - */ - insertFinalNewline?: boolean; - - /** - * Trim all newlines after the final newline at the end of the file. - * - * @since 3.15.0 - */ - trimFinalNewlines?: boolean; - - /** - * Signature for further properties. - */ - [key: string]: boolean | integer | string; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the formatting request. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/hover.md b/language-server-protocol/_specifications/lsp/3.17/language/hover.md deleted file mode 100644 index 51634bdb1..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/hover.md +++ /dev/null @@ -1,107 +0,0 @@ -#### Hover Request (:leftwards_arrow_with_hook:) - -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: - -
- -```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: - -
- -```typescript -export interface HoverOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `HoverRegistrationOptions` defined as follows: - -
- -```typescript -export interface HoverRegistrationOptions - extends TextDocumentRegistrationOptions, HoverOptions { -} -``` - -_Request_: -* method: `textDocument/hover` -* params: `HoverParams` defined as follows: - -
- -```typescript -export interface HoverParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: -* result: `Hover` \| `null` defined as follows: - -
- -```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: - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/implementation.md b/language-server-protocol/_specifications/lsp/3.17/language/implementation.md deleted file mode 100644 index 505e2af7b..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/implementation.md +++ /dev/null @@ -1,70 +0,0 @@ -#### Goto Implementation Request (:leftwards_arrow_with_hook:) - -> *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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/inlayHint.md b/language-server-protocol/_specifications/lsp/3.17/language/inlayHint.md deleted file mode 100644 index 739b7a9c4..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/inlayHint.md +++ /dev/null @@ -1,321 +0,0 @@ -#### Inlay Hint Request (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```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: - -
- -```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: - -
- -```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: - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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; -} - -export type InlayHintKind = 1 | 2; -``` - -* error: code and message set in case an exception happens during the inlay hint request. - -#### Inlay Hint Resolve Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Inlay Hint Refresh Request (:arrow_right_hook:) - -> *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: - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.17/language/inlineValue.md b/language-server-protocol/_specifications/lsp/3.17/language/inlineValue.md deleted file mode 100644 index f96761307..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/inlineValue.md +++ /dev/null @@ -1,252 +0,0 @@ -#### Inline Value Request (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```typescript -/** - * Inline value options used during static registration. - * - * @since 3.17.0 - */ -export interface InlineValueOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `InlineValueRegistrationOptions` defined as follows: - -
- -```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: - -
- -```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; -} -``` - -
- -```typescript -/** - * @since 3.17.0 - */ -export interface InlineValueContext { - /** - * The stack frame (as a DAP Id) where the execution has stopped. - */ - frameId: integer; - - /** - * The document range where execution has stopped. - * Typically the end position of the range denotes the line where the - * inline values are shown. - */ - stoppedLocation: Range; -} -``` - -_Response_: -* result: `InlineValue[]` \| `null` defined as follows: - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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. - -#### Inline Value Refresh Request (:arrow_right_hook:) - -> *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: - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.17/language/linkedEditingRange.md b/language-server-protocol/_specifications/lsp/3.17/language/linkedEditingRange.md deleted file mode 100644 index 14c71e7d5..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/linkedEditingRange.md +++ /dev/null @@ -1,85 +0,0 @@ -#### Linked Editing Range(:leftwards_arrow_with_hook:) - -> *Since version 3.16.0* - -The linked editing request is sent from the client to the server to return for a given position in a document the range of the symbol at the position and all ranges that have the same content. Optionally a word pattern can be returned to describe valid contents. A rename to one of the ranges can be applied to all other ranges if the new content is valid. If no result-specific word pattern is provided, the word pattern from the client's language configuration is used. - -_Client Capabilities_: - -* property name (optional): `textDocument.linkedEditingRange` -* property type: `LinkedEditingRangeClientCapabilities` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeClientCapabilities { - /** - * Whether the 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): `linkedEditingRangeProvider` -* property type: `boolean` \| `LinkedEditingRangeOptions` \| `LinkedEditingRangeRegistrationOptions` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `LinkedEditingRangeRegistrationOptions` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeRegistrationOptions extends - TextDocumentRegistrationOptions, LinkedEditingRangeOptions, - StaticRegistrationOptions { -} -``` - -_Request_: - -* method: `textDocument/linkedEditingRange` -* params: `LinkedEditingRangeParams` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: - -* result: `LinkedEditingRanges` \| `null` defined as follows: - -
- -```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. - */ - 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. - */ - wordPattern?: string; -} -``` -* error: code and message set in case an exception happens during the 'textDocument/linkedEditingRange' request diff --git a/language-server-protocol/_specifications/lsp/3.17/language/moniker.md b/language-server-protocol/_specifications/lsp/3.17/language/moniker.md deleted file mode 100644 index ff8af24ff..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/moniker.md +++ /dev/null @@ -1,162 +0,0 @@ -#### Monikers (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```typescript -export interface MonikerOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `MonikerRegistrationOptions` defined as follows: - -
- -```typescript -export interface MonikerRegistrationOptions extends - TextDocumentRegistrationOptions, MonikerOptions { -} -``` - -_Request_: - -* method: `textDocument/moniker` -* params: `MonikerParams` defined as follows: - -
- -```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: - -
- -```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' -} -``` - -
- -```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' -} -``` - -
- -```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. \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/language/onTypeFormatting.md b/language-server-protocol/_specifications/lsp/3.17/language/onTypeFormatting.md deleted file mode 100644 index 419a4f4e0..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/onTypeFormatting.md +++ /dev/null @@ -1,88 +0,0 @@ -#### Document on Type Formatting Request (:leftwards_arrow_with_hook:) - -The document on type formatting request is sent from the client to the server to format parts of the document during typing. - -_Client Capability_: -* property name (optional): `textDocument.onTypeFormatting` -* property type: `DocumentOnTypeFormattingClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentOnTypeFormattingClientCapabilities { - /** - * Whether on type formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentOnTypeFormattingProvider` -* property type: `DocumentOnTypeFormattingOptions` defined as follows: - -
- -```typescript -export interface DocumentOnTypeFormattingOptions { - /** - * A character on which formatting should be triggered, like `{`. - */ - firstTriggerCharacter: string; - - /** - * More trigger characters. - */ - moreTriggerCharacter?: string[]; -} -``` - -_Registration Options_: `DocumentOnTypeFormattingRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentOnTypeFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentOnTypeFormattingOptions { -} -``` - -_Request_: -* method: `textDocument/onTypeFormatting` -* params: `DocumentOnTypeFormattingParams` defined as follows: - -
- -```typescript -interface DocumentOnTypeFormattingParams { - - /** - * 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 formatting options. - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document. -* error: code and message set in case an exception happens during the range formatting request. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/publishDiagnostics.md b/language-server-protocol/_specifications/lsp/3.17/language/publishDiagnostics.md deleted file mode 100644 index b491ee75c..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/publishDiagnostics.md +++ /dev/null @@ -1,92 +0,0 @@ -#### PublishDiagnostics Notification (:arrow_left:) - -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.publishDiagnostics` -* property type: `PublishDiagnosticsClientCapabilities` defined as follows: - -
- -```typescript -export interface PublishDiagnosticsClientCapabilities { - /** - * 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: - -
- -```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[]; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/language/pullDiagnostics.md b/language-server-protocol/_specifications/lsp/3.17/language/pullDiagnostics.md deleted file mode 100644 index 85aa52faf..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/pullDiagnostics.md +++ /dev/null @@ -1,502 +0,0 @@ -#### Pull Diagnostics - -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: - -
- -```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; - - /** - * Whether the clients supports related documents for document diagnostic - * pulls. - */ - relatedDocumentSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `diagnosticProvider` -* property type: `DiagnosticOptions` defined as follows: - -
- -```typescript -/** - * 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_: `DiagnosticRegistrationOptions` options defined as follows: - -
- -```typescript -/** - * Diagnostic registration options. - * - * @since 3.17.0 - */ -export interface DiagnosticRegistrationOptions extends - TextDocumentRegistrationOptions, DiagnosticOptions, - StaticRegistrationOptions { -} -``` - -##### Document Diagnostics(:leftwards_arrow_with_hook:) - -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/diagnostic'. -* params: `DocumentDiagnosticParams` defined as follows: - -
- -```typescript -/** - * 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: `DocumentDiagnosticReport` defined as follows: - -
- -```typescript -/** - * 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 type DocumentDiagnosticReport = RelatedFullDocumentDiagnosticReport - | RelatedUnchangedDocumentDiagnosticReport; -``` - -
- -```typescript -/** - * The document diagnostic report kinds. - * - * @since 3.17.0 - */ -export namespace DocumentDiagnosticReportKind { - /** - * A diagnostic report with a full - * set of problems. - */ - export const Full = 'full'; - - /** - * A report indicating that the last - * returned report is still accurate. - */ - export const Unchanged = 'unchanged'; -} - -export type DocumentDiagnosticReportKind = 'full' | 'unchanged'; -``` - -
- -```typescript -/** - * A diagnostic report with a full set of problems. - * - * @since 3.17.0 - */ -export interface FullDocumentDiagnosticReport { - /** - * A full document diagnostic report. - */ - kind: DocumentDiagnosticReportKind.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[]; -} -``` - -
- -```typescript -/** - * A diagnostic report indicating that the last returned - * report is still accurate. - * - * @since 3.17.0 - */ -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: DocumentDiagnosticReportKind.Unchanged; - - /** - * A result id which will be sent on the next - * diagnostic request for the same document. - */ - resultId: string; -} -``` - -
- -```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; - }; -} -``` - -
- -```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: - -
- -```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 }`: - -
- -```typescript -/** - * Cancellation data returned from a diagnostic request. - * - * @since 3.17.0 - */ -export interface DiagnosticServerCancellationData { - retriggerRequest: boolean; -} -``` - -##### Workspace Diagnostics(:leftwards_arrow_with_hook:) - -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: - -
- -```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[]; -} -``` - -
- -```typescript -/** - * A previous result id in a workspace pull request. - * - * @since 3.17.0 - */ -export interface PreviousResultId { - /** - * The URI for which the client knows a - * result id. - */ - uri: DocumentUri; - - /** - * The value of the previous result id. - */ - value: string; -} -``` - -_Response_: -* result: `WorkspaceDiagnosticReport` defined as follows: - -
- -```typescript -/** - * A workspace diagnostic report. - * - * @since 3.17.0 - */ -export interface WorkspaceDiagnosticReport { - items: WorkspaceDocumentDiagnosticReport[]; -} -``` - -
- -```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; -} -``` - -
- -```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; -}; -``` - -
- -```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: - -
- -```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 }`: - -##### Diagnostics Refresh(:arrow_right_hook:) - -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: - -
- - -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/rangeFormatting.md b/language-server-protocol/_specifications/lsp/3.17/language/rangeFormatting.md deleted file mode 100644 index 957f73419..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/rangeFormatting.md +++ /dev/null @@ -1,69 +0,0 @@ -#### Document Range Formatting Request (:leftwards_arrow_with_hook:) - -The document range formatting request is sent from the client to the server to format a given range in a document. - -_Client Capability_: -* property name (optional): `textDocument.rangeFormatting` -* property type: `DocumentRangeFormattingClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentRangeFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentRangeFormattingProvider` -* property type: `boolean | DocumentRangeFormattingOptions` where `DocumentRangeFormattingOptions` is defined as follows: - -
- -```typescript -export interface DocumentRangeFormattingOptions extends - WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentRangeFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentRangeFormattingOptions { -} -``` - -_Request_: -* method: `textDocument/rangeFormatting`, -* params: `DocumentRangeFormattingParams` defined as follows: - -
- -```typescript -interface DocumentRangeFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range to format - */ - range: Range; - - /** - * The format options - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the range formatting request. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/references.md b/language-server-protocol/_specifications/lsp/3.17/language/references.md deleted file mode 100644 index e7d2e0303..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/references.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Find References Request (:leftwards_arrow_with_hook:) - -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; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/rename.md b/language-server-protocol/_specifications/lsp/3.17/language/rename.md deleted file mode 100644 index 644ad6bba..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/rename.md +++ /dev/null @@ -1,132 +0,0 @@ -#### Rename Request (:leftwards_arrow_with_hook:) - -The rename request is sent from the client to the server to ask the server to compute a workspace change so that the client can perform a workspace-wide rename of a symbol. - -_Client Capability_: -* property name (optional): `textDocument.rename` -* property type: `RenameClientCapabilities` defined as follows: - -
- -```typescript -export namespace PrepareSupportDefaultBehavior { - /** - * The client's default behavior is to select the identifier - * according to the language's syntax rule. - */ - export const Identifier: 1 = 1; -} - -export type PrepareSupportDefaultBehavior = 1; -``` - -
- -```typescript -export interface RenameClientCapabilities { - /** - * Whether rename supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * Client supports testing for validity of rename operations - * before execution. - * - * @since version 3.12.0 - */ - prepareSupport?: boolean; - - /** - * Client supports the default behavior result - * (`{ defaultBehavior: boolean }`). - * - * The value indicates the default behavior used by the - * client. - * - * @since version 3.16.0 - */ - prepareSupportDefaultBehavior?: PrepareSupportDefaultBehavior; - - /** - * 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. - * - * @since 3.16.0 - */ - honorsChangeAnnotations?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `renameProvider` -* property type: `boolean | RenameOptions` where `RenameOptions` is defined as follows: - -`RenameOptions` may only be specified if the client states that it supports `prepareSupport` in its initial `initialize` request. - -
- -```typescript -export interface RenameOptions extends WorkDoneProgressOptions { - /** - * Renames should be checked and tested before being executed. - */ - prepareProvider?: boolean; -} -``` - -_Registration Options_: `RenameRegistrationOptions` defined as follows: - -
- -```typescript -export interface RenameRegistrationOptions extends - TextDocumentRegistrationOptions, RenameOptions { -} -``` - -_Request_: -* method: `textDocument/rename` -* params: `RenameParams` defined as follows - -
- -```typescript -interface RenameParams extends TextDocumentPositionParams, - WorkDoneProgressParams { - /** - * The new name of the symbol. If the given name is not valid the - * request must return a [ResponseError](#ResponseError) with an - * appropriate message set. - */ - newName: string; -} -``` - -_Response_: -* 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). - -#### Prepare Rename Request (:leftwards_arrow_with_hook:) - -> *Since version 3.12.0* - -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` -* params: `PrepareRenameParams` defined as follows: - -
- -```typescript -export interface PrepareRenameParams extends TextDocumentPositionParams, WorkDoneProgressParams { -} -``` - -_Response_: -* 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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/selectionRange.md b/language-server-protocol/_specifications/lsp/3.17/language/selectionRange.md deleted file mode 100644 index c85db1695..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/selectionRange.md +++ /dev/null @@ -1,94 +0,0 @@ -#### Selection Range Request (:leftwards_arrow_with_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/lsp/3.17/language/semanticTokens.md b/language-server-protocol/_specifications/lsp/3.17/language/semanticTokens.md deleted file mode 100644 index ef76971bc..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/semanticTokens.md +++ /dev/null @@ -1,533 +0,0 @@ -#### Semantic Tokens (:leftwards_arrow_with_hook:) - -> *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' - /** - * @since 3.17.0 - */ - decorator = 'decorator' -} -``` - -
- -```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). - -
- -```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` - -The `deltaStart` and the `length` values must be encoded using the encoding the client and server agrees on during the `initialize` request (see also [TextDocuments](#textDocuments)). -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; - - /** - * 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: - -
- -```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[]; -} -``` - -
- -```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: - -
- -```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_: - -
- -* 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 diff --git a/language-server-protocol/_specifications/lsp/3.17/language/signatureHelp.md b/language-server-protocol/_specifications/lsp/3.17/language/signatureHelp.md deleted file mode 100644 index e7c390548..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/signatureHelp.md +++ /dev/null @@ -1,300 +0,0 @@ -#### Signature Help Request (:leftwards_arrow_with_hook:) - -The signature help request is sent from the client to the server to request signature information at a given cursor position. - -_Client Capability_: -* property name (optional): `textDocument.signatureHelp` -* property type: `SignatureHelpClientCapabilities` defined as follows: - -
- -```typescript -export interface SignatureHelpClientCapabilities { - /** - * Whether signature help supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `SignatureInformation` - * specific properties. - */ - signatureInformation?: { - /** - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client capabilities specific to parameter information. - */ - parameterInformation?: { - /** - * The client supports processing label offsets instead of a - * simple label string. - * - * @since 3.14.0 - */ - labelOffsetSupport?: boolean; - }; - - /** - * The client supports the `activeParameter` property on - * `SignatureInformation` literal. - * - * @since 3.16.0 - */ - activeParameterSupport?: boolean; - }; - - /** - * The client supports to send additional context information for a - * `textDocument/signatureHelp` request. A client that opts into - * contextSupport will also support the `retriggerCharacters` on - * `SignatureHelpOptions`. - * - * @since 3.15.0 - */ - contextSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `signatureHelpProvider` -* property type: `SignatureHelpOptions` defined as follows: - -
- -```typescript -export interface SignatureHelpOptions extends WorkDoneProgressOptions { - /** - * The characters that trigger signature help - * automatically. - */ - triggerCharacters?: string[]; - - /** - * List of characters that re-trigger signature help. - * - * These trigger characters are only active when signature help is already - * showing. All trigger characters are also counted as re-trigger - * characters. - * - * @since 3.15.0 - */ - retriggerCharacters?: string[]; -} -``` - -_Registration Options_: `SignatureHelpRegistrationOptions` defined as follows: - -
- -```typescript -export interface SignatureHelpRegistrationOptions - extends TextDocumentRegistrationOptions, SignatureHelpOptions { -} -``` - -_Request_: -* method: `textDocument/signatureHelp` -* params: `SignatureHelpParams` defined as follows: - -
- -```typescript -export interface SignatureHelpParams extends TextDocumentPositionParams, - WorkDoneProgressParams { - /** - * The signature help context. This is only available if the client - * specifies to send this using the client capability - * `textDocument.signatureHelp.contextSupport === true` - * - * @since 3.15.0 - */ - context?: SignatureHelpContext; -} -``` - -
- -```typescript -/** - * How a signature help was triggered. - * - * @since 3.15.0 - */ -export namespace SignatureHelpTriggerKind { - /** - * Signature help was invoked manually by the user or by a command. - */ - export const Invoked: 1 = 1; - /** - * Signature help was triggered by a trigger character. - */ - export const TriggerCharacter: 2 = 2; - /** - * Signature help was triggered by the cursor moving or by the document - * content changing. - */ - export const ContentChange: 3 = 3; -} -export type SignatureHelpTriggerKind = 1 | 2 | 3; -``` - -
- -```typescript -/** - * Additional information about the context in which a signature help request - * was triggered. - * - * @since 3.15.0 - */ -export interface SignatureHelpContext { - /** - * Action that caused signature help to be triggered. - */ - triggerKind: SignatureHelpTriggerKind; - - /** - * Character that caused signature help to be triggered. - * - * This is undefined when triggerKind !== - * SignatureHelpTriggerKind.TriggerCharacter - */ - triggerCharacter?: string; - - /** - * `true` if signature help was already showing when it was triggered. - * - * Retriggers occur when the signature help is already active and can be - * caused by actions such as typing a trigger character, a cursor move, or - * document content changes. - */ - isRetrigger: boolean; - - /** - * The currently active `SignatureHelp`. - * - * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field - * updated based on the user navigating through available signatures. - */ - activeSignatureHelp?: SignatureHelp; -} -``` - -_Response_: -* result: `SignatureHelp` \| `null` defined as follows: - -
- -```typescript -/** - * Signature help represents the signature of something - * callable. There can be multiple signature but only one - * active and only one active parameter. - */ -export interface SignatureHelp { - /** - * One or more signatures. If no signatures are available the signature help - * request should return `null`. - */ - signatures: SignatureInformation[]; - - /** - * The active signature. If omitted or the value lies outside the - * 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. - * - * In future version of the protocol this property might become - * mandatory to better express this. - */ - activeSignature?: uinteger; - - /** - * The active parameter of the active signature. If omitted or the value - * lies outside the range of `signatures[activeSignature].parameters` - * defaults to 0 if the active signature has parameters. If - * the active signature has no parameters it is ignored. - * In future version of the protocol this property might become - * mandatory to better express the active parameter if the - * active signature does have any. - */ - activeParameter?: uinteger; -} -``` - -
- -```typescript -/** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ -export interface SignatureInformation { - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; - - /** - * The parameters of this signature. - */ - parameters?: ParameterInformation[]; - - /** - * The index of the active parameter. - * - * If provided, this is used in place of `SignatureHelp.activeParameter`. - * - * @since 3.16.0 - */ - activeParameter?: uinteger; -} -``` - -
- -```typescript -/** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ -export interface ParameterInformation { - - /** - * The label of this parameter information. - * - * Either a string or an inclusive start and exclusive end offsets within - * its containing signature label. (see SignatureInformation.label). The - * offsets are based on a UTF-16 string representation as `Position` and - * `Range` does. - * - * *Note*: a label of type string should be a substring of its containing - * signature label. Its intended use case is to highlight the parameter - * label part in the `SignatureInformation.label`. - */ - label: string | [uinteger, uinteger]; - - /** - * The human-readable doc-comment of this parameter. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; -} -``` - -* error: code and message set in case an exception happens during the signature help request. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/typeDefinition.md b/language-server-protocol/_specifications/lsp/3.17/language/typeDefinition.md deleted file mode 100644 index e6df8458d..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/typeDefinition.md +++ /dev/null @@ -1,70 +0,0 @@ -#### Goto Type Definition Request (:leftwards_arrow_with_hook:) - -> *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. diff --git a/language-server-protocol/_specifications/lsp/3.17/language/typeHierarchy.md b/language-server-protocol/_specifications/lsp/3.17/language/typeHierarchy.md deleted file mode 100644 index c446602ca..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/language/typeHierarchy.md +++ /dev/null @@ -1,172 +0,0 @@ - -#### Prepare Type Hierarchy Request (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```typescript -export interface TypeHierarchyOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `TypeHierarchyRegistrationOptions` defined as follows: - -
- -```typescript -export interface TypeHierarchyRegistrationOptions extends - TextDocumentRegistrationOptions, TypeHierarchyOptions, - StaticRegistrationOptions { -} -``` - -_Request_: - -* method: 'textDocument/prepareTypeHierarchy' -* params: `TypeHierarchyPrepareParams` defined as follows: - -
- -```typescript -export interface TypeHierarchyPrepareParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: - -* result: `TypeHierarchyItem[] | null` defined as follows: - -
- -```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 - -#### Type Hierarchy Supertypes(:leftwards_arrow_with_hook:) - -> *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: - -
- -```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 - -#### Type Hierarchy Subtypes(:leftwards_arrow_with_hook:) - -> *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: - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.json b/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.json deleted file mode 100644 index 52f71da3a..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.json +++ /dev/null @@ -1,14373 +0,0 @@ -{ - "metaData": { - "version": "3.17.0" - }, - "requests": [ - { - "method": "textDocument/implementation", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Definition" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ImplementationParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "ImplementationRegistrationOptions" - }, - "documentation": "A request to resolve the implementation locations of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPositionParams]\n(#TextDocumentPositionParams) the response is of type {@link Definition} or a\nThenable that resolves to such." - }, - { - "method": "textDocument/typeDefinition", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Definition" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeDefinitionParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "TypeDefinitionRegistrationOptions" - }, - "documentation": "A request to resolve the type definition locations of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPositionParams]\n(#TextDocumentPositionParams) the response is of type {@link Definition} or a\nThenable that resolves to such." - }, - { - "method": "workspace/workspaceFolders", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "serverToClient", - "documentation": "The `workspace/workspaceFolders` is sent from the server to the client to fetch the open workspace folders." - }, - { - "method": "workspace/configuration", - "result": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ConfigurationParams" - }, - "documentation": "The 'workspace/configuration' request is sent from the server to the client to fetch a certain\nconfiguration setting.\n\nThis pull model replaces the old push model were the client signaled configuration change via an\nevent. If the server still needs to react to configuration changes (since the server caches the\nresult of `workspace/configuration` requests) the server should register for an empty configuration\nchange event and empty the cache if such an event is received." - }, - { - "method": "textDocument/documentColor", - "result": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorInformation" - } - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentColorParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorInformation" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentColorRegistrationOptions" - }, - "documentation": "A request to list all color symbols found in a given text document. The request's\nparameter is of type {@link DocumentColorParams} the\nresponse is of type {@link ColorInformation ColorInformation[]} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/colorPresentation", - "result": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorPresentation" - } - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ColorPresentationParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorPresentation" - } - }, - "registrationOptions": { - "kind": "and", - "items": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ] - }, - "documentation": "A request to list all presentation for a color. The request's\nparameter is of type {@link ColorPresentationParams} the\nresponse is of type {@link ColorInformation ColorInformation[]} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/foldingRange", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "FoldingRange" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "FoldingRangeParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FoldingRange" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "FoldingRangeRegistrationOptions" - }, - "documentation": "A request to provide folding ranges in a document. The request's\nparameter is of type {@link FoldingRangeParams}, the\nresponse is of type {@link FoldingRangeList} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/declaration", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Declaration" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DeclarationLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DeclarationParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DeclarationLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "DeclarationRegistrationOptions" - }, - "documentation": "A request to resolve the type definition locations of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPositionParams]\n(#TextDocumentPositionParams) the response is of type {@link Declaration}\nor a typed array of {@link DeclarationLink} or a Thenable that resolves\nto such." - }, - { - "method": "textDocument/selectionRange", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SelectionRange" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SelectionRangeParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SelectionRange" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "SelectionRangeRegistrationOptions" - }, - "documentation": "A request to provide selection ranges in a document. The request's\nparameter is of type {@link SelectionRangeParams}, the\nresponse is of type {@link SelectionRange SelectionRange[]} or a Thenable\nthat resolves to such." - }, - { - "method": "window/workDoneProgress/create", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "WorkDoneProgressCreateParams" - }, - "documentation": "The `window/workDoneProgress/create` request is sent from the server to the client to initiate progress\nreporting from the server." - }, - { - "method": "textDocument/prepareCallHierarchy", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CallHierarchyPrepareParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "CallHierarchyRegistrationOptions" - }, - "documentation": "A request to result a `CallHierarchyItem` in a document at a given position.\nCan be used as an input to an incoming or outgoing call hierarchy.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "callHierarchy/incomingCalls", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyIncomingCall" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CallHierarchyIncomingCallsParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyIncomingCall" - } - }, - "documentation": "A request to resolve the incoming calls for a given `CallHierarchyItem`.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "callHierarchy/outgoingCalls", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyOutgoingCall" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CallHierarchyOutgoingCallsParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyOutgoingCall" - } - }, - "documentation": "A request to resolve the outgoing calls for a given `CallHierarchyItem`.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/semanticTokens/full", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokens" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SemanticTokensParams" - }, - "partialResult": { - "kind": "reference", - "name": "SemanticTokensPartialResult" - }, - "registrationMethod": "textDocument/semanticTokens", - "registrationOptions": { - "kind": "reference", - "name": "SemanticTokensRegistrationOptions" - }, - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/semanticTokens/full/delta", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokens" - }, - { - "kind": "reference", - "name": "SemanticTokensDelta" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SemanticTokensDeltaParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokensPartialResult" - }, - { - "kind": "reference", - "name": "SemanticTokensDeltaPartialResult" - } - ] - }, - "registrationMethod": "textDocument/semanticTokens", - "registrationOptions": { - "kind": "reference", - "name": "SemanticTokensRegistrationOptions" - }, - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/semanticTokens/range", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokens" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SemanticTokensRangeParams" - }, - "partialResult": { - "kind": "reference", - "name": "SemanticTokensPartialResult" - }, - "registrationMethod": "textDocument/semanticTokens", - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/semanticTokens/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "window/showDocument", - "result": { - "kind": "reference", - "name": "ShowDocumentResult" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ShowDocumentParams" - }, - "documentation": "A request to show a document. This request might open an\nexternal program depending on the value of the URI to open.\nFor example a request to open `https://code.visualstudio.com/`\nwill very likely open the URI in a WEB browser.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/linkedEditingRange", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "LinkedEditingRanges" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "LinkedEditingRangeParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "LinkedEditingRangeRegistrationOptions" - }, - "documentation": "A request to provide ranges that can be edited together.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/willCreateFiles", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CreateFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The will create files request is sent from the client to the server before files are actually\ncreated as long as the creation is triggered from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/willRenameFiles", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "RenameFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The will rename files request is sent from the client to the server before files are actually\nrenamed as long as the rename is triggered from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/willDeleteFiles", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DeleteFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The did delete files notification is sent from the client to the server when\nfiles were deleted from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/moniker", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Moniker" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "MonikerParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Moniker" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "MonikerRegistrationOptions" - }, - "documentation": "A request to get the moniker of a symbol at a given text document position.\nThe request parameter is of type {@link TextDocumentPositionParams}.\nThe response is of type {@link Moniker Moniker[]} or `null`." - }, - { - "method": "textDocument/prepareTypeHierarchy", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeHierarchyPrepareParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TypeHierarchyRegistrationOptions" - }, - "documentation": "A request to result a `TypeHierarchyItem` in a document at a given position.\nCan be used as an input to a subtypes or supertypes type hierarchy.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "typeHierarchy/supertypes", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeHierarchySupertypesParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - "documentation": "A request to resolve the supertypes for a given `TypeHierarchyItem`.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "typeHierarchy/subtypes", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeHierarchySubtypesParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - "documentation": "A request to resolve the subtypes for a given `TypeHierarchyItem`.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/inlineValue", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlineValue" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InlineValueParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlineValue" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "InlineValueRegistrationOptions" - }, - "documentation": "A request to provide inline values in a document. The request's parameter is of\ntype {@link InlineValueParams}, the response is of type\n{@link InlineValue InlineValue[]} or a Thenable that resolves to such.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/inlineValue/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/inlayHint", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlayHint" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InlayHintParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlayHint" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "InlayHintRegistrationOptions" - }, - "documentation": "A request to provide inlay hints in a document. The request's parameter is of\ntype {@link InlayHintsParams}, the response is of type\n{@link InlayHint InlayHint[]} or a Thenable that resolves to such.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "inlayHint/resolve", - "result": { - "kind": "reference", - "name": "InlayHint" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InlayHint" - }, - "documentation": "A request to resolve additional properties for an inlay hint.\nThe request's parameter is of type {@link InlayHint}, the response is\nof type {@link InlayHint} or a Thenable that resolves to such.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/inlayHint/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/diagnostic", - "result": { - "kind": "reference", - "name": "DocumentDiagnosticReport" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentDiagnosticParams" - }, - "partialResult": { - "kind": "reference", - "name": "DocumentDiagnosticReportPartialResult" - }, - "errorData": { - "kind": "reference", - "name": "DiagnosticServerCancellationData" - }, - "registrationOptions": { - "kind": "reference", - "name": "DiagnosticRegistrationOptions" - }, - "documentation": "The document diagnostic request definition.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/diagnostic", - "result": { - "kind": "reference", - "name": "WorkspaceDiagnosticReport" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkspaceDiagnosticParams" - }, - "partialResult": { - "kind": "reference", - "name": "WorkspaceDiagnosticReportPartialResult" - }, - "errorData": { - "kind": "reference", - "name": "DiagnosticServerCancellationData" - }, - "documentation": "The workspace diagnostic request definition.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/diagnostic/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "The diagnostic refresh request definition.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "client/registerCapability", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "RegistrationParams" - }, - "documentation": "The `client/registerCapability` request is sent from the server to the client to register a new capability\nhandler on the client side." - }, - { - "method": "client/unregisterCapability", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "UnregistrationParams" - }, - "documentation": "The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability\nhandler on the client side." - }, - { - "method": "initialize", - "result": { - "kind": "reference", - "name": "InitializeResult" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InitializeParams" - }, - "errorData": { - "kind": "reference", - "name": "InitializeError" - }, - "documentation": "The initialize request is sent from the client to the server.\nIt is sent once as the request after starting up the server.\nThe requests parameter is of type {@link InitializeParams}\nthe response if of type {@link InitializeResult} of a Thenable that\nresolves to such." - }, - { - "method": "shutdown", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "clientToServer", - "documentation": "A shutdown request is sent from the client to the server.\nIt is sent once when the client decides to shutdown the\nserver. The only notification that is sent after a shutdown request\nis the exit event." - }, - { - "method": "window/showMessageRequest", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "MessageActionItem" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ShowMessageRequestParams" - }, - "documentation": "The show message request is sent from the server to the client to show a message\nand a set of options actions to the user." - }, - { - "method": "textDocument/willSaveWaitUntil", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WillSaveTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "A document will save request is sent from the client to the server before\nthe document is actually saved. The request can return an array of TextEdits\nwhich will be applied to the text document before it is saved. Please note that\nclients might drop results if computing the text edits took too long or if a\nserver constantly fails on this request. This is done to keep the save fast and\nreliable." - }, - { - "method": "textDocument/completion", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItem" - } - }, - { - "kind": "reference", - "name": "CompletionList" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CompletionParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItem" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "CompletionRegistrationOptions" - }, - "documentation": "Request to request completion at a given text document position. The request's\nparameter is of type {@link TextDocumentPosition} the response\nis of type {@link CompletionItem CompletionItem[]} or {@link CompletionList}\nor a Thenable that resolves to such.\n\nThe request can delay the computation of the {@link CompletionItem.detail `detail`}\nand {@link CompletionItem.documentation `documentation`} properties to the `completionItem/resolve`\nrequest. However, properties that are needed for the initial sorting and filtering, like `sortText`,\n`filterText`, `insertText`, and `textEdit`, must not be changed during resolve." - }, - { - "method": "completionItem/resolve", - "result": { - "kind": "reference", - "name": "CompletionItem" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CompletionItem" - }, - "documentation": "Request to resolve additional information for a given completion item.The request's\nparameter is of type {@link CompletionItem} the response\nis of type {@link CompletionItem} or a Thenable that resolves to such." - }, - { - "method": "textDocument/hover", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Hover" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "HoverParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "HoverRegistrationOptions" - }, - "documentation": "Request to request hover information at a given text document position. The request's\nparameter is of type {@link TextDocumentPosition} the response is of\ntype {@link Hover} or a Thenable that resolves to such." - }, - { - "method": "textDocument/signatureHelp", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SignatureHelp" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SignatureHelpParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "SignatureHelpRegistrationOptions" - } - }, - { - "method": "textDocument/definition", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Definition" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DefinitionParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "DefinitionRegistrationOptions" - }, - "documentation": "A request to resolve the definition location of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPosition]\n(#TextDocumentPosition) the response is of either type {@link Definition}\nor a typed array of {@link DefinitionLink} or a Thenable that resolves\nto such." - }, - { - "method": "textDocument/references", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ReferenceParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "ReferenceRegistrationOptions" - }, - "documentation": "A request to resolve project-wide references for the symbol denoted\nby the given text document position. The request's parameter is of\ntype {@link ReferenceParams} the response is of type\n{@link Location Location[]} or a Thenable that resolves to such." - }, - { - "method": "textDocument/documentHighlight", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentHighlight" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentHighlightParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentHighlight" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentHighlightRegistrationOptions" - }, - "documentation": "Request to resolve a {@link DocumentHighlight} for a given\ntext document position. The request's parameter is of type [TextDocumentPosition]\n(#TextDocumentPosition) the request response is of type [DocumentHighlight[]]\n(#DocumentHighlight) or a Thenable that resolves to such." - }, - { - "method": "textDocument/documentSymbol", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentSymbol" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentSymbolParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentSymbol" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentSymbolRegistrationOptions" - }, - "documentation": "A request to list all symbols found in a given text document. The request's\nparameter is of type {@link TextDocumentIdentifier} the\nresponse is of type {@link SymbolInformation SymbolInformation[]} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/codeAction", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Command" - }, - { - "kind": "reference", - "name": "CodeAction" - } - ] - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeActionParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Command" - }, - { - "kind": "reference", - "name": "CodeAction" - } - ] - } - }, - "registrationOptions": { - "kind": "reference", - "name": "CodeActionRegistrationOptions" - }, - "documentation": "A request to provide commands for the given text document and range." - }, - { - "method": "codeAction/resolve", - "result": { - "kind": "reference", - "name": "CodeAction" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeAction" - }, - "documentation": "Request to resolve additional information for a given code action.The request's\nparameter is of type {@link CodeAction} the response\nis of type {@link CodeAction} or a Thenable that resolves to such." - }, - { - "method": "workspace/symbol", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceSymbol" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkspaceSymbolParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceSymbol" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "WorkspaceSymbolRegistrationOptions" - }, - "documentation": "A request to list project-wide symbols matching the query string given\nby the {@link WorkspaceSymbolParams}. The response is\nof type {@link SymbolInformation SymbolInformation[]} or a Thenable that\nresolves to such.\n\n@since 3.17.0 - support for WorkspaceSymbol in the returned data. Clients\n need to advertise support for WorkspaceSymbols via the client capability\n `workspace.symbol.resolveSupport`.\n", - "since": "3.17.0 - support for WorkspaceSymbol in the returned data. Clients\nneed to advertise support for WorkspaceSymbols via the client capability\n`workspace.symbol.resolveSupport`." - }, - { - "method": "workspaceSymbol/resolve", - "result": { - "kind": "reference", - "name": "WorkspaceSymbol" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkspaceSymbol" - }, - "documentation": "A request to resolve the range inside the workspace\nsymbol's location.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/codeLens", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeLens" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeLensParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeLens" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "CodeLensRegistrationOptions" - }, - "documentation": "A request to provide code lens for the given text document." - }, - { - "method": "codeLens/resolve", - "result": { - "kind": "reference", - "name": "CodeLens" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeLens" - }, - "documentation": "A request to resolve a command for a given code lens." - }, - { - "method": "workspace/codeLens/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "A request to refresh all code actions\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/documentLink", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentLinkParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentLink" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentLinkRegistrationOptions" - }, - "documentation": "A request to provide document links" - }, - { - "method": "documentLink/resolve", - "result": { - "kind": "reference", - "name": "DocumentLink" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentLink" - }, - "documentation": "Request to resolve additional information for a given document link. The request's\nparameter is of type {@link DocumentLink} the response\nis of type {@link DocumentLink} or a Thenable that resolves to such." - }, - { - "method": "textDocument/formatting", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentFormattingParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentFormattingRegistrationOptions" - }, - "documentation": "A request to to format a whole document." - }, - { - "method": "textDocument/rangeFormatting", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentRangeFormattingParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentRangeFormattingRegistrationOptions" - }, - "documentation": "A request to to format a range in a document." - }, - { - "method": "textDocument/onTypeFormatting", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentOnTypeFormattingParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentOnTypeFormattingRegistrationOptions" - }, - "documentation": "A request to format a document on type." - }, - { - "method": "textDocument/rename", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "RenameParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "RenameRegistrationOptions" - }, - "documentation": "A request to rename a symbol." - }, - { - "method": "textDocument/prepareRename", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "PrepareRenameResult" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "PrepareRenameParams" - }, - "documentation": "A request to test and perform the setup necessary for a rename.\n\n@since 3.16 - support for default behavior", - "since": "3.16 - support for default behavior" - }, - { - "method": "workspace/executeCommand", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "LSPAny" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ExecuteCommandParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "ExecuteCommandRegistrationOptions" - }, - "documentation": "A request send from the client to the server to execute a command. The request might return\na workspace edit which the client will apply to the workspace." - }, - { - "method": "workspace/applyEdit", - "result": { - "kind": "reference", - "name": "ApplyWorkspaceEditResult" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ApplyWorkspaceEditParams" - }, - "documentation": "A request sent from the server to the client to modified certain resources." - } - ], - "notifications": [ - { - "method": "workspace/didChangeWorkspaceFolders", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeWorkspaceFoldersParams" - }, - "documentation": "The `workspace/didChangeWorkspaceFolders` notification is sent from the client to the server when the workspace\nfolder configuration changes." - }, - { - "method": "window/workDoneProgress/cancel", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkDoneProgressCancelParams" - }, - "documentation": "The `window/workDoneProgress/cancel` notification is sent from the client to the server to cancel a progress\ninitiated on the server side." - }, - { - "method": "workspace/didCreateFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CreateFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The did create files notification is sent from the client to the server when\nfiles were created from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/didRenameFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "RenameFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The did rename files notification is sent from the client to the server when\nfiles were renamed from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/didDeleteFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DeleteFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The will delete files request is sent from the client to the server before files are actually\ndeleted as long as the deletion is triggered from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "notebookDocument/didOpen", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidOpenNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync", - "documentation": "A notification sent when a notebook opens.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "notebookDocument/didChange", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync" - }, - { - "method": "notebookDocument/didSave", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidSaveNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync", - "documentation": "A notification sent when a notebook document is saved.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "notebookDocument/didClose", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidCloseNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync", - "documentation": "A notification sent when a notebook closes.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "initialized", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InitializedParams" - }, - "documentation": "The initialized notification is sent from the client to the\nserver after the client is fully initialized and the server\nis allowed to send requests from the server to the client." - }, - { - "method": "exit", - "messageDirection": "clientToServer", - "documentation": "The exit event is sent from the client to the server to\nask the server to exit its process." - }, - { - "method": "workspace/didChangeConfiguration", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeConfigurationParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DidChangeConfigurationRegistrationOptions" - }, - "documentation": "The configuration change notification is sent from the client to the server\nwhen the client's configuration has changed. The notification contains\nthe changed configuration as defined by the language client." - }, - { - "method": "window/showMessage", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ShowMessageParams" - }, - "documentation": "The show message notification is sent from a server to a client to ask\nthe client to display a particular message in the user interface." - }, - { - "method": "window/logMessage", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "LogMessageParams" - }, - "documentation": "The log message notification is sent from the server to the client to ask\nthe client to log a particular message." - }, - { - "method": "telemetry/event", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "LSPAny" - }, - "documentation": "The telemetry event notification is sent from the server to the client to ask\nthe client to log telemetry data." - }, - { - "method": "textDocument/didOpen", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidOpenTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "The document open notification is sent from the client to the server to signal\nnewly opened text documents. The document's truth is now managed by the client\nand the server must not try to read the document's truth using the document's\nuri. Open in this sense means it is managed by the client. It doesn't necessarily\nmean that its content is presented in an editor. An open notification must not\nbe sent more than once without a corresponding close notification send before.\nThis means open and close notification must be balanced and the max open count\nis one." - }, - { - "method": "textDocument/didChange", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentChangeRegistrationOptions" - }, - "documentation": "The document change notification is sent from the client to the server to signal\nchanges to a text document." - }, - { - "method": "textDocument/didClose", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidCloseTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "The document close notification is sent from the client to the server when\nthe document got closed in the client. The document's truth now exists where\nthe document's uri points to (e.g. if the document's uri is a file uri the\ntruth now exists on disk). As with the open notification the close notification\nis about managing the document's content. Receiving a close notification\ndoesn't mean that the document was open in an editor before. A close\nnotification requires a previous open notification to be sent." - }, - { - "method": "textDocument/didSave", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidSaveTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentSaveRegistrationOptions" - }, - "documentation": "The document save notification is sent from the client to the server when\nthe document got saved in the client." - }, - { - "method": "textDocument/willSave", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WillSaveTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "A document will save notification is sent from the client to the server before\nthe document is actually saved." - }, - { - "method": "workspace/didChangeWatchedFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeWatchedFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DidChangeWatchedFilesRegistrationOptions" - }, - "documentation": "The watched files notification is sent from the client to the server when\nthe client detects changes to file watched by the language client." - }, - { - "method": "textDocument/publishDiagnostics", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "PublishDiagnosticsParams" - }, - "documentation": "Diagnostics notification are sent from the server to the client to signal\nresults of validation runs." - }, - { - "method": "$/setTrace", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SetTraceParams" - } - }, - { - "method": "$/logTrace", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "LogTraceParams" - } - }, - { - "method": "$/cancelRequest", - "messageDirection": "both", - "params": { - "kind": "reference", - "name": "CancelParams" - } - }, - { - "method": "$/progress", - "messageDirection": "both", - "params": { - "kind": "reference", - "name": "ProgressParams" - } - } - ], - "structures": [ - { - "name": "ImplementationParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "Location", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - } - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - } - } - ], - "documentation": "Represents a location inside a resource, such as a line\ninside a text file." - }, - { - "name": "ImplementationRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "ImplementationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "TypeDefinitionParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "TypeDefinitionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "TypeDefinitionOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "WorkspaceFolder", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The associated URI for this workspace folder." - }, - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the workspace folder. Used to refer to this\nworkspace folder in the user interface." - } - ], - "documentation": "A workspace folder inside a client." - }, - { - "name": "DidChangeWorkspaceFoldersParams", - "properties": [ - { - "name": "event", - "type": { - "kind": "reference", - "name": "WorkspaceFoldersChangeEvent" - }, - "documentation": "The actual workspace folder change event." - } - ], - "documentation": "The parameters of a `workspace/didChangeWorkspaceFolders` notification." - }, - { - "name": "ConfigurationParams", - "properties": [ - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ConfigurationItem" - } - } - } - ], - "documentation": "The parameters of a configuration request." - }, - { - "name": "DocumentColorParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DocumentColorRequest}." - }, - { - "name": "ColorInformation", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range in the document where this color appears." - }, - { - "name": "color", - "type": { - "kind": "reference", - "name": "Color" - }, - "documentation": "The actual color value for this color range." - } - ], - "documentation": "Represents a color range from a document." - }, - { - "name": "DocumentColorRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentColorOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "ColorPresentationParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "color", - "type": { - "kind": "reference", - "name": "Color" - }, - "documentation": "The color to request presentations for." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range where the color would be inserted. Serves as a context." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link ColorPresentationRequest}." - }, - { - "name": "ColorPresentation", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The label of this color presentation. It will be shown on the color\npicker header. By default this is also the text that is inserted when selecting\nthis color presentation." - }, - { - "name": "textEdit", - "type": { - "kind": "reference", - "name": "TextEdit" - }, - "optional": true, - "documentation": "An {@link TextEdit edit} which is applied to a document when selecting\nthis presentation for the color. When `falsy` the {@link ColorPresentation.label label}\nis used." - }, - { - "name": "additionalTextEdits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - "optional": true, - "documentation": "An optional array of additional {@link TextEdit text edits} that are applied when\nselecting this color presentation. Edits must not overlap with the main {@link ColorPresentation.textEdit edit} nor with themselves." - } - ] - }, - { - "name": "WorkDoneProgressOptions", - "properties": [ - { - "name": "workDoneProgress", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true - } - ] - }, - { - "name": "TextDocumentRegistrationOptions", - "properties": [ - { - "name": "documentSelector", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "DocumentSelector" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "A document selector to identify the scope of the registration. If set to null\nthe document selector provided on the client side will be used." - } - ], - "documentation": "General text document registration options." - }, - { - "name": "FoldingRangeParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link FoldingRangeRequest}." - }, - { - "name": "FoldingRange", - "properties": [ - { - "name": "startLine", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The zero-based start line of the range to fold. The folded area starts after the line's last character.\nTo be valid, the end must be zero or larger and smaller than the number of lines in the document." - }, - { - "name": "startCharacter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line." - }, - { - "name": "endLine", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The zero-based end line of the range to fold. The folded area ends with the line's last character.\nTo be valid, the end must be zero or larger and smaller than the number of lines in the document." - }, - { - "name": "endCharacter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "FoldingRangeKind" - }, - "optional": true, - "documentation": "Describes the kind of the folding range such as `comment' or 'region'. The kind\nis used to categorize folding ranges and used by commands like 'Fold all comments'.\nSee {@link FoldingRangeKind} for an enumeration of standardized kinds." - }, - { - "name": "collapsedText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The text that the client should show when the specified range is\ncollapsed. If not defined or not supported by the client, a default\nwill be chosen by the client.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Represents a folding range. To be valid, start and end line must be bigger than zero and smaller\nthan the number of lines in the document. Clients are free to ignore invalid ranges." - }, - { - "name": "FoldingRangeRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "FoldingRangeOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "DeclarationParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "DeclarationRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "DeclarationOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "SelectionRangeParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "positions", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Position" - } - }, - "documentation": "The positions inside the text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "A parameter literal used in selection range requests." - }, - { - "name": "SelectionRange", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The {@link Range range} of this selection range." - }, - { - "name": "parent", - "type": { - "kind": "reference", - "name": "SelectionRange" - }, - "optional": true, - "documentation": "The parent selection range containing this range. Therefore `parent.range` must contain `this.range`." - } - ], - "documentation": "A selection range represents a part of a selection hierarchy. A selection range\nmay have a parent selection range that contains it." - }, - { - "name": "SelectionRangeRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "SelectionRangeOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "WorkDoneProgressCreateParams", - "properties": [ - { - "name": "token", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "documentation": "The token to be used to report progress." - } - ] - }, - { - "name": "WorkDoneProgressCancelParams", - "properties": [ - { - "name": "token", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "documentation": "The token to be used to report progress." - } - ] - }, - { - "name": "CallHierarchyPrepareParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameter of a `textDocument/prepareCallHierarchy` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyItem", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this item." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this item." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this item." - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "More detail for this item, e.g. the signature of a function." - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The resource identifier of this item." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code." - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this symbol is being picked, e.g. the name of a function.\nMust be contained by the {@link CallHierarchyItem.range `range`}." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved between a call hierarchy prepare and\nincoming calls or outgoing calls requests." - } - ], - "documentation": "Represents programming constructs like functions or constructors in the context\nof call hierarchy.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CallHierarchyOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Call hierarchy options used during static or dynamic registration.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyIncomingCallsParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `callHierarchy/incomingCalls` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyIncomingCall", - "properties": [ - { - "name": "from", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - }, - "documentation": "The item that makes the call." - }, - { - "name": "fromRanges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Range" - } - }, - "documentation": "The ranges at which the calls appear. This is relative to the caller\ndenoted by {@link CallHierarchyIncomingCall.from `this.from`}." - } - ], - "documentation": "Represents an incoming call, e.g. a caller of a method or constructor.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyOutgoingCallsParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `callHierarchy/outgoingCalls` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyOutgoingCall", - "properties": [ - { - "name": "to", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - }, - "documentation": "The item that is called." - }, - { - "name": "fromRanges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Range" - } - }, - "documentation": "The range at which this item is called. This is the range relative to the caller, e.g the item\npassed to {@link CallHierarchyItemProvider.provideCallHierarchyOutgoingCalls `provideCallHierarchyOutgoingCalls`}\nand not {@link CallHierarchyOutgoingCall.to `this.to`}." - } - ], - "documentation": "Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokens", - "properties": [ - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional result id. If provided and clients support delta updating\nthe client will include the result id in the next semantic token request.\nA server can then instead of computing all semantic tokens again simply\nsend a delta." - }, - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "uinteger" - } - }, - "documentation": "The actual tokens." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensPartialResult", - "properties": [ - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "uinteger" - } - } - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "SemanticTokensOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensDeltaParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "previousResultId", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The result id of a previous response. The result Id can either point to a full response\nor a delta response depending on what was received last." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensDelta", - "properties": [ - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true - }, - { - "name": "edits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SemanticTokensEdit" - } - }, - "documentation": "The semantic token edits to transform a previous result into a new result." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensDeltaPartialResult", - "properties": [ - { - "name": "edits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SemanticTokensEdit" - } - } - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensRangeParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range the semantic tokens are requested for." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "ShowDocumentParams", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The document uri to show." - }, - { - "name": "external", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates to show the resource in an external program.\nTo show for example `https://code.visualstudio.com/`\nin the default WEB browser set `external` to `true`." - }, - { - "name": "takeFocus", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "An optional property to indicate whether the editor\nshowing the document should take focus or not.\nClients might ignore this property if an external\nprogram is started." - }, - { - "name": "selection", - "type": { - "kind": "reference", - "name": "Range" - }, - "optional": true, - "documentation": "An optional selection range if the document is a text\ndocument. Clients might ignore the property if an\nexternal program is started or the file is not a text\nfile." - } - ], - "documentation": "Params to show a document.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "ShowDocumentResult", - "properties": [ - { - "name": "success", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "A boolean indicating if the show was successful." - } - ], - "documentation": "The result of a showDocument request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ] - }, - { - "name": "LinkedEditingRanges", - "properties": [ - { - "name": "ranges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Range" - } - }, - "documentation": "A list of ranges that can be edited together. The ranges must have\nidentical length and contain identical text content. The ranges cannot overlap." - }, - { - "name": "wordPattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional word pattern (regular expression) that describes valid contents for\nthe given ranges. If no pattern is provided, the client configuration's word\npattern will be used." - } - ], - "documentation": "The result of a linked editing range request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "LinkedEditingRangeOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "CreateFilesParams", - "properties": [ - { - "name": "files", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileCreate" - } - }, - "documentation": "An array of all files/folders created in this operation." - } - ], - "documentation": "The parameters sent in notifications/requests for user-initiated creation of\nfiles.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "WorkspaceEdit", - "properties": [ - { - "name": "changes", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - } - }, - "optional": true, - "documentation": "Holds changes to existing resources." - }, - { - "name": "documentChanges", - "type": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextDocumentEdit" - }, - { - "kind": "reference", - "name": "CreateFile" - }, - { - "kind": "reference", - "name": "RenameFile" - }, - { - "kind": "reference", - "name": "DeleteFile" - } - ] - } - }, - "optional": true, - "documentation": "Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\nare either an array of `TextDocumentEdit`s to express changes to n different text documents\nwhere each text document edit addresses a specific version of a text document. Or it can contain\nabove `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\nWhether a client supports versioned document edits is expressed via\n`workspace.workspaceEdit.documentChanges` client capability.\n\nIf a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\nonly plain `TextEdit`s using the `changes` property are supported." - }, - { - "name": "changeAnnotations", - "type": { - "kind": "map", - "key": { - "kind": "reference", - "name": "ChangeAnnotationIdentifier" - }, - "value": { - "kind": "reference", - "name": "ChangeAnnotation" - } - }, - "optional": true, - "documentation": "A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\ndelete file / folder operations.\n\nWhether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "A workspace edit represents changes to many resources managed in the workspace. The edit\nshould either provide `changes` or `documentChanges`. If documentChanges are present\nthey are preferred over `changes` if the client can handle versioned document edits.\n\nSince version 3.13.0 a workspace edit can contain resource operations as well. If resource\noperations are present clients need to execute the operations in the order in which they\nare provided. So a workspace edit for example can consist of the following two changes:\n(1) a create file a.txt and (2) a text document edit which insert text into file a.txt.\n\nAn invalid sequence (e.g. (1) delete file a.txt and (2) insert text into file a.txt) will\ncause failure of the operation. How the client recovers from the failure is described by\nthe client capability: `workspace.workspaceEdit.failureHandling`" - }, - { - "name": "FileOperationRegistrationOptions", - "properties": [ - { - "name": "filters", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileOperationFilter" - } - }, - "documentation": "The actual filters." - } - ], - "documentation": "The options to register for file operations.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "RenameFilesParams", - "properties": [ - { - "name": "files", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileRename" - } - }, - "documentation": "An array of all files/folders renamed in this operation. When a folder is renamed, only\nthe folder will be included, and not its children." - } - ], - "documentation": "The parameters sent in notifications/requests for user-initiated renames of\nfiles.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DeleteFilesParams", - "properties": [ - { - "name": "files", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileDelete" - } - }, - "documentation": "An array of all files/folders deleted in this operation." - } - ], - "documentation": "The parameters sent in notifications/requests for user-initiated deletes of\nfiles.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "Moniker", - "properties": [ - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The scheme of the moniker. For example tsc or .Net" - }, - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The identifier of the moniker. The value is opaque in LSIF however\nschema owners are allowed to define the structure if they want." - }, - { - "name": "unique", - "type": { - "kind": "reference", - "name": "UniquenessLevel" - }, - "documentation": "The scope in which the moniker is unique" - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "MonikerKind" - }, - "optional": true, - "documentation": "The moniker kind if known." - } - ], - "documentation": "Moniker definition to match LSIF 0.5 moniker definition.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "MonikerOptions" - } - ] - }, - { - "name": "TypeHierarchyPrepareParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameter of a `textDocument/prepareTypeHierarchy` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchyItem", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this item." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this item." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this item." - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "More detail for this item, e.g. the signature of a function." - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The resource identifier of this item." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range enclosing this symbol not including leading/trailing whitespace\nbut everything else, e.g. comments and code." - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this symbol is being\npicked, e.g. the name of a function. Must be contained by the\n{@link TypeHierarchyItem.range `range`}." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved between a type hierarchy prepare and\nsupertypes or subtypes requests. It could also be used to identify the\ntype hierarchy in the server, helping improve the performance on\nresolving supertypes and subtypes." - } - ], - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchyRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "TypeHierarchyOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Type hierarchy options used during static or dynamic registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchySupertypesParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `typeHierarchy/supertypes` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchySubtypesParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `typeHierarchy/subtypes` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which inline values should be computed." - }, - { - "name": "context", - "type": { - "kind": "reference", - "name": "InlineValueContext" - }, - "documentation": "Additional information about the context in which inline values were\nrequested." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "A parameter literal used in inline value requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "InlineValueOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Inline value options used during static or dynamic registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which inlay hints should be computed." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "A parameter literal used in inlay hint requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHint", - "properties": [ - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position of this hint." - }, - { - "name": "label", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlayHintLabelPart" - } - } - ] - }, - "documentation": "The label of this hint. A human readable string or an array of\nInlayHintLabelPart label parts.\n\n*Note* that neither the string nor the label part can be empty." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "InlayHintKind" - }, - "optional": true, - "documentation": "The kind of this hint. Can be omitted in which case the client\nshould fall back to a reasonable default." - }, - { - "name": "textEdits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - "optional": true, - "documentation": "Optional text edits that are performed when accepting this inlay hint.\n\n*Note* that edits are expected to change the document so that the inlay\nhint (or its nearest variant) is now part of the document and the inlay\nhint itself is now obsolete." - }, - { - "name": "tooltip", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The tooltip text when you hover over this item." - }, - { - "name": "paddingLeft", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Render padding before the hint.\n\nNote: Padding should use the editor's background color, not the\nbackground color of the hint itself. That means padding can be used\nto visually align/separate an inlay hint." - }, - { - "name": "paddingRight", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Render padding after the hint.\n\nNote: Padding should use the editor's background color, not the\nbackground color of the hint itself. That means padding can be used\nto visually align/separate an inlay hint." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on an inlay hint between\na `textDocument/inlayHint` and a `inlayHint/resolve` request." - } - ], - "documentation": "Inlay hint information.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "InlayHintOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Inlay hint options used during static or dynamic registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DocumentDiagnosticParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The additional identifier provided during registration." - }, - { - "name": "previousResultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The result id of a previous response if provided." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters of the document diagnostic request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DocumentDiagnosticReportPartialResult", - "properties": [ - { - "name": "relatedDocuments", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ] - } - } - } - ], - "documentation": "A partial result for a document diagnostic report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticServerCancellationData", - "properties": [ - { - "name": "retriggerRequest", - "type": { - "kind": "base", - "name": "boolean" - } - } - ], - "documentation": "Cancellation data returned from a diagnostic request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DiagnosticOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Diagnostic registration options.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceDiagnosticParams", - "properties": [ - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The additional identifier provided during registration." - }, - { - "name": "previousResultIds", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "PreviousResultId" - } - }, - "documentation": "The currently known diagnostic reports with their\nprevious result ids." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters of the workspace diagnostic request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceDiagnosticReport", - "properties": [ - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceDocumentDiagnosticReport" - } - } - } - ], - "documentation": "A workspace diagnostic report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceDiagnosticReportPartialResult", - "properties": [ - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceDocumentDiagnosticReport" - } - } - } - ], - "documentation": "A partial result for a workspace diagnostic report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidOpenNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocument" - }, - "documentation": "The notebook document that got opened." - }, - { - "name": "cellTextDocuments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentItem" - } - }, - "documentation": "The text documents that represent the content\nof a notebook cell." - } - ], - "documentation": "The params sent in an open notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidChangeNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "VersionedNotebookDocumentIdentifier" - }, - "documentation": "The notebook document that did change. The version number points\nto the version after all provided changes have been applied. If\nonly the text document content of a cell changes the notebook version\ndoesn't necessarily have to change." - }, - { - "name": "change", - "type": { - "kind": "reference", - "name": "NotebookDocumentChangeEvent" - }, - "documentation": "The actual changes to the notebook document.\n\nThe changes describe single state changes to the notebook document.\nSo if there are two changes c1 (at array index 0) and c2 (at array\nindex 1) for a notebook in state S then c1 moves the notebook from\nS to S' and c2 from S' to S''. So c1 is computed on the state S and\nc2 is computed on the state S'.\n\nTo mirror the content of a notebook using change events use the following approach:\n- start with the same initial content\n- apply the 'notebookDocument/didChange' notifications in the order you receive them.\n- apply the `NotebookChangeEvent`s in a single notification in the order\n you receive them." - } - ], - "documentation": "The params sent in a change notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidSaveNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocumentIdentifier" - }, - "documentation": "The notebook document that got saved." - } - ], - "documentation": "The params sent in a save notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidCloseNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocumentIdentifier" - }, - "documentation": "The notebook document that got closed." - }, - { - "name": "cellTextDocuments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - }, - "documentation": "The text documents that represent the content\nof a notebook cell that got closed." - } - ], - "documentation": "The params sent in a close notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "RegistrationParams", - "properties": [ - { - "name": "registrations", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Registration" - } - } - } - ] - }, - { - "name": "UnregistrationParams", - "properties": [ - { - "name": "unregisterations", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Unregistration" - } - } - } - ] - }, - { - "name": "InitializeParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "_InitializeParams" - }, - { - "kind": "reference", - "name": "WorkspaceFoldersInitializeParams" - } - ] - }, - { - "name": "InitializeResult", - "properties": [ - { - "name": "capabilities", - "type": { - "kind": "reference", - "name": "ServerCapabilities" - }, - "documentation": "The capabilities the language server provides." - }, - { - "name": "serverInfo", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the server as defined by the server." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The server's version as defined by the server." - } - ] - } - }, - "optional": true, - "documentation": "Information about the server.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "The result returned from an initialize request." - }, - { - "name": "InitializeError", - "properties": [ - { - "name": "retry", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Indicates whether the client execute the following retry logic:\n(1) show the message provided by the ResponseError to the user\n(2) user selects retry or cancel\n(3) if user selected retry the initialize method is sent again." - } - ], - "documentation": "The data type of the ResponseError if the\ninitialize request fails." - }, - { - "name": "InitializedParams", - "properties": [] - }, - { - "name": "DidChangeConfigurationParams", - "properties": [ - { - "name": "settings", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "documentation": "The actual changed settings" - } - ], - "documentation": "The parameters of a change configuration notification." - }, - { - "name": "DidChangeConfigurationRegistrationOptions", - "properties": [ - { - "name": "section", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - } - ] - }, - "optional": true - } - ] - }, - { - "name": "ShowMessageParams", - "properties": [ - { - "name": "type", - "type": { - "kind": "reference", - "name": "MessageType" - }, - "documentation": "The message type. See {@link MessageType}" - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The actual message." - } - ], - "documentation": "The parameters of a notification message." - }, - { - "name": "ShowMessageRequestParams", - "properties": [ - { - "name": "type", - "type": { - "kind": "reference", - "name": "MessageType" - }, - "documentation": "The message type. See {@link MessageType}" - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The actual message." - }, - { - "name": "actions", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MessageActionItem" - } - }, - "optional": true, - "documentation": "The message action items to present." - } - ] - }, - { - "name": "MessageActionItem", - "properties": [ - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A short title like 'Retry', 'Open Log' etc." - } - ] - }, - { - "name": "LogMessageParams", - "properties": [ - { - "name": "type", - "type": { - "kind": "reference", - "name": "MessageType" - }, - "documentation": "The message type. See {@link MessageType}" - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The actual message." - } - ], - "documentation": "The log message parameters." - }, - { - "name": "DidOpenTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentItem" - }, - "documentation": "The document that was opened." - } - ], - "documentation": "The parameters sent in an open text document notification" - }, - { - "name": "DidChangeTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "VersionedTextDocumentIdentifier" - }, - "documentation": "The document that did change. The version number points\nto the version after all provided content changes have\nbeen applied." - }, - { - "name": "contentChanges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentContentChangeEvent" - } - }, - "documentation": "The actual content changes. The content changes describe single state changes\nto the document. So if there are two content changes c1 (at array index 0) and\nc2 (at array index 1) for a document in state S then c1 moves the document from\nS to S' and c2 from S' to S''. So c1 is computed on the state S and c2 is computed\non the state S'.\n\nTo mirror the content of a document using change events use the following approach:\n- start with the same initial content\n- apply the 'textDocument/didChange' notifications in the order you receive them.\n- apply the `TextDocumentContentChangeEvent`s in a single notification in the order\n you receive them." - } - ], - "documentation": "The change text document notification's parameters." - }, - { - "name": "TextDocumentChangeRegistrationOptions", - "properties": [ - { - "name": "syncKind", - "type": { - "kind": "reference", - "name": "TextDocumentSyncKind" - }, - "documentation": "How documents are synced to the server." - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "documentation": "Describe options to be used when registered for text document change events." - }, - { - "name": "DidCloseTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document that was closed." - } - ], - "documentation": "The parameters sent in a close text document notification" - }, - { - "name": "DidSaveTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document that was saved." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional the content when saved. Depends on the includeText value\nwhen the save notification was requested." - } - ], - "documentation": "The parameters sent in a save text document notification" - }, - { - "name": "TextDocumentSaveRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "SaveOptions" - } - ], - "documentation": "Save registration options." - }, - { - "name": "WillSaveTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document that will be saved." - }, - { - "name": "reason", - "type": { - "kind": "reference", - "name": "TextDocumentSaveReason" - }, - "documentation": "The 'TextDocumentSaveReason'." - } - ], - "documentation": "The parameters sent in a will save text document notification." - }, - { - "name": "TextEdit", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range of the text document to be manipulated. To insert\ntext into a document create a range where start === end." - }, - { - "name": "newText", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The string to be inserted. For delete operations use an\nempty string." - } - ], - "documentation": "A text edit applicable to a text document." - }, - { - "name": "DidChangeWatchedFilesParams", - "properties": [ - { - "name": "changes", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileEvent" - } - }, - "documentation": "The actual file events." - } - ], - "documentation": "The watched files change notification's parameters." - }, - { - "name": "DidChangeWatchedFilesRegistrationOptions", - "properties": [ - { - "name": "watchers", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileSystemWatcher" - } - }, - "documentation": "The watchers to register." - } - ], - "documentation": "Describe options to be used when registered for text document change events." - }, - { - "name": "PublishDiagnosticsParams", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which diagnostic information is reported." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "optional": true, - "documentation": "Optional the version number of the document the diagnostics are published for.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "diagnostics", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "documentation": "An array of diagnostic information items." - } - ], - "documentation": "The publish diagnostic notification's parameters." - }, - { - "name": "CompletionParams", - "properties": [ - { - "name": "context", - "type": { - "kind": "reference", - "name": "CompletionContext" - }, - "optional": true, - "documentation": "The completion context. This is only available it the client specifies\nto send this using the client capability `textDocument.completion.contextSupport === true`" - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Completion parameters" - }, - { - "name": "CompletionItem", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The label of this completion item.\n\nThe label property is also by default the text that\nis inserted when selecting this completion.\n\nIf label details are provided the label itself should\nbe an unqualified name of the completion item." - }, - { - "name": "labelDetails", - "type": { - "kind": "reference", - "name": "CompletionItemLabelDetails" - }, - "optional": true, - "documentation": "Additional details for the label\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "CompletionItemKind" - }, - "optional": true, - "documentation": "The kind of this completion item. Based of the kind\nan icon is chosen by the editor." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItemTag" - } - }, - "optional": true, - "documentation": "Tags for this completion item.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string with additional information\nabout this item, like type or symbol information." - }, - { - "name": "documentation", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "A human-readable string that represents a doc-comment." - }, - { - "name": "deprecated", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates if this item is deprecated.\n@deprecated Use `tags` instead.", - "deprecated": "Use `tags` instead." - }, - { - "name": "preselect", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Select this item when showing.\n\n*Note* that only one completion item can be selected and that the\ntool / client decides which item that is. The rule is that the *first*\nitem of those that match best is selected." - }, - { - "name": "sortText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A string that should be used when comparing this item\nwith other items. When `falsy` the {@link CompletionItem.label label}\nis used." - }, - { - "name": "filterText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A string that should be used when filtering a set of\ncompletion items. When `falsy` the {@link CompletionItem.label label}\nis used." - }, - { - "name": "insertText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A string that should be inserted into a document when selecting\nthis completion. When `falsy` the {@link CompletionItem.label label}\nis used.\n\nThe `insertText` is subject to interpretation by the client side.\nSome tools might not take the string literally. For example\nVS Code when code complete is requested in this example\n`con` and a completion item with an `insertText` of\n`console` is provided it will only insert `sole`. Therefore it is\nrecommended to use `textEdit` instead since it avoids additional client\nside interpretation." - }, - { - "name": "insertTextFormat", - "type": { - "kind": "reference", - "name": "InsertTextFormat" - }, - "optional": true, - "documentation": "The format of the insert text. The format applies to both the\n`insertText` property and the `newText` property of a provided\n`textEdit`. If omitted defaults to `InsertTextFormat.PlainText`.\n\nPlease note that the insertTextFormat doesn't apply to\n`additionalTextEdits`." - }, - { - "name": "insertTextMode", - "type": { - "kind": "reference", - "name": "InsertTextMode" - }, - "optional": true, - "documentation": "How whitespace and indentation is handled during completion\nitem insertion. If not provided the clients default value depends on\nthe `textDocument.completion.insertTextMode` client capability.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "textEdit", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextEdit" - }, - { - "kind": "reference", - "name": "InsertReplaceEdit" - } - ] - }, - "optional": true, - "documentation": "An {@link TextEdit edit} which is applied to a document when selecting\nthis completion. When an edit is provided the value of\n{@link CompletionItem.insertText insertText} is ignored.\n\nMost editors support two different operations when accepting a completion\nitem. One is to insert a completion text and the other is to replace an\nexisting text with a completion text. Since this can usually not be\npredetermined by a server it can report both ranges. Clients need to\nsignal support for `InsertReplaceEdits` via the\n`textDocument.completion.insertReplaceSupport` client capability\nproperty.\n\n*Note 1:* The text edit's range as well as both ranges from an insert\nreplace edit must be a [single line] and they must contain the position\nat which completion has been requested.\n*Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range\nmust be a prefix of the edit's replace range, that means it must be\ncontained and starting at the same position.\n\n@since 3.16.0 additional type `InsertReplaceEdit`", - "since": "3.16.0 additional type `InsertReplaceEdit`" - }, - { - "name": "textEditText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The edit text used if the completion item is part of a CompletionList and\nCompletionList defines an item default for the text edit range.\n\nClients will only honor this property if they opt into completion list\nitem defaults using the capability `completionList.itemDefaults`.\n\nIf not provided and a list's default range is provided the label\nproperty is used as a text.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "additionalTextEdits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - "optional": true, - "documentation": "An optional array of additional {@link TextEdit text edits} that are applied when\nselecting this completion. Edits must not overlap (including the same insert position)\nwith the main {@link CompletionItem.textEdit edit} nor with themselves.\n\nAdditional text edits should be used to change text unrelated to the current cursor position\n(for example adding an import statement at the top of the file if the completion item will\ninsert an unqualified type)." - }, - { - "name": "commitCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "An optional set of characters that when pressed while this completion is active will accept it first and\nthen type that character. *Note* that all commit characters should have `length=1` and that superfluous\ncharacters will be ignored." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "An optional {@link Command command} that is executed *after* inserting this completion. *Note* that\nadditional modifications to the current document should be described with the\n{@link CompletionItem.additionalTextEdits additionalTextEdits}-property." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a completion item between a\n{@link CompletionRequest} and a {@link CompletionResolveRequest}." - } - ], - "documentation": "A completion item represents a text snippet that is\nproposed to complete text that is being typed." - }, - { - "name": "CompletionList", - "properties": [ - { - "name": "isIncomplete", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "This list it not complete. Further typing results in recomputing this list.\n\nRecomputed lists have all their items replaced (not appended) in the\nincomplete completion sessions." - }, - { - "name": "itemDefaults", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "commitCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "A default commit character set.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "editRange", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Range" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "insert", - "type": { - "kind": "reference", - "name": "Range" - } - }, - { - "name": "replace", - "type": { - "kind": "reference", - "name": "Range" - } - } - ] - } - } - ] - }, - "optional": true, - "documentation": "A default edit range.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "insertTextFormat", - "type": { - "kind": "reference", - "name": "InsertTextFormat" - }, - "optional": true, - "documentation": "A default insert text format.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "insertTextMode", - "type": { - "kind": "reference", - "name": "InsertTextMode" - }, - "optional": true, - "documentation": "A default insert text mode.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A default data value.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "In many cases the items of an actual completion result share the same\nvalue for properties like `commitCharacters` or the range of a text\nedit. A completion list can therefore define item defaults which will\nbe used if a completion item itself doesn't specify the value.\n\nIf a completion list specifies a default value and a completion item\nalso specifies a corresponding value the one from the item is used.\n\nServers are only allowed to return default values if the client\nsignals support for this via the `completionList.itemDefaults`\ncapability.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItem" - } - }, - "documentation": "The completion items." - } - ], - "documentation": "Represents a collection of {@link CompletionItem completion items} to be presented\nin the editor." - }, - { - "name": "CompletionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CompletionOptions" - } - ], - "documentation": "Registration options for a {@link CompletionRequest}." - }, - { - "name": "HoverParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "Parameters for a {@link HoverRequest}." - }, - { - "name": "Hover", - "properties": [ - { - "name": "contents", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "MarkupContent" - }, - { - "kind": "reference", - "name": "MarkedString" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkedString" - } - } - ] - }, - "documentation": "The hover's content" - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "optional": true, - "documentation": "An optional range inside the text document that is used to\nvisualize the hover, e.g. by changing the background color." - } - ], - "documentation": "The result of a hover request." - }, - { - "name": "HoverRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "HoverOptions" - } - ], - "documentation": "Registration options for a {@link HoverRequest}." - }, - { - "name": "SignatureHelpParams", - "properties": [ - { - "name": "context", - "type": { - "kind": "reference", - "name": "SignatureHelpContext" - }, - "optional": true, - "documentation": "The signature help context. This is only available if the client specifies\nto send this using the client capability `textDocument.signatureHelp.contextSupport === true`\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "Parameters for a {@link SignatureHelpRequest}." - }, - { - "name": "SignatureHelp", - "properties": [ - { - "name": "signatures", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SignatureInformation" - } - }, - "documentation": "One or more signatures." - }, - { - "name": "activeSignature", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The active signature. If omitted or the value lies outside the\nrange of `signatures` the value defaults to zero or is ignored if\nthe `SignatureHelp` has no signatures.\n\nWhenever possible implementors should make an active decision about\nthe active signature and shouldn't rely on a default value.\n\nIn future version of the protocol this property might become\nmandatory to better express this." - }, - { - "name": "activeParameter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The active parameter of the active signature. If omitted or the value\nlies outside the range of `signatures[activeSignature].parameters`\ndefaults to 0 if the active signature has parameters. If\nthe active signature has no parameters it is ignored.\nIn future version of the protocol this property might become\nmandatory to better express the active parameter if the\nactive signature does have any." - } - ], - "documentation": "Signature help represents the signature of something\ncallable. There can be multiple signature but only one\nactive and only one active parameter." - }, - { - "name": "SignatureHelpRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "SignatureHelpOptions" - } - ], - "documentation": "Registration options for a {@link SignatureHelpRequest}." - }, - { - "name": "DefinitionParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DefinitionRequest}." - }, - { - "name": "DefinitionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DefinitionOptions" - } - ], - "documentation": "Registration options for a {@link DefinitionRequest}." - }, - { - "name": "ReferenceParams", - "properties": [ - { - "name": "context", - "type": { - "kind": "reference", - "name": "ReferenceContext" - } - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link ReferencesRequest}." - }, - { - "name": "ReferenceRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "ReferenceOptions" - } - ], - "documentation": "Registration options for a {@link ReferencesRequest}." - }, - { - "name": "DocumentHighlightParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DocumentHighlightRequest}." - }, - { - "name": "DocumentHighlight", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range this highlight applies to." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "DocumentHighlightKind" - }, - "optional": true, - "documentation": "The highlight kind, default is {@link DocumentHighlightKind.Text text}." - } - ], - "documentation": "A document highlight is a range inside a text document which deserves\nspecial attention. Usually a document highlight is visualized by changing\nthe background color of its range." - }, - { - "name": "DocumentHighlightRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentHighlightOptions" - } - ], - "documentation": "Registration options for a {@link DocumentHighlightRequest}." - }, - { - "name": "DocumentSymbolParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DocumentSymbolRequest}." - }, - { - "name": "SymbolInformation", - "properties": [ - { - "name": "deprecated", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates if this symbol is deprecated.\n\n@deprecated Use tags instead", - "deprecated": "Use tags instead" - }, - { - "name": "location", - "type": { - "kind": "reference", - "name": "Location" - }, - "documentation": "The location of this symbol. The location's range is used by a tool\nto reveal the location in the editor. If the symbol is selected in the\ntool the range's start information is used to position the cursor. So\nthe range usually spans more than the actual symbol's name and does\nnormally include things like visibility modifiers.\n\nThe range doesn't have to denote a node range in the sense of an abstract\nsyntax tree. It can therefore not be used to re-construct a hierarchy of\nthe symbols." - } - ], - "extends": [ - { - "kind": "reference", - "name": "BaseSymbolInformation" - } - ], - "documentation": "Represents information about programming constructs like variables, classes,\ninterfaces etc." - }, - { - "name": "DocumentSymbol", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this symbol. Will be displayed in the user interface and therefore must not be\nan empty string or a string only consisting of white spaces." - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "More detail for this symbol, e.g the signature of a function." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this symbol." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this document symbol.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "deprecated", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates if this symbol is deprecated.\n\n@deprecated Use tags instead", - "deprecated": "Use tags instead" - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range enclosing this symbol not including leading/trailing whitespace but everything else\nlike comments. This information is typically used to determine if the clients cursor is\ninside the symbol to reveal in the symbol in the UI." - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.\nMust be contained by the `range`." - }, - { - "name": "children", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentSymbol" - } - }, - "optional": true, - "documentation": "Children of this symbol, e.g. properties of a class." - } - ], - "documentation": "Represents programming constructs like variables, classes, interfaces etc.\nthat appear in a document. Document symbols can be hierarchical and they\nhave two ranges: one that encloses its definition and one that points to\nits most interesting range, e.g. the range of an identifier." - }, - { - "name": "DocumentSymbolRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentSymbolOptions" - } - ], - "documentation": "Registration options for a {@link DocumentSymbolRequest}." - }, - { - "name": "CodeActionParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document in which the command was invoked." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range for which the command was invoked." - }, - { - "name": "context", - "type": { - "kind": "reference", - "name": "CodeActionContext" - }, - "documentation": "Context carrying additional information." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link CodeActionRequest}." - }, - { - "name": "Command", - "properties": [ - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "Title of the command, like `save`." - }, - { - "name": "command", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The identifier of the actual command handler." - }, - { - "name": "arguments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "optional": true, - "documentation": "Arguments that the command handler should be\ninvoked with." - } - ], - "documentation": "Represents a reference to a command. Provides a title which\nwill be used to represent a command in the UI and, optionally,\nan array of arguments which will be passed to the command handler\nfunction when invoked." - }, - { - "name": "CodeAction", - "properties": [ - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A short, human-readable, title for this code action." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "CodeActionKind" - }, - "optional": true, - "documentation": "The kind of the code action.\n\nUsed to filter code actions." - }, - { - "name": "diagnostics", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "optional": true, - "documentation": "The diagnostics that this code action resolves." - }, - { - "name": "isPreferred", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted\nby keybindings.\n\nA quick fix should be marked preferred if it properly addresses the underlying error.\nA refactoring should be marked preferred if it is the most reasonable choice of actions to take.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "disabled", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "reason", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "Human readable description of why the code action is currently disabled.\n\nThis is displayed in the code actions UI." - } - ] - } - }, - "optional": true, - "documentation": "Marks that the code action cannot currently be applied.\n\nClients should follow the following guidelines regarding disabled code actions:\n\n - Disabled code actions are not shown in automatic [lightbulbs](https://code.visualstudio.com/docs/editor/editingevolved#_code-action)\n code action menus.\n\n - Disabled actions are shown as faded out in the code action menu when the user requests a more specific type\n of code action, such as refactorings.\n\n - If the user has a [keybinding](https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions)\n that auto applies a code action and only disabled code actions are returned, the client should show the user an\n error message with `reason` in the editor.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "edit", - "type": { - "kind": "reference", - "name": "WorkspaceEdit" - }, - "optional": true, - "documentation": "The workspace edit this code action performs." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "A command this code action executes. If a code action\nprovides an edit and a command, first the edit is\nexecuted and then the command." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a code action between\na `textDocument/codeAction` and a `codeAction/resolve` request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "A code action represents a change that can be performed in code, e.g. to fix a problem or\nto refactor code.\n\nA CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed." - }, - { - "name": "CodeActionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CodeActionOptions" - } - ], - "documentation": "Registration options for a {@link CodeActionRequest}." - }, - { - "name": "WorkspaceSymbolParams", - "properties": [ - { - "name": "query", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A query string to filter symbols by. Clients may send an empty\nstring here to request all symbols." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link WorkspaceSymbolRequest}." - }, - { - "name": "WorkspaceSymbol", - "properties": [ - { - "name": "location", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Location" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - } - } - ] - } - } - ] - }, - "documentation": "The location of the symbol. Whether a server is allowed to\nreturn a location without a range depends on the client\ncapability `workspace.symbol.resolveSupport`.\n\nSee SymbolInformation#location for more details." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a workspace symbol between a\nworkspace symbol request and a workspace symbol resolve request." - } - ], - "extends": [ - { - "kind": "reference", - "name": "BaseSymbolInformation" - } - ], - "documentation": "A special workspace symbol that supports locations without a range.\n\nSee also SymbolInformation.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceSymbolRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "WorkspaceSymbolOptions" - } - ], - "documentation": "Registration options for a {@link WorkspaceSymbolRequest}." - }, - { - "name": "CodeLensParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to request code lens for." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link CodeLensRequest}." - }, - { - "name": "CodeLens", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range in which this code lens is valid. Should only span a single line." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "The command this code lens represents." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a code lens item between\na {@link CodeLensRequest} and a [CodeLensResolveRequest]\n(#CodeLensResolveRequest)" - } - ], - "documentation": "A code lens represents a {@link Command command} that should be shown along with\nsource text, like the number of references, a way to run tests, etc.\n\nA code lens is _unresolved_ when no command is associated to it. For performance\nreasons the creation of a code lens and resolving should be done in two stages." - }, - { - "name": "CodeLensRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CodeLensOptions" - } - ], - "documentation": "Registration options for a {@link CodeLensRequest}." - }, - { - "name": "DocumentLinkParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to provide document links for." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link DocumentLinkRequest}." - }, - { - "name": "DocumentLink", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range this link applies to." - }, - { - "name": "target", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The uri this link points to. If missing a resolve request is sent later." - }, - { - "name": "tooltip", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The tooltip text when you hover over this link.\n\nIf a tooltip is provided, is will be displayed in a string that includes instructions on how to\ntrigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,\nuser settings, and localization.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a document link between a\nDocumentLinkRequest and a DocumentLinkResolveRequest." - } - ], - "documentation": "A document link is a range in a text document that links to an internal or external resource, like another\ntext document or a web site." - }, - { - "name": "DocumentLinkRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentLinkOptions" - } - ], - "documentation": "Registration options for a {@link DocumentLinkRequest}." - }, - { - "name": "DocumentFormattingParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to format." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FormattingOptions" - }, - "documentation": "The format options." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentFormattingRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentFormattingOptions" - } - ], - "documentation": "Registration options for a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to format." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range to format" - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FormattingOptions" - }, - "documentation": "The format options" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentRangeFormattingOptions" - } - ], - "documentation": "Registration options for a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to format." - }, - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position around which the on type formatting should happen.\nThis is not necessarily the exact position where the character denoted\nby the property `ch` got typed." - }, - { - "name": "ch", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The character that has been typed that triggered the formatting\non type request. That is not necessarily the last character that\ngot inserted into the document since the client could auto insert\ncharacters as well (e.g. like automatic brace completion)." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FormattingOptions" - }, - "documentation": "The formatting options." - } - ], - "documentation": "The parameters of a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentOnTypeFormattingOptions" - } - ], - "documentation": "Registration options for a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "RenameParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to rename." - }, - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position at which this request was sent." - }, - { - "name": "newName", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The new name of the symbol. If the given name is not valid the\nrequest must return a {@link ResponseError} with an\nappropriate message set." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link RenameRequest}." - }, - { - "name": "RenameRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "RenameOptions" - } - ], - "documentation": "Registration options for a {@link RenameRequest}." - }, - { - "name": "PrepareRenameParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ] - }, - { - "name": "ExecuteCommandParams", - "properties": [ - { - "name": "command", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The identifier of the actual command handler." - }, - { - "name": "arguments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "optional": true, - "documentation": "Arguments that the command should be invoked with." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link ExecuteCommandRequest}." - }, - { - "name": "ExecuteCommandRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "ExecuteCommandOptions" - } - ], - "documentation": "Registration options for a {@link ExecuteCommandRequest}." - }, - { - "name": "ApplyWorkspaceEditParams", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional label of the workspace edit. This label is\npresented in the user interface for example on an undo\nstack to undo the workspace edit." - }, - { - "name": "edit", - "type": { - "kind": "reference", - "name": "WorkspaceEdit" - }, - "documentation": "The edits to apply." - } - ], - "documentation": "The parameters passed via a apply workspace edit request." - }, - { - "name": "ApplyWorkspaceEditResult", - "properties": [ - { - "name": "applied", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Indicates whether the edit was applied or not." - }, - { - "name": "failureReason", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional textual description for why the edit was not applied.\nThis may be used by the server for diagnostic logging or to provide\na suitable error for a request that triggered the edit." - }, - { - "name": "failedChange", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "Depending on the client's failure handling strategy `failedChange` might\ncontain the index of the change that failed. This property is only available\nif the client signals a `failureHandlingStrategy` in its client capabilities." - } - ], - "documentation": "The result returned from the apply workspace edit request.\n\n@since 3.17 renamed from ApplyWorkspaceEditResponse", - "since": "3.17 renamed from ApplyWorkspaceEditResponse" - }, - { - "name": "WorkDoneProgressBegin", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "begin" - } - }, - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "Mandatory title of the progress operation. Used to briefly inform about\nthe kind of operation being performed.\n\nExamples: \"Indexing\" or \"Linking dependencies\"." - }, - { - "name": "cancellable", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Controls if a cancel button should show to allow the user to cancel the\nlong running operation. Clients that don't support cancellation are allowed\nto ignore the setting." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional, more detailed associated progress message. Contains\ncomplementary information to the `title`.\n\nExamples: \"3/25 files\", \"project/src/module2\", \"node_modules/some_dep\".\nIf unset, the previous progress message (if any) is still valid." - }, - { - "name": "percentage", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "Optional progress percentage to display (value 100 is considered 100%).\nIf not provided infinite progress is assumed and clients are allowed\nto ignore the `percentage` value in subsequent in report notifications.\n\nThe value should be steadily rising. Clients are free to ignore values\nthat are not following this rule. The value range is [0, 100]." - } - ] - }, - { - "name": "WorkDoneProgressReport", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "report" - } - }, - { - "name": "cancellable", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Controls enablement state of a cancel button.\n\nClients that don't support cancellation or don't support controlling the button's\nenablement state are allowed to ignore the property." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional, more detailed associated progress message. Contains\ncomplementary information to the `title`.\n\nExamples: \"3/25 files\", \"project/src/module2\", \"node_modules/some_dep\".\nIf unset, the previous progress message (if any) is still valid." - }, - { - "name": "percentage", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "Optional progress percentage to display (value 100 is considered 100%).\nIf not provided infinite progress is assumed and clients are allowed\nto ignore the `percentage` value in subsequent in report notifications.\n\nThe value should be steadily rising. Clients are free to ignore values\nthat are not following this rule. The value range is [0, 100]" - } - ] - }, - { - "name": "WorkDoneProgressEnd", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "end" - } - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional, a final message indicating to for example indicate the outcome\nof the operation." - } - ] - }, - { - "name": "SetTraceParams", - "properties": [ - { - "name": "value", - "type": { - "kind": "reference", - "name": "TraceValues" - } - } - ] - }, - { - "name": "LogTraceParams", - "properties": [ - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - } - }, - { - "name": "verbose", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true - } - ] - }, - { - "name": "CancelParams", - "properties": [ - { - "name": "id", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "string" - } - ] - }, - "documentation": "The request id to cancel." - } - ] - }, - { - "name": "ProgressParams", - "properties": [ - { - "name": "token", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "documentation": "The progress token provided by the client or server." - }, - { - "name": "value", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "documentation": "The progress data." - } - ] - }, - { - "name": "TextDocumentPositionParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position inside the text document." - } - ], - "documentation": "A parameter literal used in requests to pass a text document and a position inside that\ndocument." - }, - { - "name": "WorkDoneProgressParams", - "properties": [ - { - "name": "workDoneToken", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "optional": true, - "documentation": "An optional token that a server can use to report work done progress." - } - ] - }, - { - "name": "PartialResultParams", - "properties": [ - { - "name": "partialResultToken", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "optional": true, - "documentation": "An optional token that a server can use to report partial results (e.g. streaming) to\nthe client." - } - ] - }, - { - "name": "LocationLink", - "properties": [ - { - "name": "originSelectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "optional": true, - "documentation": "Span of the origin of this link.\n\nUsed as the underlined span for mouse interaction. Defaults to the word range at\nthe definition position." - }, - { - "name": "targetUri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The target resource identifier of this link." - }, - { - "name": "targetRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The full target range of this link. If the target for example is a symbol then target range is the\nrange enclosing this symbol not including leading/trailing whitespace but everything else\nlike comments. This information is typically used to highlight the range in the editor." - }, - { - "name": "targetSelectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this link is being followed, e.g the name of a function.\nMust be contained by the `targetRange`. See also `DocumentSymbol#range`" - } - ], - "documentation": "Represents the connection of two locations. Provides additional metadata over normal {@link Location locations},\nincluding an origin range." - }, - { - "name": "Range", - "properties": [ - { - "name": "start", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The range's start position." - }, - { - "name": "end", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The range's end position." - } - ], - "documentation": "A range in a text document expressed as (zero-based) start and end positions.\n\nIf you want to specify a range that contains a line including the line ending\ncharacter(s) then use an end position denoting the start of the next line.\nFor example:\n```ts\n{\n start: { line: 5, character: 23 }\n end : { line 6, character : 0 }\n}\n```" - }, - { - "name": "ImplementationOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "StaticRegistrationOptions", - "properties": [ - { - "name": "id", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The id used to register the request. The id can be used to deregister\nthe request again. See also Registration#id." - } - ], - "documentation": "Static registration options to be returned in the initialize\nrequest." - }, - { - "name": "TypeDefinitionOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "WorkspaceFoldersChangeEvent", - "properties": [ - { - "name": "added", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - "documentation": "The array of added workspace folders" - }, - { - "name": "removed", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - "documentation": "The array of the removed workspace folders" - } - ], - "documentation": "The workspace folder change event." - }, - { - "name": "ConfigurationItem", - "properties": [ - { - "name": "scopeUri", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The scope to get the configuration section for." - }, - { - "name": "section", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The configuration section asked for." - } - ] - }, - { - "name": "TextDocumentIdentifier", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The text document's uri." - } - ], - "documentation": "A literal to identify a text document in the client." - }, - { - "name": "Color", - "properties": [ - { - "name": "red", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The red component of this color in the range [0-1]." - }, - { - "name": "green", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The green component of this color in the range [0-1]." - }, - { - "name": "blue", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The blue component of this color in the range [0-1]." - }, - { - "name": "alpha", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The alpha component of this color in the range [0-1]." - } - ], - "documentation": "Represents a color in RGBA space." - }, - { - "name": "DocumentColorOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "FoldingRangeOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "DeclarationOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "Position", - "properties": [ - { - "name": "line", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "Line position in a document (zero-based).\n\nIf a line number is greater than the number of lines in a document, it defaults back to the number of lines in the document.\nIf a line number is negative, it defaults to 0." - }, - { - "name": "character", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "Character offset on a line in a document (zero-based).\n\nThe meaning of this offset is determined by the negotiated\n`PositionEncodingKind`.\n\nIf the character value is greater than the line length it defaults back to the\nline length." - } - ], - "documentation": "Position in a text document expressed as zero-based line and character\noffset. Prior to 3.17 the offsets were always based on a UTF-16 string\nrepresentation. So a string of the form `a𐐀b` the character offset of the\ncharacter `a` is 0, the character offset of `𐐀` is 1 and the character\noffset of b is 3 since `𐐀` is represented using two code units in UTF-16.\nSince 3.17 clients and servers can agree on a different string encoding\nrepresentation (e.g. UTF-8). The client announces it's supported encoding\nvia the client capability [`general.positionEncodings`](#clientCapabilities).\nThe value is an array of position encodings the client supports, with\ndecreasing preference (e.g. the encoding at index `0` is the most preferred\none). To stay backwards compatible the only mandatory encoding is UTF-16\nrepresented via the string `utf-16`. The server can pick one of the\nencodings offered by the client and signals that encoding back to the\nclient via the initialize result's property\n[`capabilities.positionEncoding`](#serverCapabilities). If the string value\n`utf-16` is missing from the client's capability `general.positionEncodings`\nservers can safely assume that the client supports UTF-16. If the server\nomits the position encoding in its initialize result the encoding defaults\nto the string value `utf-16`. Implementation considerations: since the\nconversion from one encoding into another requires the content of the\nfile / line the conversion is best done where the file is read which is\nusually on the server side.\n\nPositions are line end character agnostic. So you can not specify a position\nthat denotes `\\r|\\n` or `\\n|` where `|` represents the character offset.\n\n@since 3.17.0 - support for negotiated position encoding.", - "since": "3.17.0 - support for negotiated position encoding." - }, - { - "name": "SelectionRangeOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "CallHierarchyOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Call hierarchy options used during static registration.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensOptions", - "properties": [ - { - "name": "legend", - "type": { - "kind": "reference", - "name": "SemanticTokensLegend" - }, - "documentation": "The legend used by the server" - }, - { - "name": "range", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [] - } - } - ] - }, - "optional": true, - "documentation": "Server supports providing semantic tokens for a specific range\nof a document." - }, - { - "name": "full", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "delta", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server supports deltas for full documents." - } - ] - } - } - ] - }, - "optional": true, - "documentation": "Server supports providing semantic tokens for a full document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensEdit", - "properties": [ - { - "name": "start", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The start offset of the edit." - }, - { - "name": "deleteCount", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The count of elements to remove." - }, - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "uinteger" - } - }, - "optional": true, - "documentation": "The elements to insert." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "FileCreate", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the location of the file/folder being created." - } - ], - "documentation": "Represents information on a file/folder create.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "TextDocumentEdit", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "OptionalVersionedTextDocumentIdentifier" - }, - "documentation": "The text document to change." - }, - { - "name": "edits", - "type": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextEdit" - }, - { - "kind": "reference", - "name": "AnnotatedTextEdit" - } - ] - } - }, - "documentation": "The edits to be applied.\n\n@since 3.16.0 - support for AnnotatedTextEdit. This is guarded using a\nclient capability.", - "since": "3.16.0 - support for AnnotatedTextEdit. This is guarded using a\nclient capability." - } - ], - "documentation": "Describes textual changes on a text document. A TextDocumentEdit describes all changes\non a document version Si and after they are applied move the document to version Si+1.\nSo the creator of a TextDocumentEdit doesn't need to sort the array of edits or do any\nkind of ordering. However the edits must be non overlapping." - }, - { - "name": "CreateFile", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "create" - }, - "documentation": "A create" - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The resource to create." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "CreateFileOptions" - }, - "optional": true, - "documentation": "Additional options" - } - ], - "extends": [ - { - "kind": "reference", - "name": "ResourceOperation" - } - ], - "documentation": "Create file operation." - }, - { - "name": "RenameFile", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "rename" - }, - "documentation": "A rename" - }, - { - "name": "oldUri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The old (existing) location." - }, - { - "name": "newUri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The new location." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "RenameFileOptions" - }, - "optional": true, - "documentation": "Rename options." - } - ], - "extends": [ - { - "kind": "reference", - "name": "ResourceOperation" - } - ], - "documentation": "Rename file operation" - }, - { - "name": "DeleteFile", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "delete" - }, - "documentation": "A delete" - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The file to delete." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "DeleteFileOptions" - }, - "optional": true, - "documentation": "Delete options." - } - ], - "extends": [ - { - "kind": "reference", - "name": "ResourceOperation" - } - ], - "documentation": "Delete file operation" - }, - { - "name": "ChangeAnnotation", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A human-readable string describing the actual change. The string\nis rendered prominent in the user interface." - }, - { - "name": "needsConfirmation", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "A flag which indicates that user confirmation is needed\nbefore applying the change." - }, - { - "name": "description", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string which is rendered less prominent in\nthe user interface." - } - ], - "documentation": "Additional information that describes document changes.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileOperationFilter", - "properties": [ - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri scheme like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "reference", - "name": "FileOperationPattern" - }, - "documentation": "The actual file operation pattern." - } - ], - "documentation": "A filter to describe in which file operation requests or notifications\nthe server is interested in receiving.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileRename", - "properties": [ - { - "name": "oldUri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the original location of the file/folder being renamed." - }, - { - "name": "newUri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the new location of the file/folder being renamed." - } - ], - "documentation": "Represents information on a file/folder rename.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileDelete", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the location of the file/folder being deleted." - } - ], - "documentation": "Represents information on a file/folder delete.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "TypeHierarchyOptions", - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "properties": [], - "documentation": "Type hierarchy options used during static registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueContext", - "properties": [ - { - "name": "frameId", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The stack frame (as a DAP Id) where the execution has stopped." - }, - { - "name": "stoppedLocation", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range where execution has stopped.\nTypically the end position of the range denotes the line where the inline values are shown." - } - ], - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueText", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which the inline value applies." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The text of the inline value." - } - ], - "documentation": "Provide inline value as text.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueVariableLookup", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which the inline value applies.\nThe range is used to extract the variable name from the underlying document." - }, - { - "name": "variableName", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "If specified the name of the variable to look up." - }, - { - "name": "caseSensitiveLookup", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "How to perform the lookup." - } - ], - "documentation": "Provide inline value through a variable lookup.\nIf only a range is specified, the variable name will be extracted from the underlying document.\nAn optional variable name can be used to override the extracted name.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueEvaluatableExpression", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which the inline value applies.\nThe range is used to extract the evaluatable expression from the underlying document." - }, - { - "name": "expression", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "If specified the expression overrides the extracted expression." - } - ], - "documentation": "Provide an inline value through an expression evaluation.\nIf only a range is specified, the expression will be extracted from the underlying document.\nAn optional expression can be used to override the extracted expression.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueOptions", - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "properties": [], - "documentation": "Inline value options used during static registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintLabelPart", - "properties": [ - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The value of this label part." - }, - { - "name": "tooltip", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The tooltip text when you hover over this label part. Depending on\nthe client capability `inlayHint.resolveSupport` clients might resolve\nthis property late using the resolve request." - }, - { - "name": "location", - "type": { - "kind": "reference", - "name": "Location" - }, - "optional": true, - "documentation": "An optional source code location that represents this\nlabel part.\n\nThe editor will use this location for the hover and for code navigation\nfeatures: This part will become a clickable link that resolves to the\ndefinition of the symbol at the given location (not necessarily the\nlocation itself), it shows the hover that shows at the given location,\nand it shows a context menu with further code navigation commands.\n\nDepending on the client capability `inlayHint.resolveSupport` clients\nmight resolve this property late using the resolve request." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "An optional command for this label part.\n\nDepending on the client capability `inlayHint.resolveSupport` clients\nmight resolve this property late using the resolve request." - } - ], - "documentation": "An inlay hint label part allows for interactive and composite labels\nof inlay hints.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "MarkupContent", - "properties": [ - { - "name": "kind", - "type": { - "kind": "reference", - "name": "MarkupKind" - }, - "documentation": "The type of the Markup" - }, - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The content itself" - } - ], - "documentation": "A `MarkupContent` literal represents a string value which content is interpreted base on its\nkind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.\n\nIf the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.\nSee https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting\n\nHere is an example how such a string can be constructed using JavaScript / TypeScript:\n```ts\nlet markdown: MarkdownContent = {\n kind: MarkupKind.Markdown,\n value: [\n '# Header',\n 'Some text',\n '```typescript',\n 'someCode();',\n '```'\n ].join('\\n')\n};\n```\n\n*Please Note* that clients might sanitize the return markdown. A client could decide to\nremove HTML from the markdown to avoid script execution." - }, - { - "name": "InlayHintOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for an inlay hint item." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Inlay hint options used during static registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "RelatedFullDocumentDiagnosticReport", - "properties": [ - { - "name": "relatedDocuments", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ] - } - }, - "optional": true, - "documentation": "Diagnostics of related documents. This information is useful\nin programming languages where code in a file A can generate\ndiagnostics in a file B which A depends on. An example of\nsuch a language is C/C++ where marco definitions in a file\na.cpp and result in errors in a header file b.hpp.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "extends": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - } - ], - "documentation": "A full diagnostic report with a set of related documents.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "RelatedUnchangedDocumentDiagnosticReport", - "properties": [ - { - "name": "relatedDocuments", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ] - } - }, - "optional": true, - "documentation": "Diagnostics of related documents. This information is useful\nin programming languages where code in a file A can generate\ndiagnostics in a file B which A depends on. An example of\nsuch a language is C/C++ where marco definitions in a file\na.cpp and result in errors in a header file b.hpp.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "extends": [ - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ], - "documentation": "An unchanged diagnostic report with a set of related documents.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FullDocumentDiagnosticReport", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "full" - }, - "documentation": "A full document diagnostic report." - }, - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional result id. If provided it will\nbe sent on the next diagnostic request for the\nsame document." - }, - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "documentation": "The actual items." - } - ], - "documentation": "A diagnostic report with a full set of problems.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "UnchangedDocumentDiagnosticReport", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "unchanged" - }, - "documentation": "A document diagnostic report indicating\nno changes to the last result. A server can\nonly return `unchanged` if result ids are\nprovided." - }, - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A result id which will be sent on the next\ndiagnostic request for the same document." - } - ], - "documentation": "A diagnostic report indicating that the last returned\nreport is still accurate.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticOptions", - "properties": [ - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional identifier under which the diagnostics are\nmanaged by the client." - }, - { - "name": "interFileDependencies", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Whether the language has inter file dependencies meaning that\nediting code in one file can result in a different diagnostic\nset in another file. Inter file dependencies are common for\nmost programming languages and typically uncommon for linters." - }, - { - "name": "workspaceDiagnostics", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "The server provides support for workspace diagnostics as well." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Diagnostic options.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "PreviousResultId", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which the client knowns a\nresult id." - }, - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The value of the previous result id." - } - ], - "documentation": "A previous result id in a workspace pull request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocument", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The notebook document's uri." - }, - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The type of the notebook." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this document (it will increase after each\nchange, including undo/redo)." - }, - { - "name": "metadata", - "type": { - "kind": "reference", - "name": "LSPObject" - }, - "optional": true, - "documentation": "Additional metadata stored with the notebook\ndocument.\n\nNote: should always be an object literal (e.g. LSPObject)" - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "NotebookCell" - } - }, - "documentation": "The cells of a notebook." - } - ], - "documentation": "A notebook document.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentItem", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The text document's uri." - }, - { - "name": "languageId", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The text document's language identifier." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this document (it will increase after each\nchange, including undo/redo)." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The content of the opened text document." - } - ], - "documentation": "An item to transfer a text document from the client to the\nserver." - }, - { - "name": "VersionedNotebookDocumentIdentifier", - "properties": [ - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this notebook document." - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The notebook document's uri." - } - ], - "documentation": "A versioned notebook document identifier.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentChangeEvent", - "properties": [ - { - "name": "metadata", - "type": { - "kind": "reference", - "name": "LSPObject" - }, - "optional": true, - "documentation": "The changed meta data if any.\n\nNote: should always be an object literal (e.g. LSPObject)" - }, - { - "name": "cells", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "structure", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "array", - "type": { - "kind": "reference", - "name": "NotebookCellArrayChange" - }, - "documentation": "The change to the cell array." - }, - { - "name": "didOpen", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentItem" - } - }, - "optional": true, - "documentation": "Additional opened cell text documents." - }, - { - "name": "didClose", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - }, - "optional": true, - "documentation": "Additional closed cell text documents." - } - ] - } - }, - "optional": true, - "documentation": "Changes to the cell structure to add or\nremove cells." - }, - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "NotebookCell" - } - }, - "optional": true, - "documentation": "Changes to notebook cells properties like its\nkind, execution summary or metadata." - }, - { - "name": "textContent", - "type": { - "kind": "array", - "element": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "document", - "type": { - "kind": "reference", - "name": "VersionedTextDocumentIdentifier" - } - }, - { - "name": "changes", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentContentChangeEvent" - } - } - } - ] - } - } - }, - "optional": true, - "documentation": "Changes to the text content of notebook cells." - } - ] - } - }, - "optional": true, - "documentation": "Changes to cells" - } - ], - "documentation": "A change event for a notebook document.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentIdentifier", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The notebook document's uri." - } - ], - "documentation": "A literal to identify a notebook document in the client.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "Registration", - "properties": [ - { - "name": "id", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The id used to register the request. The id can be used to deregister\nthe request again." - }, - { - "name": "method", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The method / capability to register for." - }, - { - "name": "registerOptions", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "Options necessary for the registration." - } - ], - "documentation": "General parameters to to register for an notification or to register a provider." - }, - { - "name": "Unregistration", - "properties": [ - { - "name": "id", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The id used to unregister the request or notification. Usually an id\nprovided during the register request." - }, - { - "name": "method", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The method to unregister for." - } - ], - "documentation": "General parameters to unregister a request or notification." - }, - { - "name": "_InitializeParams", - "properties": [ - { - "name": "processId", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The process Id of the parent process that started\nthe server.\n\nIs `null` if the process has not been started by another process.\nIf the parent process is not alive then the server should exit." - }, - { - "name": "clientInfo", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the client as defined by the client." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The client's version as defined by the client." - } - ] - } - }, - "optional": true, - "documentation": "Information about the client\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "locale", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The locale the client is currently showing the user interface\nin. This must not necessarily be the locale of the operating\nsystem.\n\nUses IETF language tags as the value's syntax\n(See https://en.wikipedia.org/wiki/IETF_language_tag)\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "rootPath", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "optional": true, - "documentation": "The rootPath of the workspace. Is null\nif no folder is open.\n\n@deprecated in favour of rootUri.", - "deprecated": "in favour of rootUri." - }, - { - "name": "rootUri", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "DocumentUri" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The rootUri of the workspace. Is null if no\nfolder is open. If both `rootPath` and `rootUri` are set\n`rootUri` wins.\n\n@deprecated in favour of workspaceFolders.", - "deprecated": "in favour of workspaceFolders." - }, - { - "name": "capabilities", - "type": { - "kind": "reference", - "name": "ClientCapabilities" - }, - "documentation": "The capabilities provided by the client (editor or tool)" - }, - { - "name": "initializationOptions", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "User provided initialization options." - }, - { - "name": "trace", - "type": { - "kind": "reference", - "name": "TraceValues" - }, - "optional": true, - "documentation": "The initial trace setting. If omitted trace is disabled ('off')." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The initialize parameters" - }, - { - "name": "WorkspaceFoldersInitializeParams", - "properties": [ - { - "name": "workspaceFolders", - "type": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "optional": true, - "documentation": "The workspace folders configured in the client when the server starts.\n\nThis property is only available if the client supports workspace folders.\nIt can be `null` if the client supports workspace folders but none are\nconfigured.\n\n@since 3.6.0", - "since": "3.6.0" - } - ] - }, - { - "name": "ServerCapabilities", - "properties": [ - { - "name": "positionEncoding", - "type": { - "kind": "reference", - "name": "PositionEncodingKind" - }, - "optional": true, - "documentation": "The position encoding the server picked from the encodings offered\nby the client via the client capability `general.positionEncodings`.\n\nIf the client didn't provide any position encodings the only valid\nvalue that a server can return is 'utf-16'.\n\nIf omitted it defaults to 'utf-16'.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "textDocumentSync", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextDocumentSyncOptions" - }, - { - "kind": "reference", - "name": "TextDocumentSyncKind" - } - ] - }, - "optional": true, - "documentation": "Defines how text documents are synced. Is either a detailed structure\ndefining each notification or for backwards compatibility the\nTextDocumentSyncKind number." - }, - { - "name": "notebookDocumentSync", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "NotebookDocumentSyncOptions" - }, - { - "kind": "reference", - "name": "NotebookDocumentSyncRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "Defines how notebook documents are synced.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "completionProvider", - "type": { - "kind": "reference", - "name": "CompletionOptions" - }, - "optional": true, - "documentation": "The server provides completion support." - }, - { - "name": "hoverProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "HoverOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides hover support." - }, - { - "name": "signatureHelpProvider", - "type": { - "kind": "reference", - "name": "SignatureHelpOptions" - }, - "optional": true, - "documentation": "The server provides signature help support." - }, - { - "name": "declarationProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DeclarationOptions" - }, - { - "kind": "reference", - "name": "DeclarationRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides Goto Declaration support." - }, - { - "name": "definitionProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DefinitionOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides goto definition support." - }, - { - "name": "typeDefinitionProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "TypeDefinitionOptions" - }, - { - "kind": "reference", - "name": "TypeDefinitionRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides Goto Type Definition support." - }, - { - "name": "implementationProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "ImplementationOptions" - }, - { - "kind": "reference", - "name": "ImplementationRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides Goto Implementation support." - }, - { - "name": "referencesProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "ReferenceOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides find references support." - }, - { - "name": "documentHighlightProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentHighlightOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document highlight support." - }, - { - "name": "documentSymbolProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentSymbolOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document symbol support." - }, - { - "name": "codeActionProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "CodeActionOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides code actions. CodeActionOptions may only be\nspecified if the client states that it supports\n`codeActionLiteralSupport` in its initial `initialize` request." - }, - { - "name": "codeLensProvider", - "type": { - "kind": "reference", - "name": "CodeLensOptions" - }, - "optional": true, - "documentation": "The server provides code lens." - }, - { - "name": "documentLinkProvider", - "type": { - "kind": "reference", - "name": "DocumentLinkOptions" - }, - "optional": true, - "documentation": "The server provides document link support." - }, - { - "name": "colorProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentColorOptions" - }, - { - "kind": "reference", - "name": "DocumentColorRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides color provider support." - }, - { - "name": "workspaceSymbolProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "WorkspaceSymbolOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides workspace symbol support." - }, - { - "name": "documentFormattingProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentFormattingOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document formatting." - }, - { - "name": "documentRangeFormattingProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentRangeFormattingOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document range formatting." - }, - { - "name": "documentOnTypeFormattingProvider", - "type": { - "kind": "reference", - "name": "DocumentOnTypeFormattingOptions" - }, - "optional": true, - "documentation": "The server provides document formatting on typing." - }, - { - "name": "renameProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "RenameOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides rename support. RenameOptions may only be\nspecified if the client states that it supports\n`prepareSupport` in its initial `initialize` request." - }, - { - "name": "foldingRangeProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "FoldingRangeOptions" - }, - { - "kind": "reference", - "name": "FoldingRangeRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides folding provider support." - }, - { - "name": "selectionRangeProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "SelectionRangeOptions" - }, - { - "kind": "reference", - "name": "SelectionRangeRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides selection range support." - }, - { - "name": "executeCommandProvider", - "type": { - "kind": "reference", - "name": "ExecuteCommandOptions" - }, - "optional": true, - "documentation": "The server provides execute command support." - }, - { - "name": "callHierarchyProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "CallHierarchyOptions" - }, - { - "kind": "reference", - "name": "CallHierarchyRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides call hierarchy support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "linkedEditingRangeProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "LinkedEditingRangeOptions" - }, - { - "kind": "reference", - "name": "LinkedEditingRangeRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides linked editing range support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "semanticTokensProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokensOptions" - }, - { - "kind": "reference", - "name": "SemanticTokensRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides semantic tokens support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "monikerProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "MonikerOptions" - }, - { - "kind": "reference", - "name": "MonikerRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides moniker support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "typeHierarchyProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "TypeHierarchyOptions" - }, - { - "kind": "reference", - "name": "TypeHierarchyRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides type hierarchy support.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlineValueProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "InlineValueOptions" - }, - { - "kind": "reference", - "name": "InlineValueRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides inline values.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlayHintProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "InlayHintOptions" - }, - { - "kind": "reference", - "name": "InlayHintRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides inlay hints.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "diagnosticProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "DiagnosticOptions" - }, - { - "kind": "reference", - "name": "DiagnosticRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server has support for pull model diagnostics.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "workspace", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "workspaceFolders", - "type": { - "kind": "reference", - "name": "WorkspaceFoldersServerCapabilities" - }, - "optional": true, - "documentation": "The server supports workspace folder.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "fileOperations", - "type": { - "kind": "reference", - "name": "FileOperationOptions" - }, - "optional": true, - "documentation": "The server is interested in notifications/requests for operations on files.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - } - }, - "optional": true, - "documentation": "Workspace specific server capabilities." - }, - { - "name": "experimental", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "Experimental server capabilities." - } - ], - "documentation": "Defines the capabilities provided by a language\nserver." - }, - { - "name": "VersionedTextDocumentIdentifier", - "properties": [ - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this document." - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - ], - "documentation": "A text document identifier to denote a specific version of a text document." - }, - { - "name": "SaveOptions", - "properties": [ - { - "name": "includeText", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client is supposed to include the content on save." - } - ], - "documentation": "Save options." - }, - { - "name": "FileEvent", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The file's uri." - }, - { - "name": "type", - "type": { - "kind": "reference", - "name": "FileChangeType" - }, - "documentation": "The change type." - } - ], - "documentation": "An event describing a file change." - }, - { - "name": "FileSystemWatcher", - "properties": [ - { - "name": "globPattern", - "type": { - "kind": "reference", - "name": "GlobPattern" - }, - "documentation": "The glob pattern to watch. See {@link GlobPattern glob pattern} for more detail.\n\n@since 3.17.0 support for relative patterns.", - "since": "3.17.0 support for relative patterns." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "WatchKind" - }, - "optional": true, - "documentation": "The kind of events of interest. If omitted it defaults\nto WatchKind.Create | WatchKind.Change | WatchKind.Delete\nwhich is 7." - } - ] - }, - { - "name": "Diagnostic", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range at which the message applies" - }, - { - "name": "severity", - "type": { - "kind": "reference", - "name": "DiagnosticSeverity" - }, - "optional": true, - "documentation": "The diagnostic's severity. Can be omitted. If omitted it is up to the\nclient to interpret diagnostics as error, warning, info or hint." - }, - { - "name": "code", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "string" - } - ] - }, - "optional": true, - "documentation": "The diagnostic's code, which usually appear in the user interface." - }, - { - "name": "codeDescription", - "type": { - "kind": "reference", - "name": "CodeDescription" - }, - "optional": true, - "documentation": "An optional property to describe the error code.\nRequires the code field (above) to be present/not null.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "source", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string describing the source of this\ndiagnostic, e.g. 'typescript' or 'super lint'. It usually\nappears in the user interface." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The diagnostic's message. It usually appears in the user interface" - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DiagnosticTag" - } - }, - "optional": true, - "documentation": "Additional metadata about the diagnostic.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "relatedInformation", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DiagnosticRelatedInformation" - } - }, - "optional": true, - "documentation": "An array of related diagnostic information, e.g. when symbol-names within\na scope collide all definitions can be marked via this property." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved between a `textDocument/publishDiagnostics`\nnotification and `textDocument/codeAction` request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "Represents a diagnostic, such as a compiler error or warning. Diagnostic objects\nare only valid in the scope of a resource." - }, - { - "name": "CompletionContext", - "properties": [ - { - "name": "triggerKind", - "type": { - "kind": "reference", - "name": "CompletionTriggerKind" - }, - "documentation": "How the completion was triggered." - }, - { - "name": "triggerCharacter", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The trigger character (a single character) that has trigger code complete.\nIs undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`" - } - ], - "documentation": "Contains additional information about the context in which a completion request is triggered." - }, - { - "name": "CompletionItemLabelDetails", - "properties": [ - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional string which is rendered less prominently directly after {@link CompletionItem.label label},\nwithout any spacing. Should be used for function signatures and type annotations." - }, - { - "name": "description", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional string which is rendered less prominently after {@link CompletionItem.detail}. Should be used\nfor fully qualified names and file paths." - } - ], - "documentation": "Additional details for a completion item label.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InsertReplaceEdit", - "properties": [ - { - "name": "newText", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The string to be inserted." - }, - { - "name": "insert", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range if the insert is requested" - }, - { - "name": "replace", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range if the replace is requested." - } - ], - "documentation": "A special text edit to provide an insert and a replace operation.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CompletionOptions", - "properties": [ - { - "name": "triggerCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "Most tools trigger completion request automatically without explicitly requesting\nit using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user\nstarts to type an identifier. For example if the user types `c` in a JavaScript file\ncode complete will automatically pop up present `console` besides others as a\ncompletion item. Characters that make up identifiers don't need to be listed here.\n\nIf code complete should automatically be trigger on characters not being valid inside\nan identifier (for example `.` in JavaScript) list them in `triggerCharacters`." - }, - { - "name": "allCommitCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "The list of all possible characters that commit a completion. This field can be used\nif clients don't support individual commit characters per completion item. See\n`ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`\n\nIf a server provides both `allCommitCharacters` and commit characters on an individual\ncompletion item the ones on the completion item win.\n\n@since 3.2.0", - "since": "3.2.0" - }, - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for a completion item." - }, - { - "name": "completionItem", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "labelDetailsSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server has support for completion item label\ndetails (see also `CompletionItemLabelDetails`) when\nreceiving a completion item in a resolve call.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "The server supports the following `CompletionItem` specific\ncapabilities.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Completion options." - }, - { - "name": "HoverOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Hover options." - }, - { - "name": "SignatureHelpContext", - "properties": [ - { - "name": "triggerKind", - "type": { - "kind": "reference", - "name": "SignatureHelpTriggerKind" - }, - "documentation": "Action that caused signature help to be triggered." - }, - { - "name": "triggerCharacter", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Character that caused signature help to be triggered.\n\nThis is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`" - }, - { - "name": "isRetrigger", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "`true` if signature help was already showing when it was triggered.\n\nRetriggers occurs when the signature help is already active and can be caused by actions such as\ntyping a trigger character, a cursor move, or document content changes." - }, - { - "name": "activeSignatureHelp", - "type": { - "kind": "reference", - "name": "SignatureHelp" - }, - "optional": true, - "documentation": "The currently active `SignatureHelp`.\n\nThe `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on\nthe user navigating through available signatures." - } - ], - "documentation": "Additional information about the context in which a signature help request was triggered.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "SignatureInformation", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The label of this signature. Will be shown in\nthe UI." - }, - { - "name": "documentation", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The human-readable doc-comment of this signature. Will be shown\nin the UI but can be omitted." - }, - { - "name": "parameters", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ParameterInformation" - } - }, - "optional": true, - "documentation": "The parameters of this signature." - }, - { - "name": "activeParameter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The index of the active parameter.\n\nIf provided, this is used in place of `SignatureHelp.activeParameter`.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "Represents the signature of something callable. A signature\ncan have a label, like a function-name, a doc-comment, and\na set of parameters." - }, - { - "name": "SignatureHelpOptions", - "properties": [ - { - "name": "triggerCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "List of characters that trigger signature help automatically." - }, - { - "name": "retriggerCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "List of characters that re-trigger signature help.\n\nThese trigger characters are only active when signature help is already showing. All trigger characters\nare also counted as re-trigger characters.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Server Capabilities for a {@link SignatureHelpRequest}." - }, - { - "name": "DefinitionOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Server Capabilities for a {@link DefinitionRequest}." - }, - { - "name": "ReferenceContext", - "properties": [ - { - "name": "includeDeclaration", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Include the declaration of the current symbol." - } - ], - "documentation": "Value-object that contains additional information when\nrequesting references." - }, - { - "name": "ReferenceOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Reference options." - }, - { - "name": "DocumentHighlightOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentHighlightRequest}." - }, - { - "name": "BaseSymbolInformation", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this symbol." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this symbol." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this symbol.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "containerName", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The name of the symbol containing this symbol. This information is for\nuser interface purposes (e.g. to render a qualifier in the user interface\nif necessary). It can't be used to re-infer a hierarchy for the document\nsymbols." - } - ], - "documentation": "A base for all symbol information." - }, - { - "name": "DocumentSymbolOptions", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string that is shown when multiple outlines trees\nare shown for the same document.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentSymbolRequest}." - }, - { - "name": "CodeActionContext", - "properties": [ - { - "name": "diagnostics", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "documentation": "An array of diagnostics known on the client side overlapping the range provided to the\n`textDocument/codeAction` request. They are provided so that the server knows which\nerrors are currently presented to the user for the given range. There is no guarantee\nthat these accurately reflect the error state of the resource. The primary parameter\nto compute code actions is the provided range." - }, - { - "name": "only", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeActionKind" - } - }, - "optional": true, - "documentation": "Requested kind of actions to return.\n\nActions not of this kind are filtered out by the client before being shown. So servers\ncan omit computing them." - }, - { - "name": "triggerKind", - "type": { - "kind": "reference", - "name": "CodeActionTriggerKind" - }, - "optional": true, - "documentation": "The reason why code actions were requested.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Contains additional diagnostic information about the context in which\na {@link CodeActionProvider.provideCodeActions code action} is run." - }, - { - "name": "CodeActionOptions", - "properties": [ - { - "name": "codeActionKinds", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeActionKind" - } - }, - "optional": true, - "documentation": "CodeActionKinds that this server may return.\n\nThe list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server\nmay list out every specific kind they provide." - }, - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for a code action.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link CodeActionRequest}." - }, - { - "name": "WorkspaceSymbolOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for a workspace symbol.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Server capabilities for a {@link WorkspaceSymbolRequest}." - }, - { - "name": "CodeLensOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Code lens has a resolve provider as well." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Code Lens provider options of a {@link CodeLensRequest}." - }, - { - "name": "DocumentLinkOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Document links have a resolve provider as well." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentLinkRequest}." - }, - { - "name": "FormattingOptions", - "properties": [ - { - "name": "tabSize", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "Size of a tab in spaces." - }, - { - "name": "insertSpaces", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Prefer spaces over tabs." - }, - { - "name": "trimTrailingWhitespace", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Trim trailing whitespace on a line.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "insertFinalNewline", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Insert a newline character at the end of the file if one does not exist.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "trimFinalNewlines", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Trim all newlines after the final newline at the end of the file.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "Value-object describing what options formatting should use." - }, - { - "name": "DocumentFormattingOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingOptions", - "properties": [ - { - "name": "firstTriggerCharacter", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A character on which formatting should be triggered, like `{`." - }, - { - "name": "moreTriggerCharacter", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "More trigger characters." - } - ], - "documentation": "Provider options for a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "RenameOptions", - "properties": [ - { - "name": "prepareProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Renames should be checked and tested before being executed.\n\n@since version 3.12.0", - "since": "version 3.12.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link RenameRequest}." - }, - { - "name": "ExecuteCommandOptions", - "properties": [ - { - "name": "commands", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The commands to be executed on the server" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "The server capabilities of a {@link ExecuteCommandRequest}." - }, - { - "name": "SemanticTokensLegend", - "properties": [ - { - "name": "tokenTypes", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token types a server uses." - }, - { - "name": "tokenModifiers", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token modifiers a server uses." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "OptionalVersionedTextDocumentIdentifier", - "properties": [ - { - "name": "version", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The version number of this document. If a versioned text document identifier\nis sent from the server to the client and the file is not open in the editor\n(the server has not received an open notification before) the server can send\n`null` to indicate that the version is unknown and the content on disk is the\ntruth (as specified with document content ownership)." - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - ], - "documentation": "A text document identifier to optionally denote a specific version of a text document." - }, - { - "name": "AnnotatedTextEdit", - "properties": [ - { - "name": "annotationId", - "type": { - "kind": "reference", - "name": "ChangeAnnotationIdentifier" - }, - "documentation": "The actual identifier of the change annotation" - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextEdit" - } - ], - "documentation": "A special text edit with an additional change annotation.\n\n@since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "ResourceOperation", - "properties": [ - { - "name": "kind", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The resource operation kind." - }, - { - "name": "annotationId", - "type": { - "kind": "reference", - "name": "ChangeAnnotationIdentifier" - }, - "optional": true, - "documentation": "An optional annotation identifier describing the operation.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "A generic resource operation." - }, - { - "name": "CreateFileOptions", - "properties": [ - { - "name": "overwrite", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Overwrite existing file. Overwrite wins over `ignoreIfExists`" - }, - { - "name": "ignoreIfExists", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Ignore if exists." - } - ], - "documentation": "Options to create a file." - }, - { - "name": "RenameFileOptions", - "properties": [ - { - "name": "overwrite", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Overwrite target if existing. Overwrite wins over `ignoreIfExists`" - }, - { - "name": "ignoreIfExists", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Ignores if target exists." - } - ], - "documentation": "Rename file options" - }, - { - "name": "DeleteFileOptions", - "properties": [ - { - "name": "recursive", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Delete the content recursively if a folder is denoted." - }, - { - "name": "ignoreIfNotExists", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Ignore the operation if the file doesn't exist." - } - ], - "documentation": "Delete file options" - }, - { - "name": "FileOperationPattern", - "properties": [ - { - "name": "glob", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The glob pattern to match. Glob patterns can have the following syntax:\n- `*` to match one or more characters in a path segment\n- `?` to match on one character in a path segment\n- `**` to match any number of path segments, including none\n- `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)\n- `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)\n- `[!...]` 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`)" - }, - { - "name": "matches", - "type": { - "kind": "reference", - "name": "FileOperationPatternKind" - }, - "optional": true, - "documentation": "Whether to match files or folders with this pattern.\n\nMatches both if undefined." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FileOperationPatternOptions" - }, - "optional": true, - "documentation": "Additional options used during matching." - } - ], - "documentation": "A pattern to describe in which file operation requests or notifications\nthe server is interested in receiving.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "WorkspaceFullDocumentDiagnosticReport", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which diagnostic information is reported." - }, - { - "name": "version", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The version number for which the diagnostics are reported.\nIf the document is not marked as open `null` can be provided." - } - ], - "extends": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - } - ], - "documentation": "A full document diagnostic report for a workspace diagnostic result.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceUnchangedDocumentDiagnosticReport", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which diagnostic information is reported." - }, - { - "name": "version", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The version number for which the diagnostics are reported.\nIf the document is not marked as open `null` can be provided." - } - ], - "extends": [ - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ], - "documentation": "An unchanged document diagnostic report for a workspace diagnostic result.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookCell", - "properties": [ - { - "name": "kind", - "type": { - "kind": "reference", - "name": "NotebookCellKind" - }, - "documentation": "The cell's kind" - }, - { - "name": "document", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI of the cell's text document\ncontent." - }, - { - "name": "metadata", - "type": { - "kind": "reference", - "name": "LSPObject" - }, - "optional": true, - "documentation": "Additional metadata stored with the cell.\n\nNote: should always be an object literal (e.g. LSPObject)" - }, - { - "name": "executionSummary", - "type": { - "kind": "reference", - "name": "ExecutionSummary" - }, - "optional": true, - "documentation": "Additional execution summary information\nif supported by the client." - } - ], - "documentation": "A notebook cell.\n\nA cell's document URI must be unique across ALL notebook\ncells and can therefore be used to uniquely identify a\nnotebook cell or the cell's text document.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookCellArrayChange", - "properties": [ - { - "name": "start", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The start oftest of the cell that changed." - }, - { - "name": "deleteCount", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The deleted cells" - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "NotebookCell" - } - }, - "optional": true, - "documentation": "The new cells, if any" - } - ], - "documentation": "A change describing how to move a `NotebookCell`\narray from state S to S'.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ClientCapabilities", - "properties": [ - { - "name": "workspace", - "type": { - "kind": "reference", - "name": "WorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Workspace specific client capabilities." - }, - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentClientCapabilities" - }, - "optional": true, - "documentation": "Text document specific client capabilities." - }, - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocumentClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the notebook document support.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "window", - "type": { - "kind": "reference", - "name": "WindowClientCapabilities" - }, - "optional": true, - "documentation": "Window specific client capabilities." - }, - { - "name": "general", - "type": { - "kind": "reference", - "name": "GeneralClientCapabilities" - }, - "optional": true, - "documentation": "General client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "experimental", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "Experimental client capabilities." - } - ], - "documentation": "Defines the capabilities provided by the client." - }, - { - "name": "TextDocumentSyncOptions", - "properties": [ - { - "name": "openClose", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Open and close notifications are sent to the server. If omitted open close notification should not\nbe sent." - }, - { - "name": "change", - "type": { - "kind": "reference", - "name": "TextDocumentSyncKind" - }, - "optional": true, - "documentation": "Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full\nand TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None." - }, - { - "name": "willSave", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If present will save notifications are sent to the server. If omitted the notification should not be\nsent." - }, - { - "name": "willSaveWaitUntil", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If present will save wait until requests are sent to the server. If omitted the request should not be\nsent." - }, - { - "name": "save", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "SaveOptions" - } - ] - }, - "optional": true, - "documentation": "If present save notifications are sent to the server. If omitted the notification should not be\nsent." - } - ] - }, - { - "name": "NotebookDocumentSyncOptions", - "properties": [ - { - "name": "notebookSelector", - "type": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebook", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "NotebookDocumentFilter" - } - ] - }, - "documentation": "The notebook to be synced If a string\nvalue is provided it matches against the\nnotebook type. '*' matches every notebook." - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - } - }, - "optional": true, - "documentation": "The cells of the matching notebook to be synced." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebook", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "NotebookDocumentFilter" - } - ] - }, - "optional": true, - "documentation": "The notebook to be synced If a string\nvalue is provided it matches against the\nnotebook type. '*' matches every notebook." - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - } - }, - "documentation": "The cells of the matching notebook to be synced." - } - ] - } - } - ] - } - }, - "documentation": "The notebooks to be synced" - }, - { - "name": "save", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether save notification should be forwarded to\nthe server. Will only be honored if mode === `notebook`." - } - ], - "documentation": "Options specific to a notebook plus its cells\nto be synced to the server.\n\nIf a selector provides a notebook document\nfilter but no cell selector all cells of a\nmatching notebook document will be synced.\n\nIf a selector provides no notebook document\nfilter but only a cell selector all notebook\ndocument that contain at least one matching\ncell will be synced.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentSyncRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "NotebookDocumentSyncOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Registration options specific to a notebook.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceFoldersServerCapabilities", - "properties": [ - { - "name": "supported", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server has support for workspace folders" - }, - { - "name": "changeNotifications", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "base", - "name": "boolean" - } - ] - }, - "optional": true, - "documentation": "Whether the server wants to receive workspace folder\nchange notifications.\n\nIf a string is provided the string is treated as an ID\nunder which the notification is registered on the client\nside. The ID can be used to unregister for these events\nusing the `client/unregisterCapability` request." - } - ] - }, - { - "name": "FileOperationOptions", - "properties": [ - { - "name": "didCreate", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving didCreateFiles notifications." - }, - { - "name": "willCreate", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving willCreateFiles requests." - }, - { - "name": "didRename", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving didRenameFiles notifications." - }, - { - "name": "willRename", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving willRenameFiles requests." - }, - { - "name": "didDelete", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving didDeleteFiles file notifications." - }, - { - "name": "willDelete", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving willDeleteFiles file requests." - } - ], - "documentation": "Options for notifications/requests for user operations on files.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CodeDescription", - "properties": [ - { - "name": "href", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "An URI to open with more information about the diagnostic error." - } - ], - "documentation": "Structure to capture a description for an error code.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DiagnosticRelatedInformation", - "properties": [ - { - "name": "location", - "type": { - "kind": "reference", - "name": "Location" - }, - "documentation": "The location of this related diagnostic information." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The message of this related diagnostic information." - } - ], - "documentation": "Represents a related message and source code location for a diagnostic. This should be\nused to point to code locations that cause or related to a diagnostics, e.g when duplicating\na symbol in a scope." - }, - { - "name": "ParameterInformation", - "properties": [ - { - "name": "label", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "tuple", - "items": [ - { - "kind": "base", - "name": "uinteger" - }, - { - "kind": "base", - "name": "uinteger" - } - ] - } - ] - }, - "documentation": "The label of this parameter information.\n\nEither a string or an inclusive start and exclusive end offsets within its containing\nsignature label. (see SignatureInformation.label). The offsets are based on a UTF-16\nstring representation as `Position` and `Range` does.\n\n*Note*: a label of type string should be a substring of its containing signature label.\nIts intended use case is to highlight the parameter label part in the `SignatureInformation.label`." - }, - { - "name": "documentation", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The human-readable doc-comment of this parameter. Will be shown\nin the UI but can be omitted." - } - ], - "documentation": "Represents a parameter of a callable-signature. A parameter can\nhave a label and a doc-comment." - }, - { - "name": "NotebookCellTextDocumentFilter", - "properties": [ - { - "name": "notebook", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "NotebookDocumentFilter" - } - ] - }, - "documentation": "A filter that matches against the notebook\ncontaining the notebook cell. If a string\nvalue is provided it matches against the\nnotebook type. '*' matches every notebook." - }, - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A language id like `python`.\n\nWill be matched against the language id of the\nnotebook cell document. '*' matches every language." - } - ], - "documentation": "A notebook cell text document filter denotes a cell text\ndocument by different properties.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FileOperationPatternOptions", - "properties": [ - { - "name": "ignoreCase", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The pattern should be matched ignoring casing." - } - ], - "documentation": "Matching options for the file operation pattern.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "ExecutionSummary", - "properties": [ - { - "name": "executionOrder", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "A strict monotonically increasing value\nindicating the execution order of a cell\ninside a notebook." - }, - { - "name": "success", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the execution was successful or\nnot if known by the client." - } - ] - }, - { - "name": "WorkspaceClientCapabilities", - "properties": [ - { - "name": "applyEdit", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports applying batch edits\nto the workspace by supporting the request\n'workspace/applyEdit'" - }, - { - "name": "workspaceEdit", - "type": { - "kind": "reference", - "name": "WorkspaceEditClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to `WorkspaceEdit`s." - }, - { - "name": "didChangeConfiguration", - "type": { - "kind": "reference", - "name": "DidChangeConfigurationClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/didChangeConfiguration` notification." - }, - { - "name": "didChangeWatchedFiles", - "type": { - "kind": "reference", - "name": "DidChangeWatchedFilesClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/didChangeWatchedFiles` notification." - }, - { - "name": "symbol", - "type": { - "kind": "reference", - "name": "WorkspaceSymbolClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/symbol` request." - }, - { - "name": "executeCommand", - "type": { - "kind": "reference", - "name": "ExecuteCommandClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/executeCommand` request." - }, - { - "name": "workspaceFolders", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for workspace folders.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "configuration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports `workspace/configuration` requests.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "semanticTokens", - "type": { - "kind": "reference", - "name": "SemanticTokensWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the semantic token requests scoped to the\nworkspace.\n\n@since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "codeLens", - "type": { - "kind": "reference", - "name": "CodeLensWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the code lens requests scoped to the\nworkspace.\n\n@since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "fileOperations", - "type": { - "kind": "reference", - "name": "FileOperationClientCapabilities" - }, - "optional": true, - "documentation": "The client has support for file notifications/requests for user operations on files.\n\nSince 3.16.0" - }, - { - "name": "inlineValue", - "type": { - "kind": "reference", - "name": "InlineValueWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the inline values requests scoped to the\nworkspace.\n\n@since 3.17.0.", - "since": "3.17.0." - }, - { - "name": "inlayHint", - "type": { - "kind": "reference", - "name": "InlayHintWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the inlay hint requests scoped to the\nworkspace.\n\n@since 3.17.0.", - "since": "3.17.0." - }, - { - "name": "diagnostics", - "type": { - "kind": "reference", - "name": "DiagnosticWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the diagnostic requests scoped to the\nworkspace.\n\n@since 3.17.0.", - "since": "3.17.0." - } - ], - "documentation": "Workspace specific client capabilities." - }, - { - "name": "TextDocumentClientCapabilities", - "properties": [ - { - "name": "synchronization", - "type": { - "kind": "reference", - "name": "TextDocumentSyncClientCapabilities" - }, - "optional": true, - "documentation": "Defines which synchronization capabilities the client supports." - }, - { - "name": "completion", - "type": { - "kind": "reference", - "name": "CompletionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/completion` request." - }, - { - "name": "hover", - "type": { - "kind": "reference", - "name": "HoverClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/hover` request." - }, - { - "name": "signatureHelp", - "type": { - "kind": "reference", - "name": "SignatureHelpClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/signatureHelp` request." - }, - { - "name": "declaration", - "type": { - "kind": "reference", - "name": "DeclarationClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/declaration` request.\n\n@since 3.14.0", - "since": "3.14.0" - }, - { - "name": "definition", - "type": { - "kind": "reference", - "name": "DefinitionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/definition` request." - }, - { - "name": "typeDefinition", - "type": { - "kind": "reference", - "name": "TypeDefinitionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/typeDefinition` request.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "implementation", - "type": { - "kind": "reference", - "name": "ImplementationClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/implementation` request.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "references", - "type": { - "kind": "reference", - "name": "ReferenceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/references` request." - }, - { - "name": "documentHighlight", - "type": { - "kind": "reference", - "name": "DocumentHighlightClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentHighlight` request." - }, - { - "name": "documentSymbol", - "type": { - "kind": "reference", - "name": "DocumentSymbolClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentSymbol` request." - }, - { - "name": "codeAction", - "type": { - "kind": "reference", - "name": "CodeActionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/codeAction` request." - }, - { - "name": "codeLens", - "type": { - "kind": "reference", - "name": "CodeLensClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/codeLens` request." - }, - { - "name": "documentLink", - "type": { - "kind": "reference", - "name": "DocumentLinkClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentLink` request." - }, - { - "name": "colorProvider", - "type": { - "kind": "reference", - "name": "DocumentColorClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentColor` and the\n`textDocument/colorPresentation` request.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "formatting", - "type": { - "kind": "reference", - "name": "DocumentFormattingClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/formatting` request." - }, - { - "name": "rangeFormatting", - "type": { - "kind": "reference", - "name": "DocumentRangeFormattingClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/rangeFormatting` request." - }, - { - "name": "onTypeFormatting", - "type": { - "kind": "reference", - "name": "DocumentOnTypeFormattingClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/onTypeFormatting` request." - }, - { - "name": "rename", - "type": { - "kind": "reference", - "name": "RenameClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/rename` request." - }, - { - "name": "foldingRange", - "type": { - "kind": "reference", - "name": "FoldingRangeClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/foldingRange` request.\n\n@since 3.10.0", - "since": "3.10.0" - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "SelectionRangeClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/selectionRange` request.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "publishDiagnostics", - "type": { - "kind": "reference", - "name": "PublishDiagnosticsClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/publishDiagnostics` notification." - }, - { - "name": "callHierarchy", - "type": { - "kind": "reference", - "name": "CallHierarchyClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the various call hierarchy requests.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "semanticTokens", - "type": { - "kind": "reference", - "name": "SemanticTokensClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the various semantic token request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "linkedEditingRange", - "type": { - "kind": "reference", - "name": "LinkedEditingRangeClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/linkedEditingRange` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "moniker", - "type": { - "kind": "reference", - "name": "MonikerClientCapabilities" - }, - "optional": true, - "documentation": "Client capabilities specific to the `textDocument/moniker` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "typeHierarchy", - "type": { - "kind": "reference", - "name": "TypeHierarchyClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the various type hierarchy requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlineValue", - "type": { - "kind": "reference", - "name": "InlineValueClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/inlineValue` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlayHint", - "type": { - "kind": "reference", - "name": "InlayHintClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/inlayHint` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "diagnostic", - "type": { - "kind": "reference", - "name": "DiagnosticClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the diagnostic pull model.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Text document specific client capabilities." - }, - { - "name": "NotebookDocumentClientCapabilities", - "properties": [ - { - "name": "synchronization", - "type": { - "kind": "reference", - "name": "NotebookDocumentSyncClientCapabilities" - }, - "documentation": "Capabilities specific to notebook document synchronization\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Capabilities specific to the notebook document support.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WindowClientCapabilities", - "properties": [ - { - "name": "workDoneProgress", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "It indicates whether the client supports server initiated\nprogress using the `window/workDoneProgress/create` request.\n\nThe capability also controls Whether client supports handling\nof progress notifications. If set servers are allowed to report a\n`workDoneProgress` property in the request specific server\ncapabilities.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "showMessage", - "type": { - "kind": "reference", - "name": "ShowMessageRequestClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the showMessage request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "showDocument", - "type": { - "kind": "reference", - "name": "ShowDocumentClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the showDocument request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - }, - { - "name": "GeneralClientCapabilities", - "properties": [ - { - "name": "staleRequestSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "cancel", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "The client will actively cancel the request." - }, - { - "name": "retryOnContentModified", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The list of requests for which the client\nwill retry the request if it receives a\nresponse with error code `ContentModified`" - } - ] - } - }, - "optional": true, - "documentation": "Client capability that signals how the client\nhandles stale requests (e.g. a request\nfor which the client will not process the response\nanymore since the information is outdated).\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "regularExpressions", - "type": { - "kind": "reference", - "name": "RegularExpressionsClientCapabilities" - }, - "optional": true, - "documentation": "Client capabilities specific to regular expressions.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "markdown", - "type": { - "kind": "reference", - "name": "MarkdownClientCapabilities" - }, - "optional": true, - "documentation": "Client capabilities specific to the client's markdown parser.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "positionEncodings", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "PositionEncodingKind" - } - }, - "optional": true, - "documentation": "The position encodings supported by the client. Client and server\nhave to agree on the same position encoding to ensure that offsets\n(e.g. character position in a line) are interpreted the same on both\nsides.\n\nTo keep the protocol backwards compatible the following applies: if\nthe value 'utf-16' is missing from the array of position encodings\nservers can assume that the client supports UTF-16. UTF-16 is\ntherefore a mandatory encoding.\n\nIf omitted it defaults to ['utf-16'].\n\nImplementation considerations: since the conversion from one encoding\ninto another requires the content of the file / line the conversion\nis best done where the file is read which is usually on the server\nside.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "General client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "RelativePattern", - "properties": [ - { - "name": "baseUri", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceFolder" - }, - { - "kind": "base", - "name": "URI" - } - ] - }, - "documentation": "A workspace folder or a base URI to which this pattern will be matched\nagainst relatively." - }, - { - "name": "pattern", - "type": { - "kind": "reference", - "name": "Pattern" - }, - "documentation": "The actual glob pattern;" - } - ], - "documentation": "A relative pattern is a helper to construct glob patterns that are matched\nrelatively to a base URI. The common value for a `baseUri` is a workspace\nfolder root, but it can be another absolute URI as well.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceEditClientCapabilities", - "properties": [ - { - "name": "documentChanges", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports versioned document changes in `WorkspaceEdit`s" - }, - { - "name": "resourceOperations", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ResourceOperationKind" - } - }, - "optional": true, - "documentation": "The resource operations the client supports. Clients should at least\nsupport 'create', 'rename' and 'delete' files and folders.\n\n@since 3.13.0", - "since": "3.13.0" - }, - { - "name": "failureHandling", - "type": { - "kind": "reference", - "name": "FailureHandlingKind" - }, - "optional": true, - "documentation": "The failure handling strategy of a client if applying the workspace edit\nfails.\n\n@since 3.13.0", - "since": "3.13.0" - }, - { - "name": "normalizesLineEndings", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client normalizes line endings to the client specific\nsetting.\nIf set to `true` the client will normalize line ending characters\nin a workspace edit to the client-specified new line\ncharacter.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "changeAnnotationSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "groupsOnLabel", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client groups edits with equal labels into tree nodes,\nfor instance all edits labelled with \"Changes in Strings\" would\nbe a tree node." - } - ] - } - }, - "optional": true, - "documentation": "Whether the client in general supports change annotations on text edits,\ncreate file, rename file and delete file changes.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - }, - { - "name": "DidChangeConfigurationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Did change configuration notification supports dynamic registration." - } - ] - }, - { - "name": "DidChangeWatchedFilesClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Did change watched files notification supports dynamic registration. Please note\nthat the current protocol doesn't support static configuration for file changes\nfrom the server side." - }, - { - "name": "relativePatternSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client has support for {@link RelativePattern relative pattern}\nor not.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - }, - { - "name": "WorkspaceSymbolClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Symbol request supports dynamic registration." - }, - { - "name": "symbolKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolKind" - } - }, - "optional": true, - "documentation": "The symbol kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown.\n\nIf this property is not present the client only supports\nthe symbol kinds from `File` to `Array` as defined in\nthe initial version of the protocol." - } - ] - } - }, - "optional": true, - "documentation": "Specific capabilities for the `SymbolKind` in the `workspace/symbol` request." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "The client supports tags on `SymbolInformation`.\nClients supporting tags have to handle unknown tags gracefully.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily. Usually\n`location.range`" - } - ] - } - }, - "optional": true, - "documentation": "The client support partial workspace symbols. The client will send the\nrequest `workspaceSymbol/resolve` to the server to resolve additional\nproperties.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Client capabilities for a {@link WorkspaceSymbolRequest}." - }, - { - "name": "ExecuteCommandClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Execute command supports dynamic registration." - } - ], - "documentation": "The client capabilities of a {@link ExecuteCommandRequest}." - }, - { - "name": "SemanticTokensWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from\nthe server to the client.\n\nNote that this event is global and will force the client to refresh all\nsemantic tokens currently shown. It should be used with absolute care\nand is useful for situation where a server for example detects a project\nwide change that requires such a calculation." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CodeLensWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from the\nserver to the client.\n\nNote that this event is global and will force the client to refresh all\ncode lenses currently shown. It should be used with absolute care and is\nuseful for situation where a server for example detect a project wide\nchange that requires such a calculation." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileOperationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports dynamic registration for file requests/notifications." - }, - { - "name": "didCreate", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending didCreateFiles notifications." - }, - { - "name": "willCreate", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending willCreateFiles requests." - }, - { - "name": "didRename", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending didRenameFiles notifications." - }, - { - "name": "willRename", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending willRenameFiles requests." - }, - { - "name": "didDelete", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending didDeleteFiles notifications." - }, - { - "name": "willDelete", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending willDeleteFiles requests." - } - ], - "documentation": "Capabilities relating to events from file operations by the user in the client.\n\nThese events do not come from the file system, they come from user operations\nlike renaming a file in the UI.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "InlineValueWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from the\nserver to the client.\n\nNote that this event is global and will force the client to refresh all\ninline values currently shown. It should be used with absolute care and is\nuseful for situation where a server for example detects a project wide\nchange that requires such a calculation." - } - ], - "documentation": "Client workspace capabilities specific to inline values.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from\nthe server to the client.\n\nNote that this event is global and will force the client to refresh all\ninlay hints currently shown. It should be used with absolute care and\nis useful for situation where a server for example detects a project wide\nchange that requires such a calculation." - } - ], - "documentation": "Client workspace capabilities specific to inlay hints.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from\nthe server to the client.\n\nNote that this event is global and will force the client to refresh all\npulled diagnostics currently shown. It should be used with absolute care and\nis useful for situation where a server for example detects a project wide\nchange that requires such a calculation." - } - ], - "documentation": "Workspace client capabilities specific to diagnostic pull requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentSyncClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether text document synchronization supports dynamic registration." - }, - { - "name": "willSave", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports sending will save notifications." - }, - { - "name": "willSaveWaitUntil", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports sending a will save request and\nwaits for a response providing text edits which will\nbe applied to the document before it is saved." - }, - { - "name": "didSave", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports did save notifications." - } - ] - }, - { - "name": "CompletionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether completion supports dynamic registration." - }, - { - "name": "completionItem", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "snippetSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports snippets as insert text.\n\nA snippet can define tab stops and placeholders with `$1`, `$2`\nand `${3:foo}`. `$0` defines the final tab stop, it defaults to\nthe end of the snippet. Placeholders with equal identifiers are linked,\nthat is typing in one will update others too." - }, - { - "name": "commitCharactersSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports commit characters on a completion item." - }, - { - "name": "documentationFormat", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkupKind" - } - }, - "optional": true, - "documentation": "Client supports the following content formats for the documentation\nproperty. The order describes the preferred format of the client." - }, - { - "name": "deprecatedSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports the deprecated property on a completion item." - }, - { - "name": "preselectSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports the preselect property on a completion item." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItemTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "Client supports the tag property on a completion item. Clients supporting\ntags have to handle unknown tags gracefully. Clients especially need to\npreserve unknown tags when sending a completion item back to the server in\na resolve call.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "insertReplaceSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client support insert replace edit to control different behavior if a\ncompletion item is inserted in the text or should replace text.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily." - } - ] - } - }, - "optional": true, - "documentation": "Indicates which properties a client can resolve lazily on a completion\nitem. Before version 3.16.0 only the predefined properties `documentation`\nand `details` could be resolved lazily.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "insertTextModeSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "InsertTextMode" - } - } - } - ] - } - }, - "optional": true, - "documentation": "The client supports the `insertTextMode` property on\na completion item to override the whitespace handling mode\nas defined by the client (see `insertTextMode`).\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "labelDetailsSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for completion item label\ndetails (see also `CompletionItemLabelDetails`).\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "The client supports the following `CompletionItem` specific\ncapabilities." - }, - { - "name": "completionItemKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItemKind" - } - }, - "optional": true, - "documentation": "The completion item kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown.\n\nIf this property is not present the client only supports\nthe completion items kinds from `Text` to `Reference` as defined in\nthe initial version of the protocol." - } - ] - } - }, - "optional": true - }, - { - "name": "insertTextMode", - "type": { - "kind": "reference", - "name": "InsertTextMode" - }, - "optional": true, - "documentation": "Defines how the client handles whitespace and indentation\nwhen accepting a completion item that uses multi line\ntext in either `insertText` or `textEdit`.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "contextSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports to send additional context information for a\n`textDocument/completion` request." - }, - { - "name": "completionList", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "itemDefaults", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "The client supports the following itemDefaults on\na completion list.\n\nThe value lists the supported property names of the\n`CompletionList.itemDefaults` object. If omitted\nno properties are supported.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "The client supports the following `CompletionList` specific\ncapabilities.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Completion client capabilities" - }, - { - "name": "HoverClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether hover supports dynamic registration." - }, - { - "name": "contentFormat", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkupKind" - } - }, - "optional": true, - "documentation": "Client supports the following content formats for the content\nproperty. The order describes the preferred format of the client." - } - ] - }, - { - "name": "SignatureHelpClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether signature help supports dynamic registration." - }, - { - "name": "signatureInformation", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "documentationFormat", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkupKind" - } - }, - "optional": true, - "documentation": "Client supports the following content formats for the documentation\nproperty. The order describes the preferred format of the client." - }, - { - "name": "parameterInformation", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "labelOffsetSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports processing label offsets instead of a\nsimple label string.\n\n@since 3.14.0", - "since": "3.14.0" - } - ] - } - }, - "optional": true, - "documentation": "Client capabilities specific to parameter information." - }, - { - "name": "activeParameterSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports the `activeParameter` property on `SignatureInformation`\nliteral.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - } - }, - "optional": true, - "documentation": "The client supports the following `SignatureInformation`\nspecific properties." - }, - { - "name": "contextSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports to send additional context information for a\n`textDocument/signatureHelp` request. A client that opts into\ncontextSupport will also support the `retriggerCharacters` on\n`SignatureHelpOptions`.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "Client Capabilities for a {@link SignatureHelpRequest}." - }, - { - "name": "DeclarationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether declaration supports dynamic registration. If this is set to `true`\nthe client supports the new `DeclarationRegistrationOptions` return value\nfor the corresponding server capability as well." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of declaration links." - } - ], - "documentation": "@since 3.14.0", - "since": "3.14.0" - }, - { - "name": "DefinitionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether definition supports dynamic registration." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of definition links.\n\n@since 3.14.0", - "since": "3.14.0" - } - ], - "documentation": "Client Capabilities for a {@link DefinitionRequest}." - }, - { - "name": "TypeDefinitionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `TypeDefinitionRegistrationOptions` return value\nfor the corresponding server capability as well." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of definition links.\n\nSince 3.14.0" - } - ], - "documentation": "Since 3.6.0" - }, - { - "name": "ImplementationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `ImplementationRegistrationOptions` return value\nfor the corresponding server capability as well." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of definition links.\n\n@since 3.14.0", - "since": "3.14.0" - } - ], - "documentation": "@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "ReferenceClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether references supports dynamic registration." - } - ], - "documentation": "Client Capabilities for a {@link ReferencesRequest}." - }, - { - "name": "DocumentHighlightClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether document highlight supports dynamic registration." - } - ], - "documentation": "Client Capabilities for a {@link DocumentHighlightRequest}." - }, - { - "name": "DocumentSymbolClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether document symbol supports dynamic registration." - }, - { - "name": "symbolKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolKind" - } - }, - "optional": true, - "documentation": "The symbol kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown.\n\nIf this property is not present the client only supports\nthe symbol kinds from `File` to `Array` as defined in\nthe initial version of the protocol." - } - ] - } - }, - "optional": true, - "documentation": "Specific capabilities for the `SymbolKind` in the\n`textDocument/documentSymbol` request." - }, - { - "name": "hierarchicalDocumentSymbolSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports hierarchical document symbols." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "The client supports tags on `SymbolInformation`. Tags are supported on\n`DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true.\nClients supporting tags have to handle unknown tags gracefully.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "labelSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports an additional label presented in the UI when\nregistering a document symbol provider.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "Client Capabilities for a {@link DocumentSymbolRequest}." - }, - { - "name": "CodeActionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports dynamic registration." - }, - { - "name": "codeActionLiteralSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "codeActionKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeActionKind" - } - }, - "documentation": "The code action kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown." - } - ] - } - }, - "documentation": "The code action kind is support with the following value\nset." - } - ] - } - }, - "optional": true, - "documentation": "The client support code action literals of type `CodeAction` as a valid\nresponse of the `textDocument/codeAction` request. If the property is not\nset the request can only return `Command` literals.\n\n@since 3.8.0", - "since": "3.8.0" - }, - { - "name": "isPreferredSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `isPreferred` property.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "disabledSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `disabled` property.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "dataSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `data` property which is\npreserved between a `textDocument/codeAction` and a\n`codeAction/resolve` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily." - } - ] - } - }, - "optional": true, - "documentation": "Whether the client supports resolving additional code action\nproperties via a separate `codeAction/resolve` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "honorsChangeAnnotations", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client honors the change annotations in\ntext edits and resource operations returned via the\n`CodeAction#edit` property by for example presenting\nthe workspace edit in the user interface and asking\nfor confirmation.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "The Client Capabilities of a {@link CodeActionRequest}." - }, - { - "name": "CodeLensClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code lens supports dynamic registration." - } - ], - "documentation": "The client capabilities of a {@link CodeLensRequest}." - }, - { - "name": "DocumentLinkClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether document link supports dynamic registration." - }, - { - "name": "tooltipSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports the `tooltip` property on `DocumentLink`.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "The client capabilities of a {@link DocumentLinkRequest}." - }, - { - "name": "DocumentColorClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `DocumentColorRegistrationOptions` return value\nfor the corresponding server capability as well." - } - ] - }, - { - "name": "DocumentFormattingClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether formatting supports dynamic registration." - } - ], - "documentation": "Client capabilities of a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether range formatting supports dynamic registration." - } - ], - "documentation": "Client capabilities of a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether on type formatting supports dynamic registration." - } - ], - "documentation": "Client capabilities of a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "RenameClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether rename supports dynamic registration." - }, - { - "name": "prepareSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports testing for validity of rename operations\nbefore execution.\n\n@since 3.12.0", - "since": "3.12.0" - }, - { - "name": "prepareSupportDefaultBehavior", - "type": { - "kind": "reference", - "name": "PrepareSupportDefaultBehavior" - }, - "optional": true, - "documentation": "Client supports the default behavior result.\n\nThe value indicates the default behavior used by the\nclient.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "honorsChangeAnnotations", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client honors the change annotations in\ntext edits and resource operations returned via the\nrename request's workspace edit by for example presenting\nthe workspace edit in the user interface and asking\nfor confirmation.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - }, - { - "name": "FoldingRangeClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration for folding range\nproviders. If this is set to `true` the client supports the new\n`FoldingRangeRegistrationOptions` return value for the corresponding\nserver capability as well." - }, - { - "name": "rangeLimit", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The maximum number of folding ranges that the client prefers to receive\nper document. The value serves as a hint, servers are free to follow the\nlimit." - }, - { - "name": "lineFoldingOnly", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If set, the client signals that it only supports folding complete lines.\nIf set, client will ignore specified `startCharacter` and `endCharacter`\nproperties in a FoldingRange." - }, - { - "name": "foldingRangeKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FoldingRangeKind" - } - }, - "optional": true, - "documentation": "The folding range kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown." - } - ] - } - }, - "optional": true, - "documentation": "Specific options for the folding range kind.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "foldingRange", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "collapsedText", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If set, the client signals that it supports setting collapsedText on\nfolding ranges to display custom labels instead of the default text.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "Specific options for the folding range.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - }, - { - "name": "SelectionRangeClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration for selection range providers. If this is set to `true`\nthe client supports the new `SelectionRangeRegistrationOptions` return value for the corresponding server\ncapability as well." - } - ] - }, - { - "name": "PublishDiagnosticsClientCapabilities", - "properties": [ - { - "name": "relatedInformation", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the clients accepts diagnostics with related information." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DiagnosticTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "Client supports the tag property to provide meta data about a diagnostic.\nClients supporting tags have to handle unknown tags gracefully.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "versionSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client interprets the version property of the\n`textDocument/publishDiagnostics` notification's parameter.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "codeDescriptionSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports a codeDescription property\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "dataSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `data` property which is\npreserved between a `textDocument/publishDiagnostics` and\n`textDocument/codeAction` request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "The publish diagnostic client capabilities." - }, - { - "name": "CallHierarchyClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - }, - { - "name": "requests", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "range", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [] - } - } - ] - }, - "optional": true, - "documentation": "The client will send the `textDocument/semanticTokens/range` request if\nthe server provides a corresponding handler." - }, - { - "name": "full", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "delta", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client will send the `textDocument/semanticTokens/full/delta` request if\nthe server provides a corresponding handler." - } - ] - } - } - ] - }, - "optional": true, - "documentation": "The client will send the `textDocument/semanticTokens/full` request if\nthe server provides a corresponding handler." - } - ] - } - }, - "documentation": "Which requests the client supports and might send to the server\ndepending on the server's capability. Please note that clients might not\nshow semantic tokens or degrade some of the user experience if a range\nor full request is advertised by the client but not provided by the\nserver. If for example the client capability `requests.full` and\n`request.range` are both set to true but the server only provides a\nrange provider the client might not render a minimap correctly or might\neven decide to not show any semantic tokens at all." - }, - { - "name": "tokenTypes", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token types that the client supports." - }, - { - "name": "tokenModifiers", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token modifiers that the client supports." - }, - { - "name": "formats", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TokenFormat" - } - }, - "documentation": "The token formats the clients supports." - }, - { - "name": "overlappingTokenSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports tokens that can overlap each other." - }, - { - "name": "multilineTokenSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports tokens that can span multiple lines." - }, - { - "name": "serverCancelSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client allows the server to actively cancel a\nsemantic token request, e.g. supports returning\nLSPErrorCodes.ServerCancelled. If a server does the client\nneeds to retrigger the request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "augmentsSyntaxTokens", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client uses semantic tokens to augment existing\nsyntax tokens. If set to `true` client side created syntax\ntokens and semantic tokens are both used for colorization. If\nset to `false` the client only uses the returned semantic tokens\nfor colorization.\n\nIf the value is `undefined` then the client behavior is not\nspecified.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - } - ], - "documentation": "Client capabilities for the linked editing range request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether moniker supports dynamic registration. If this is set to `true`\nthe client supports the new `MonikerRegistrationOptions` return value\nfor the corresponding server capability as well." - } - ], - "documentation": "Client capabilities specific to the moniker request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "TypeHierarchyClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - } - ], - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration for inline value providers." - } - ], - "documentation": "Client capabilities specific to inline values.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether inlay hints support dynamic registration." - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily." - } - ] - } - }, - "optional": true, - "documentation": "Indicates which properties a client can resolve lazily on an inlay\nhint." - } - ], - "documentation": "Inlay hint client capabilities.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - }, - { - "name": "relatedDocumentSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the clients supports related documents for document diagnostic pulls." - } - ], - "documentation": "Client capabilities specific to diagnostic pull requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentSyncClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is\nset to `true` the client supports the new\n`(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - }, - { - "name": "executionSummarySupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports sending execution summary data per cell." - } - ], - "documentation": "Notebook specific client capabilities.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ShowMessageRequestClientCapabilities", - "properties": [ - { - "name": "messageActionItem", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "additionalPropertiesSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports additional attributes which\nare preserved and send back to the server in the\nrequest's response." - } - ] - } - }, - "optional": true, - "documentation": "Capabilities specific to the `MessageActionItem` type." - } - ], - "documentation": "Show message request client capabilities" - }, - { - "name": "ShowDocumentClientCapabilities", - "properties": [ - { - "name": "support", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "The client has support for the showDocument\nrequest." - } - ], - "documentation": "Client capabilities for the showDocument request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "RegularExpressionsClientCapabilities", - "properties": [ - { - "name": "engine", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The engine's name." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The engine's version." - } - ], - "documentation": "Client capabilities specific to regular expressions.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MarkdownClientCapabilities", - "properties": [ - { - "name": "parser", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the parser." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The version of the parser." - }, - { - "name": "allowedTags", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "A list of HTML tags that the client allows / supports in\nMarkdown.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Client capabilities specific to the used markdown parser.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "enumerations": [ - { - "name": "SemanticTokenTypes", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "namespace", - "value": "namespace" - }, - { - "name": "type", - "value": "type", - "documentation": "Represents a generic type. Acts as a fallback for types which can't be mapped to\na specific type like class or enum." - }, - { - "name": "class", - "value": "class" - }, - { - "name": "enum", - "value": "enum" - }, - { - "name": "interface", - "value": "interface" - }, - { - "name": "struct", - "value": "struct" - }, - { - "name": "typeParameter", - "value": "typeParameter" - }, - { - "name": "parameter", - "value": "parameter" - }, - { - "name": "variable", - "value": "variable" - }, - { - "name": "property", - "value": "property" - }, - { - "name": "enumMember", - "value": "enumMember" - }, - { - "name": "event", - "value": "event" - }, - { - "name": "function", - "value": "function" - }, - { - "name": "method", - "value": "method" - }, - { - "name": "macro", - "value": "macro" - }, - { - "name": "keyword", - "value": "keyword" - }, - { - "name": "modifier", - "value": "modifier" - }, - { - "name": "comment", - "value": "comment" - }, - { - "name": "string", - "value": "string" - }, - { - "name": "number", - "value": "number" - }, - { - "name": "regexp", - "value": "regexp" - }, - { - "name": "operator", - "value": "operator" - }, - { - "name": "decorator", - "value": "decorator", - "documentation": "@since 3.17.0", - "since": "3.17.0" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined token types. This set is not fixed\nan clients can specify additional token types via the\ncorresponding client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokenModifiers", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "declaration", - "value": "declaration" - }, - { - "name": "definition", - "value": "definition" - }, - { - "name": "readonly", - "value": "readonly" - }, - { - "name": "static", - "value": "static" - }, - { - "name": "deprecated", - "value": "deprecated" - }, - { - "name": "abstract", - "value": "abstract" - }, - { - "name": "async", - "value": "async" - }, - { - "name": "modification", - "value": "modification" - }, - { - "name": "documentation", - "value": "documentation" - }, - { - "name": "defaultLibrary", - "value": "defaultLibrary" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined token modifiers. This set is not fixed\nan clients can specify additional token types via the\ncorresponding client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DocumentDiagnosticReportKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Full", - "value": "full", - "documentation": "A diagnostic report with a full\nset of problems." - }, - { - "name": "Unchanged", - "value": "unchanged", - "documentation": "A report indicating that the last\nreturned report is still accurate." - } - ], - "documentation": "The document diagnostic report kinds.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ErrorCodes", - "type": { - "kind": "base", - "name": "integer" - }, - "values": [ - { - "name": "ParseError", - "value": -32700 - }, - { - "name": "InvalidRequest", - "value": -32600 - }, - { - "name": "MethodNotFound", - "value": -32601 - }, - { - "name": "InvalidParams", - "value": -32602 - }, - { - "name": "InternalError", - "value": -32603 - }, - { - "name": "ServerNotInitialized", - "value": -32002, - "documentation": "Error code indicating that a server received a notification or\nrequest before the server has received the `initialize` request." - }, - { - "name": "UnknownErrorCode", - "value": -32001 - } - ], - "supportsCustomValues": true, - "documentation": "Predefined error codes." - }, - { - "name": "LSPErrorCodes", - "type": { - "kind": "base", - "name": "integer" - }, - "values": [ - { - "name": "RequestFailed", - "value": -32803, - "documentation": "A request failed but it was syntactically correct, e.g the\nmethod name was known and the parameters were valid. The error\nmessage should contain human readable information about why\nthe request failed.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ServerCancelled", - "value": -32802, - "documentation": "The server cancelled the request. This error code should\nonly be used for requests that explicitly support being\nserver cancellable.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ContentModified", - "value": -32801, - "documentation": "The server detected that the content of a document got\nmodified outside normal conditions. A server should\nNOT send this error code if it detects a content change\nin it unprocessed messages. The result even computed\non an older state might still be useful for the client.\n\nIf a client decides that a result is not of any use anymore\nthe client should cancel the request." - }, - { - "name": "RequestCancelled", - "value": -32800, - "documentation": "The client has canceled a request and a server as detected\nthe cancel." - } - ], - "supportsCustomValues": true - }, - { - "name": "FoldingRangeKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Comment", - "value": "comment", - "documentation": "Folding range for a comment" - }, - { - "name": "Imports", - "value": "imports", - "documentation": "Folding range for an import or include" - }, - { - "name": "Region", - "value": "region", - "documentation": "Folding range for a region (e.g. `#region`)" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined range kinds." - }, - { - "name": "SymbolKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "File", - "value": 1 - }, - { - "name": "Module", - "value": 2 - }, - { - "name": "Namespace", - "value": 3 - }, - { - "name": "Package", - "value": 4 - }, - { - "name": "Class", - "value": 5 - }, - { - "name": "Method", - "value": 6 - }, - { - "name": "Property", - "value": 7 - }, - { - "name": "Field", - "value": 8 - }, - { - "name": "Constructor", - "value": 9 - }, - { - "name": "Enum", - "value": 10 - }, - { - "name": "Interface", - "value": 11 - }, - { - "name": "Function", - "value": 12 - }, - { - "name": "Variable", - "value": 13 - }, - { - "name": "Constant", - "value": 14 - }, - { - "name": "String", - "value": 15 - }, - { - "name": "Number", - "value": 16 - }, - { - "name": "Boolean", - "value": 17 - }, - { - "name": "Array", - "value": 18 - }, - { - "name": "Object", - "value": 19 - }, - { - "name": "Key", - "value": 20 - }, - { - "name": "Null", - "value": 21 - }, - { - "name": "EnumMember", - "value": 22 - }, - { - "name": "Struct", - "value": 23 - }, - { - "name": "Event", - "value": 24 - }, - { - "name": "Operator", - "value": 25 - }, - { - "name": "TypeParameter", - "value": 26 - } - ], - "documentation": "A symbol kind." - }, - { - "name": "SymbolTag", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Deprecated", - "value": 1, - "documentation": "Render a symbol as obsolete, usually using a strike-out." - } - ], - "documentation": "Symbol tags are extra annotations that tweak the rendering of a symbol.\n\n@since 3.16", - "since": "3.16" - }, - { - "name": "UniquenessLevel", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "document", - "value": "document", - "documentation": "The moniker is only unique inside a document" - }, - { - "name": "project", - "value": "project", - "documentation": "The moniker is unique inside a project for which a dump got created" - }, - { - "name": "group", - "value": "group", - "documentation": "The moniker is unique inside the group to which a project belongs" - }, - { - "name": "scheme", - "value": "scheme", - "documentation": "The moniker is unique inside the moniker scheme." - }, - { - "name": "global", - "value": "global", - "documentation": "The moniker is globally unique" - } - ], - "documentation": "Moniker uniqueness level to define scope of the moniker.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "import", - "value": "import", - "documentation": "The moniker represent a symbol that is imported into a project" - }, - { - "name": "export", - "value": "export", - "documentation": "The moniker represents a symbol that is exported from a project" - }, - { - "name": "local", - "value": "local", - "documentation": "The moniker represents a symbol that is local to a project (e.g. a local\nvariable of a function, a class not visible outside the project, ...)" - } - ], - "documentation": "The moniker kind.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "InlayHintKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Type", - "value": 1, - "documentation": "An inlay hint that for a type annotation." - }, - { - "name": "Parameter", - "value": 2, - "documentation": "An inlay hint that is for a parameter." - } - ], - "documentation": "Inlay hint kinds.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "MessageType", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Error", - "value": 1, - "documentation": "An error message." - }, - { - "name": "Warning", - "value": 2, - "documentation": "A warning message." - }, - { - "name": "Info", - "value": 3, - "documentation": "An information message." - }, - { - "name": "Log", - "value": 4, - "documentation": "A log message." - } - ], - "documentation": "The message type" - }, - { - "name": "TextDocumentSyncKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "None", - "value": 0, - "documentation": "Documents should not be synced at all." - }, - { - "name": "Full", - "value": 1, - "documentation": "Documents are synced by always sending the full content\nof the document." - }, - { - "name": "Incremental", - "value": 2, - "documentation": "Documents are synced by sending the full content on open.\nAfter that only incremental updates to the document are\nsend." - } - ], - "documentation": "Defines how the host (editor) should sync\ndocument changes to the language server." - }, - { - "name": "TextDocumentSaveReason", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Manual", - "value": 1, - "documentation": "Manually triggered, e.g. by the user pressing save, by starting debugging,\nor by an API call." - }, - { - "name": "AfterDelay", - "value": 2, - "documentation": "Automatic after a delay." - }, - { - "name": "FocusOut", - "value": 3, - "documentation": "When the editor lost focus." - } - ], - "documentation": "Represents reasons why a text document is saved." - }, - { - "name": "CompletionItemKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Text", - "value": 1 - }, - { - "name": "Method", - "value": 2 - }, - { - "name": "Function", - "value": 3 - }, - { - "name": "Constructor", - "value": 4 - }, - { - "name": "Field", - "value": 5 - }, - { - "name": "Variable", - "value": 6 - }, - { - "name": "Class", - "value": 7 - }, - { - "name": "Interface", - "value": 8 - }, - { - "name": "Module", - "value": 9 - }, - { - "name": "Property", - "value": 10 - }, - { - "name": "Unit", - "value": 11 - }, - { - "name": "Value", - "value": 12 - }, - { - "name": "Enum", - "value": 13 - }, - { - "name": "Keyword", - "value": 14 - }, - { - "name": "Snippet", - "value": 15 - }, - { - "name": "Color", - "value": 16 - }, - { - "name": "File", - "value": 17 - }, - { - "name": "Reference", - "value": 18 - }, - { - "name": "Folder", - "value": 19 - }, - { - "name": "EnumMember", - "value": 20 - }, - { - "name": "Constant", - "value": 21 - }, - { - "name": "Struct", - "value": 22 - }, - { - "name": "Event", - "value": 23 - }, - { - "name": "Operator", - "value": 24 - }, - { - "name": "TypeParameter", - "value": 25 - } - ], - "documentation": "The kind of a completion entry." - }, - { - "name": "CompletionItemTag", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Deprecated", - "value": 1, - "documentation": "Render a completion as obsolete, usually using a strike-out." - } - ], - "documentation": "Completion item tags are extra annotations that tweak the rendering of a completion\nitem.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "InsertTextFormat", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "PlainText", - "value": 1, - "documentation": "The primary text to be inserted is treated as a plain string." - }, - { - "name": "Snippet", - "value": 2, - "documentation": "The primary text to be inserted is treated as a snippet.\n\nA snippet can define tab stops and placeholders with `$1`, `$2`\nand `${3:foo}`. `$0` defines the final tab stop, it defaults to\nthe end of the snippet. Placeholders with equal identifiers are linked,\nthat is typing in one will update others too.\n\nSee also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax" - } - ], - "documentation": "Defines whether the insert text in a completion item should be interpreted as\nplain text or a snippet." - }, - { - "name": "InsertTextMode", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "asIs", - "value": 1, - "documentation": "The insertion or replace strings is taken as it is. If the\nvalue is multi line the lines below the cursor will be\ninserted using the indentation defined in the string value.\nThe client will not apply any kind of adjustments to the\nstring." - }, - { - "name": "adjustIndentation", - "value": 2, - "documentation": "The editor adjusts leading whitespace of new lines so that\nthey match the indentation up to the cursor of the line for\nwhich the item is accepted.\n\nConsider a line like this: <2tabs><3tabs>foo. Accepting a\nmulti line completion item is indented using 2 tabs and all\nfollowing lines inserted will be indented using 2 tabs as well." - } - ], - "documentation": "How whitespace and indentation is handled during completion\nitem insertion.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DocumentHighlightKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Text", - "value": 1, - "documentation": "A textual occurrence." - }, - { - "name": "Read", - "value": 2, - "documentation": "Read-access of a symbol, like reading a variable." - }, - { - "name": "Write", - "value": 3, - "documentation": "Write-access of a symbol, like writing to a variable." - } - ], - "documentation": "A document highlight kind." - }, - { - "name": "CodeActionKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Empty", - "value": "", - "documentation": "Empty kind." - }, - { - "name": "QuickFix", - "value": "quickfix", - "documentation": "Base kind for quickfix actions: 'quickfix'" - }, - { - "name": "Refactor", - "value": "refactor", - "documentation": "Base kind for refactoring actions: 'refactor'" - }, - { - "name": "RefactorExtract", - "value": "refactor.extract", - "documentation": "Base kind for refactoring extraction actions: 'refactor.extract'\n\nExample extract actions:\n\n- Extract method\n- Extract function\n- Extract variable\n- Extract interface from class\n- ..." - }, - { - "name": "RefactorInline", - "value": "refactor.inline", - "documentation": "Base kind for refactoring inline actions: 'refactor.inline'\n\nExample inline actions:\n\n- Inline function\n- Inline variable\n- Inline constant\n- ..." - }, - { - "name": "RefactorRewrite", - "value": "refactor.rewrite", - "documentation": "Base kind for refactoring rewrite actions: 'refactor.rewrite'\n\nExample rewrite actions:\n\n- Convert JavaScript function to class\n- Add or remove parameter\n- Encapsulate field\n- Make method static\n- Move method to base class\n- ..." - }, - { - "name": "Source", - "value": "source", - "documentation": "Base kind for source actions: `source`\n\nSource code actions apply to the entire file." - }, - { - "name": "SourceOrganizeImports", - "value": "source.organizeImports", - "documentation": "Base kind for an organize imports source action: `source.organizeImports`" - }, - { - "name": "SourceFixAll", - "value": "source.fixAll", - "documentation": "Base kind for auto-fix source actions: `source.fixAll`.\n\nFix all actions automatically fix errors that have a clear fix that do not require user input.\nThey should not suppress errors or perform unsafe fixes such as generating new types or classes.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined code action kinds" - }, - { - "name": "TraceValues", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Off", - "value": "off", - "documentation": "Turn tracing off." - }, - { - "name": "Messages", - "value": "messages", - "documentation": "Trace messages only." - }, - { - "name": "Verbose", - "value": "verbose", - "documentation": "Verbose message tracing." - } - ] - }, - { - "name": "MarkupKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "PlainText", - "value": "plaintext", - "documentation": "Plain text is supported as a content format" - }, - { - "name": "Markdown", - "value": "markdown", - "documentation": "Markdown is supported as a content format" - } - ], - "documentation": "Describes the content type that a client supports in various\nresult literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n\nPlease note that `MarkupKinds` must not start with a `$`. This kinds\nare reserved for internal usage." - }, - { - "name": "PositionEncodingKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "UTF8", - "value": "utf-8", - "documentation": "Character offsets count UTF-8 code units." - }, - { - "name": "UTF16", - "value": "utf-16", - "documentation": "Character offsets count UTF-16 code units.\n\nThis is the default and must always be supported\nby servers" - }, - { - "name": "UTF32", - "value": "utf-32", - "documentation": "Character offsets count UTF-32 code units.\n\nImplementation note: these are the same as Unicode code points,\nso this `PositionEncodingKind` may also be used for an\nencoding-agnostic representation of character offsets." - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined position encoding kinds.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FileChangeType", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Created", - "value": 1, - "documentation": "The file got created." - }, - { - "name": "Changed", - "value": 2, - "documentation": "The file got changed." - }, - { - "name": "Deleted", - "value": 3, - "documentation": "The file got deleted." - } - ], - "documentation": "The file event type" - }, - { - "name": "WatchKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Create", - "value": 1, - "documentation": "Interested in create events." - }, - { - "name": "Change", - "value": 2, - "documentation": "Interested in change events" - }, - { - "name": "Delete", - "value": 4, - "documentation": "Interested in delete events" - } - ], - "supportsCustomValues": true - }, - { - "name": "DiagnosticSeverity", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Error", - "value": 1, - "documentation": "Reports an error." - }, - { - "name": "Warning", - "value": 2, - "documentation": "Reports a warning." - }, - { - "name": "Information", - "value": 3, - "documentation": "Reports an information." - }, - { - "name": "Hint", - "value": 4, - "documentation": "Reports a hint." - } - ], - "documentation": "The diagnostic's severity." - }, - { - "name": "DiagnosticTag", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Unnecessary", - "value": 1, - "documentation": "Unused or unnecessary code.\n\nClients are allowed to render diagnostics with this tag faded out instead of having\nan error squiggle." - }, - { - "name": "Deprecated", - "value": 2, - "documentation": "Deprecated or obsolete code.\n\nClients are allowed to rendered diagnostics with this tag strike through." - } - ], - "documentation": "The diagnostic tags.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "CompletionTriggerKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Invoked", - "value": 1, - "documentation": "Completion was triggered by typing an identifier (24x7 code\ncomplete), manual invocation (e.g Ctrl+Space) or via API." - }, - { - "name": "TriggerCharacter", - "value": 2, - "documentation": "Completion was triggered by a trigger character specified by\nthe `triggerCharacters` properties of the `CompletionRegistrationOptions`." - }, - { - "name": "TriggerForIncompleteCompletions", - "value": 3, - "documentation": "Completion was re-triggered as current completion list is incomplete" - } - ], - "documentation": "How a completion was triggered" - }, - { - "name": "SignatureHelpTriggerKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Invoked", - "value": 1, - "documentation": "Signature help was invoked manually by the user or by a command." - }, - { - "name": "TriggerCharacter", - "value": 2, - "documentation": "Signature help was triggered by a trigger character." - }, - { - "name": "ContentChange", - "value": 3, - "documentation": "Signature help was triggered by the cursor moving or by the document content changing." - } - ], - "documentation": "How a signature help was triggered.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "CodeActionTriggerKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Invoked", - "value": 1, - "documentation": "Code actions were explicitly requested by the user or by an extension." - }, - { - "name": "Automatic", - "value": 2, - "documentation": "Code actions were requested automatically.\n\nThis typically happens when current selection in a file changes, but can\nalso be triggered when file content changes." - } - ], - "documentation": "The reason why code actions were requested.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FileOperationPatternKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "file", - "value": "file", - "documentation": "The pattern matches a file only." - }, - { - "name": "folder", - "value": "folder", - "documentation": "The pattern matches a folder only." - } - ], - "documentation": "A pattern kind describing if a glob pattern matches a file a folder or\nboth.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "NotebookCellKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Markup", - "value": 1, - "documentation": "A markup-cell is formatted source that is used for display." - }, - { - "name": "Code", - "value": 2, - "documentation": "A code-cell is source code." - } - ], - "documentation": "A notebook cell kind.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ResourceOperationKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Create", - "value": "create", - "documentation": "Supports creating new files and folders." - }, - { - "name": "Rename", - "value": "rename", - "documentation": "Supports renaming existing files and folders." - }, - { - "name": "Delete", - "value": "delete", - "documentation": "Supports deleting existing files and folders." - } - ] - }, - { - "name": "FailureHandlingKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Abort", - "value": "abort", - "documentation": "Applying the workspace change is simply aborted if one of the changes provided\nfails. All operations executed before the failing operation stay executed." - }, - { - "name": "Transactional", - "value": "transactional", - "documentation": "All operations are executed transactional. That means they either all\nsucceed or no changes at all are applied to the workspace." - }, - { - "name": "TextOnlyTransactional", - "value": "textOnlyTransactional", - "documentation": "If the workspace edit contains only textual file changes they are executed transactional.\nIf resource changes (create, rename or delete file) are part of the change the failure\nhandling strategy is abort." - }, - { - "name": "Undo", - "value": "undo", - "documentation": "The client tries to undo the operations already executed. But there is no\nguarantee that this is succeeding." - } - ] - }, - { - "name": "PrepareSupportDefaultBehavior", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Identifier", - "value": 1, - "documentation": "The client's default behavior is to select the identifier\naccording the to language's syntax rule." - } - ] - }, - { - "name": "TokenFormat", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Relative", - "value": "relative" - } - ] - } - ], - "typeAliases": [ - { - "name": "Definition", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Location" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - } - ] - }, - "documentation": "The definition of a symbol represented as one or many {@link Location locations}.\nFor most programming languages there is only one location at which a symbol is\ndefined.\n\nServers should prefer returning `DefinitionLink` over `Definition` if supported\nby the client." - }, - { - "name": "DefinitionLink", - "type": { - "kind": "reference", - "name": "LocationLink" - }, - "documentation": "Information about where a symbol is defined.\n\nProvides additional metadata over normal {@link Location location} definitions, including the range of\nthe defining symbol" - }, - { - "name": "LSPArray", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "documentation": "LSP arrays.\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "LSPAny", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "LSPObject" - }, - { - "kind": "reference", - "name": "LSPArray" - }, - { - "kind": "base", - "name": "string" - }, - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "uinteger" - }, - { - "kind": "base", - "name": "decimal" - }, - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The LSP any type.\nPlease note that strictly speaking a property with the value `undefined`\ncan't be converted into JSON preserving the property name. However for\nconvenience it is allowed and assumed that all these properties are\noptional as well.\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "Declaration", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Location" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - } - ] - }, - "documentation": "The declaration of a symbol representation as one or many {@link Location locations}." - }, - { - "name": "DeclarationLink", - "type": { - "kind": "reference", - "name": "LocationLink" - }, - "documentation": "Information about where a symbol is declared.\n\nProvides additional metadata over normal {@link Location location} declarations, including the range of\nthe declaring symbol.\n\nServers should prefer returning `DeclarationLink` over `Declaration` if supported\nby the client." - }, - { - "name": "InlineValue", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "InlineValueText" - }, - { - "kind": "reference", - "name": "InlineValueVariableLookup" - }, - { - "kind": "reference", - "name": "InlineValueEvaluatableExpression" - } - ] - }, - "documentation": "Inline value information can be provided by different means:\n- directly as a text value (class InlineValueText).\n- as a name to use for a variable lookup (class InlineValueVariableLookup)\n- as an evaluatable expression (class InlineValueEvaluatableExpression)\nThe InlineValue types combines all inline value types into one type.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DocumentDiagnosticReport", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "RelatedFullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "RelatedUnchangedDocumentDiagnosticReport" - } - ] - }, - "documentation": "The result of a document diagnostic pull request. A report can\neither be a full report containing all diagnostics for the\nrequested document or an unchanged report indicating that nothing\nhas changed in terms of diagnostics in comparison to the last\npull request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "PrepareRenameResult", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Range" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - } - }, - { - "name": "placeholder", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "defaultBehavior", - "type": { - "kind": "base", - "name": "boolean" - } - } - ] - } - } - ] - } - }, - { - "name": "DocumentSelector", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentFilter" - } - }, - "documentation": "A document selector is the combination of one or many document filters.\n\n@sample `let sel:DocumentSelector = [{ language: 'typescript' }, { language: 'json', pattern: '**∕tsconfig.json' }]`;\n\nThe use of a string as a document filter is deprecated @since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "ProgressToken", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "string" - } - ] - } - }, - { - "name": "ChangeAnnotationIdentifier", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "An identifier to refer to a change annotation stored with a workspace edit." - }, - { - "name": "WorkspaceDocumentDiagnosticReport", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceFullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "WorkspaceUnchangedDocumentDiagnosticReport" - } - ] - }, - "documentation": "A workspace diagnostic document report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentContentChangeEvent", - "type": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range of the document that changed." - }, - { - "name": "rangeLength", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The optional length of the range that got replaced.\n\n@deprecated use range instead." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The new text for the provided range." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The new text of the whole document." - } - ] - } - } - ] - }, - "documentation": "An event describing a change to a text document. If only a text is provided\nit is considered to be the full content of the document." - }, - { - "name": "MarkedString", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - } - }, - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - } - ] - }, - "documentation": "MarkedString can be used to render human readable text. It is either a markdown string\nor a code-block that provides a language and a code snippet. The language identifier\nis semantically equal to the optional language identifier in fenced code blocks in GitHub\nissues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting\n\nThe pair of a language and a value is an equivalent to markdown:\n```${language}\n${value}\n```\n\nNote that markdown strings will be sanitized - that means html will be escaped.\n@deprecated use MarkupContent instead.", - "deprecated": "use MarkupContent instead." - }, - { - "name": "DocumentFilter", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextDocumentFilter" - }, - { - "kind": "reference", - "name": "NotebookCellTextDocumentFilter" - } - ] - }, - "documentation": "A document filter describes a top level text document or\na notebook cell document.\n\n@since 3.17.0 - proposed support for NotebookCellTextDocumentFilter.", - "since": "3.17.0 - proposed support for NotebookCellTextDocumentFilter." - }, - { - "name": "LSPObject", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "string" - }, - "value": { - "kind": "reference", - "name": "LSPAny" - } - }, - "documentation": "LSP object definition.\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "GlobPattern", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Pattern" - }, - { - "kind": "reference", - "name": "RelativePattern" - } - ] - }, - "documentation": "The glob pattern. Either a string pattern or a relative pattern.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentFilter", - "type": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A language id, like `typescript`." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern, like `*.{ts,js}`." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A language id, like `typescript`." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern, like `*.{ts,js}`." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A language id, like `typescript`." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A glob pattern, like `*.{ts,js}`." - } - ] - } - } - ] - }, - "documentation": "A document filter denotes a document by different properties like\nthe {@link TextDocument.languageId language}, the {@link Uri.scheme scheme} of\nits resource, or a glob-pattern that is applied to the {@link TextDocument.fileName path}.\n\nGlob patterns can have the following syntax:\n- `*` to match one or more characters in a path segment\n- `?` to match on one character in a path segment\n- `**` to match any number of path segments, including none\n- `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)\n- `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)\n- `[!...]` 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`)\n\n@sample A language filter that applies to typescript files on disk: `{ language: 'typescript', scheme: 'file' }`\n@sample A language filter that applies to all package.json paths: `{ language: 'json', pattern: '**package.json' }`\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentFilter", - "type": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The type of the enclosing notebook." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The type of the enclosing notebook." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The type of the enclosing notebook." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A glob pattern." - } - ] - } - } - ] - }, - "documentation": "A notebook document filter denotes a notebook document by\ndifferent properties. The properties will be match\nagainst the notebook's URI (same as with documents)\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "Pattern", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The glob pattern to watch relative to the base path. Glob patterns can have the following syntax:\n- `*` to match one or more characters in a path segment\n- `?` to match on one character in a path segment\n- `**` to match any number of path segments, including none\n- `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)\n- `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)\n- `[!...]` 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`)\n\n@since 3.17.0", - "since": "3.17.0" - } - ] -} diff --git a/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.schema.json b/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.schema.json deleted file mode 100644 index f50cf3702..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.schema.json +++ /dev/null @@ -1,783 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "AndType": { - "additionalProperties": false, - "description": "Represents an `and`type (e.g. TextDocumentParams & WorkDoneProgressParams`).", - "properties": { - "items": { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "kind": { - "const": "and", - "type": "string" - } - }, - "required": [ - "kind", - "items" - ], - "type": "object" - }, - "ArrayType": { - "additionalProperties": false, - "description": "Represents an array type (e.g. `TextDocument[]`).", - "properties": { - "element": { - "$ref": "#/definitions/Type" - }, - "kind": { - "const": "array", - "type": "string" - } - }, - "required": [ - "kind", - "element" - ], - "type": "object" - }, - "BaseType": { - "additionalProperties": false, - "description": "Represents a base type like `string` or `DocumentUri`.", - "properties": { - "kind": { - "const": "base", - "type": "string" - }, - "name": { - "$ref": "#/definitions/BaseTypes" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - "BaseTypes": { - "enum": [ - "URI", - "DocumentUri", - "integer", - "uinteger", - "decimal", - "RegExp", - "string", - "boolean", - "null" - ], - "type": "string" - }, - "BooleanLiteralType": { - "additionalProperties": false, - "description": "Represents a boolean literal type (e.g. `kind: true`).", - "properties": { - "kind": { - "const": "booleanLiteral", - "type": "string" - }, - "value": { - "type": "boolean" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "Enumeration": { - "additionalProperties": false, - "description": "Defines an enumeration.", - "properties": { - "deprecated": { - "description": "Whether the enumeration is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The name of the enumeration.", - "type": "string" - }, - "proposed": { - "description": "Whether this is a proposed enumeration. If omitted, the enumeration is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this enumeration is available. Is undefined if not known.", - "type": "string" - }, - "supportsCustomValues": { - "description": "Whether the enumeration supports custom values (e.g. values which are not part of the set defined in `values`). If omitted no custom values are supported.", - "type": "boolean" - }, - "type": { - "$ref": "#/definitions/EnumerationType", - "description": "The type of the elements." - }, - "values": { - "description": "The enum values.", - "items": { - "$ref": "#/definitions/EnumerationEntry" - }, - "type": "array" - } - }, - "required": [ - "name", - "type", - "values" - ], - "type": "object" - }, - "EnumerationEntry": { - "additionalProperties": false, - "description": "Defines an enumeration entry.", - "properties": { - "deprecated": { - "description": "Whether the enum entry is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The name of the enum item.", - "type": "string" - }, - "proposed": { - "description": "Whether this is a proposed enumeration entry. If omitted, the enumeration entry is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this enumeration entry is available. Is undefined if not known.", - "type": "string" - }, - "value": { - "description": "The value.", - "type": [ - "string", - "number" - ] - } - }, - "required": [ - "name", - "value" - ], - "type": "object" - }, - "EnumerationType": { - "additionalProperties": false, - "properties": { - "kind": { - "const": "base", - "type": "string" - }, - "name": { - "enum": [ - "string", - "integer", - "uinteger" - ], - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - "IntegerLiteralType": { - "additionalProperties": false, - "properties": { - "kind": { - "const": "integerLiteral", - "description": "Represents an integer literal type (e.g. `kind: 1`).", - "type": "string" - }, - "value": { - "type": "number" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "MapKeyType": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "base", - "type": "string" - }, - "name": { - "enum": [ - "URI", - "DocumentUri", - "string", - "integer" - ], - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - { - "$ref": "#/definitions/ReferenceType" - } - ], - "description": "Represents a type that can be used as a key in a map type. If a reference type is used then the type must either resolve to a `string` or `integer` type. (e.g. `type ChangeAnnotationIdentifier === string`)." - }, - "MapType": { - "additionalProperties": false, - "description": "Represents a JSON object map (e.g. `interface Map { [key: K] => V; }`).", - "properties": { - "key": { - "$ref": "#/definitions/MapKeyType" - }, - "kind": { - "const": "map", - "type": "string" - }, - "value": { - "$ref": "#/definitions/Type" - } - }, - "required": [ - "kind", - "key", - "value" - ], - "type": "object" - }, - "MessageDirection": { - "description": "Indicates in which direction a message is sent in the protocol.", - "enum": [ - "clientToServer", - "serverToClient", - "both" - ], - "type": "string" - }, - "MetaData": { - "additionalProperties": false, - "properties": { - "version": { - "description": "The protocol version.", - "type": "string" - } - }, - "required": [ - "version" - ], - "type": "object" - }, - "MetaModel": { - "additionalProperties": false, - "description": "The actual meta model.", - "properties": { - "enumerations": { - "description": "The enumerations.", - "items": { - "$ref": "#/definitions/Enumeration" - }, - "type": "array" - }, - "metaData": { - "$ref": "#/definitions/MetaData", - "description": "Additional meta data." - }, - "notifications": { - "description": "The notifications.", - "items": { - "$ref": "#/definitions/Notification" - }, - "type": "array" - }, - "requests": { - "description": "The requests.", - "items": { - "$ref": "#/definitions/Request" - }, - "type": "array" - }, - "structures": { - "description": "The structures.", - "items": { - "$ref": "#/definitions/Structure" - }, - "type": "array" - }, - "typeAliases": { - "description": "The type aliases.", - "items": { - "$ref": "#/definitions/TypeAlias" - }, - "type": "array" - } - }, - "required": [ - "metaData", - "requests", - "notifications", - "structures", - "enumerations", - "typeAliases" - ], - "type": "object" - }, - "Notification": { - "additionalProperties": false, - "description": "Represents a LSP notification", - "properties": { - "deprecated": { - "description": "Whether the notification is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation;", - "type": "string" - }, - "messageDirection": { - "$ref": "#/definitions/MessageDirection", - "description": "The direction in which this notification is sent in the protocol." - }, - "method": { - "description": "The request's method name.", - "type": "string" - }, - "params": { - "anyOf": [ - { - "$ref": "#/definitions/Type" - }, - { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - } - ], - "description": "The parameter type(s) if any." - }, - "proposed": { - "description": "Whether this is a proposed notification. If omitted the notification is final.", - "type": "boolean" - }, - "registrationMethod": { - "description": "Optional a dynamic registration method if it different from the request's method.", - "type": "string" - }, - "registrationOptions": { - "$ref": "#/definitions/Type", - "description": "Optional registration options if the notification supports dynamic registration." - }, - "since": { - "description": "Since when (release number) this notification is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "method", - "messageDirection" - ], - "type": "object" - }, - "OrType": { - "additionalProperties": false, - "description": "Represents an `or` type (e.g. `Location | LocationLink`).", - "properties": { - "items": { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "kind": { - "const": "or", - "type": "string" - } - }, - "required": [ - "kind", - "items" - ], - "type": "object" - }, - "Property": { - "additionalProperties": false, - "description": "Represents an object property.", - "properties": { - "deprecated": { - "description": "Whether the property is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The property name;", - "type": "string" - }, - "optional": { - "description": "Whether the property is optional. If omitted, the property is mandatory.", - "type": "boolean" - }, - "proposed": { - "description": "Whether this is a proposed property. If omitted, the structure is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this property is available. Is undefined if not known.", - "type": "string" - }, - "type": { - "$ref": "#/definitions/Type", - "description": "The type of the property" - } - }, - "required": [ - "name", - "type" - ], - "type": "object" - }, - "ReferenceType": { - "additionalProperties": false, - "description": "Represents a reference to another type (e.g. `TextDocument`). This is either a `Structure`, a `Enumeration` or a `TypeAlias` in the same meta model.", - "properties": { - "kind": { - "const": "reference", - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - "Request": { - "additionalProperties": false, - "description": "Represents a LSP request", - "properties": { - "deprecated": { - "description": "Whether the request is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation;", - "type": "string" - }, - "errorData": { - "$ref": "#/definitions/Type", - "description": "An optional error data type." - }, - "messageDirection": { - "$ref": "#/definitions/MessageDirection", - "description": "The direction in which this request is sent in the protocol." - }, - "method": { - "description": "The request's method name.", - "type": "string" - }, - "params": { - "anyOf": [ - { - "$ref": "#/definitions/Type" - }, - { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - } - ], - "description": "The parameter type(s) if any." - }, - "partialResult": { - "$ref": "#/definitions/Type", - "description": "Optional partial result type if the request supports partial result reporting." - }, - "proposed": { - "description": "Whether this is a proposed feature. If omitted the feature is final.", - "type": "boolean" - }, - "registrationMethod": { - "description": "Optional a dynamic registration method if it different from the request's method.", - "type": "string" - }, - "registrationOptions": { - "$ref": "#/definitions/Type", - "description": "Optional registration options if the request supports dynamic registration." - }, - "result": { - "$ref": "#/definitions/Type", - "description": "The result type." - }, - "since": { - "description": "Since when (release number) this request is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "method", - "result", - "messageDirection" - ], - "type": "object" - }, - "StringLiteralType": { - "additionalProperties": false, - "description": "Represents a string literal type (e.g. `kind: 'rename'`).", - "properties": { - "kind": { - "const": "stringLiteral", - "type": "string" - }, - "value": { - "type": "string" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "Structure": { - "additionalProperties": false, - "description": "Defines the structure of an object literal.", - "properties": { - "deprecated": { - "description": "Whether the structure is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation;", - "type": "string" - }, - "extends": { - "description": "Structures extended from. This structures form a polymorphic type hierarchy.", - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "mixins": { - "description": "Structures to mix in. The properties of these structures are `copied` into this structure. Mixins don't form a polymorphic type hierarchy in LSP.", - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "name": { - "description": "The name of the structure.", - "type": "string" - }, - "properties": { - "description": "The properties.", - "items": { - "$ref": "#/definitions/Property" - }, - "type": "array" - }, - "proposed": { - "description": "Whether this is a proposed structure. If omitted, the structure is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this structure is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "name", - "properties" - ], - "type": "object" - }, - "StructureLiteral": { - "additionalProperties": false, - "description": "Defines a unnamed structure of an object literal.", - "properties": { - "deprecated": { - "description": "Whether the literal is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "properties": { - "description": "The properties.", - "items": { - "$ref": "#/definitions/Property" - }, - "type": "array" - }, - "proposed": { - "description": "Whether this is a proposed structure. If omitted, the structure is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this structure is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "properties" - ], - "type": "object" - }, - "StructureLiteralType": { - "additionalProperties": false, - "description": "Represents a literal structure (e.g. `property: { start: uinteger; end: uinteger; }`).", - "properties": { - "kind": { - "const": "literal", - "type": "string" - }, - "value": { - "$ref": "#/definitions/StructureLiteral" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "TupleType": { - "additionalProperties": false, - "description": "Represents a `tuple` type (e.g. `[integer, integer]`).", - "properties": { - "items": { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "kind": { - "const": "tuple", - "type": "string" - } - }, - "required": [ - "kind", - "items" - ], - "type": "object" - }, - "Type": { - "anyOf": [ - { - "$ref": "#/definitions/BaseType" - }, - { - "$ref": "#/definitions/ReferenceType" - }, - { - "$ref": "#/definitions/ArrayType" - }, - { - "$ref": "#/definitions/MapType" - }, - { - "$ref": "#/definitions/AndType" - }, - { - "$ref": "#/definitions/OrType" - }, - { - "$ref": "#/definitions/TupleType" - }, - { - "$ref": "#/definitions/StructureLiteralType" - }, - { - "$ref": "#/definitions/StringLiteralType" - }, - { - "$ref": "#/definitions/IntegerLiteralType" - }, - { - "$ref": "#/definitions/BooleanLiteralType" - } - ] - }, - "TypeAlias": { - "additionalProperties": false, - "description": "Defines a type alias. (e.g. `type Definition = Location | LocationLink`)", - "properties": { - "deprecated": { - "description": "Whether the type alias is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The name of the type alias.", - "type": "string" - }, - "proposed": { - "description": "Whether this is a proposed type alias. If omitted, the type alias is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this structure is available. Is undefined if not known.", - "type": "string" - }, - "type": { - "$ref": "#/definitions/Type", - "description": "The aliased type." - } - }, - "required": [ - "name", - "type" - ], - "type": "object" - }, - "TypeKind": { - "enum": [ - "base", - "reference", - "array", - "map", - "and", - "or", - "tuple", - "literal", - "stringLiteral", - "integerLiteral", - "booleanLiteral" - ], - "type": "string" - } - } -} diff --git a/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.ts b/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.ts deleted file mode 100644 index d8d525857..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/metaModel/metaModel.ts +++ /dev/null @@ -1,551 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -export type BaseTypes = 'URI' | 'DocumentUri' | 'integer' | 'uinteger' | 'decimal' | 'RegExp' | 'string' | 'boolean' | 'null'; - -export type TypeKind = 'base' | 'reference' | 'array' | 'map' | 'and' | 'or' | 'tuple' | 'literal' | 'stringLiteral' | 'integerLiteral' | 'booleanLiteral'; - -/** - * Indicates in which direction a message is sent in the protocol. - */ -export type MessageDirection = 'clientToServer' | 'serverToClient' | 'both'; - -/** - * Represents a base type like `string` or `DocumentUri`. - */ -export type BaseType = { - kind: 'base'; - name: BaseTypes; -}; - -/** - * Represents a reference to another type (e.g. `TextDocument`). - * This is either a `Structure`, a `Enumeration` or a `TypeAlias` - * in the same meta model. - */ -export type ReferenceType = { - kind: 'reference'; - name: string; -}; - -/** - * Represents an array type (e.g. `TextDocument[]`). - */ -export type ArrayType = { - kind: 'array'; - element: Type; -}; - -/** - * Represents a type that can be used as a key in a - * map type. If a reference type is used then the - * type must either resolve to a `string` or `integer` - * type. (e.g. `type ChangeAnnotationIdentifier === string`). - */ -export type MapKeyType = { kind: 'base'; name: 'URI' | 'DocumentUri' | 'string' | 'integer' } | ReferenceType; - -/** - * Represents a JSON object map - * (e.g. `interface Map { [key: K] => V; }`). - */ -export type MapType = { - kind: 'map'; - key: MapKeyType; - value: Type; -}; - -/** - * Represents an `and`type - * (e.g. TextDocumentParams & WorkDoneProgressParams`). - */ -export type AndType = { - kind: 'and'; - items: Type[]; -}; - -/** - * Represents an `or` type - * (e.g. `Location | LocationLink`). - */ -export type OrType = { - kind: 'or'; - items: Type[]; -}; - -/** - * Represents a `tuple` type - * (e.g. `[integer, integer]`). - */ -export type TupleType = { - kind: 'tuple'; - items: Type[]; -}; - -/** - * Represents a literal structure - * (e.g. `property: { start: uinteger; end: uinteger; }`). - */ -export type StructureLiteralType = { - kind: 'literal'; - value: StructureLiteral; -}; - -/** - * Represents a string literal type - * (e.g. `kind: 'rename'`). - */ -export type StringLiteralType = { - kind: 'stringLiteral'; - value: string; -}; - -export type IntegerLiteralType = { - /** - * Represents an integer literal type - * (e.g. `kind: 1`). - */ - kind: 'integerLiteral'; - value: number; -}; - -/** - * Represents a boolean literal type - * (e.g. `kind: true`). - */ -export type BooleanLiteralType = { - kind: 'booleanLiteral'; - value: boolean; -}; - -export type Type = BaseType | ReferenceType | ArrayType | MapType | AndType | OrType | TupleType | StructureLiteralType | StringLiteralType | IntegerLiteralType | BooleanLiteralType; - -/** - * Represents a LSP request - */ -export type Request = { - /** - * The request's method name. - */ - method: string; - - /** - * The parameter type(s) if any. - */ - params?: Type | Type[]; - - /** - * The result type. - */ - result: Type; - - /** - * Optional partial result type if the request - * supports partial result reporting. - */ - partialResult?: Type; - - /** - * An optional error data type. - */ - errorData?: Type; - - /** - * Optional a dynamic registration method if it - * different from the request's method. - */ - registrationMethod?: string; - - /** - * Optional registration options if the request - * supports dynamic registration. - */ - registrationOptions?: Type; - - /** - * The direction in which this request is sent - * in the protocol. - */ - messageDirection: MessageDirection; - - /** - * An optional documentation; - */ - documentation?: string; - - /** - * Since when (release number) this request is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed feature. If omitted - * the feature is final. - */ - proposed?: boolean; - - /** - * Whether the request is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Represents a LSP notification - */ -export type Notification = { - /** - * The request's method name. - */ - method: string; - - /** - * The parameter type(s) if any. - */ - params?: Type | Type[]; - - /** - * Optional a dynamic registration method if it - * different from the request's method. - */ - registrationMethod?: string; - - /** - * Optional registration options if the notification - * supports dynamic registration. - */ - registrationOptions?: Type; - - /** - * The direction in which this notification is sent - * in the protocol. - */ - messageDirection: MessageDirection; - - /** - * An optional documentation; - */ - documentation?: string; - - /** - * Since when (release number) this notification is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed notification. If omitted - * the notification is final. - */ - proposed?: boolean; - - /** - * Whether the notification is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Represents an object property. - */ -export type Property = { - /** - * The property name; - */ - name: string; - - /** - * The type of the property - */ - type: Type; - - /** - * Whether the property is optional. If - * omitted, the property is mandatory. - */ - optional?: boolean; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this property is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed property. If omitted, - * the structure is final. - */ - proposed?: boolean; - - /** - * Whether the property is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines the structure of an object literal. - */ -export type Structure = { - /** - * The name of the structure. - */ - name: string; - - /** - * Structures extended from. This structures form - * a polymorphic type hierarchy. - */ - extends?: Type[]; - - /** - * Structures to mix in. The properties of these - * structures are `copied` into this structure. - * Mixins don't form a polymorphic type hierarchy in - * LSP. - */ - mixins?: Type[]; - - /** - * The properties. - */ - properties: Property[]; - - /** - * An optional documentation; - */ - documentation?: string; - - /** - * Since when (release number) this structure is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed structure. If omitted, - * the structure is final. - */ - proposed?: boolean; - - /** - * Whether the structure is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines a unnamed structure of an object literal. - */ -export type StructureLiteral = { - - /** - * The properties. - */ - properties: Property[]; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this structure is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed structure. If omitted, - * the structure is final. - */ - proposed?: boolean; - - /** - * Whether the literal is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines a type alias. - * (e.g. `type Definition = Location | LocationLink`) - */ -export type TypeAlias = { - /** - * The name of the type alias. - */ - name: string; - - /** - * The aliased type. - */ - type: Type; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this structure is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed type alias. If omitted, - * the type alias is final. - */ - proposed?: boolean; - - /** - * Whether the type alias is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines an enumeration entry. - */ -export type EnumerationEntry = { - /** - * The name of the enum item. - */ - name: string; - - /** - * The value. - */ - value: string | number; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this enumeration entry is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed enumeration entry. If omitted, - * the enumeration entry is final. - */ - proposed?: boolean; - - /** - * Whether the enum entry is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -export type EnumerationType = { kind: 'base'; name: 'string' | 'integer' | 'uinteger' }; - -/** - * Defines an enumeration. - */ -export type Enumeration = { - /** - * The name of the enumeration. - */ - name: string; - - /** - * The type of the elements. - */ - type: EnumerationType; - - /** - * The enum values. - */ - values: EnumerationEntry[]; - - /** - * Whether the enumeration supports custom values (e.g. values which are not - * part of the set defined in `values`). If omitted no custom values are - * supported. - */ - supportsCustomValues?: boolean; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this enumeration is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed enumeration. If omitted, - * the enumeration is final. - */ - proposed?: boolean; - - /** - * Whether the enumeration is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -export type MetaData = { - /** - * The protocol version. - */ - version: string; -}; - -/** - * The actual meta model. - */ -export type MetaModel = { - /** - * Additional meta data. - */ - metaData: MetaData; - - /** - * The requests. - */ - requests: Request[]; - - /** - * The notifications. - */ - notifications: Notification[]; - - /** - * The structures. - */ - structures: Structure[]; - - /** - * The enumerations. - */ - enumerations: Enumeration[]; - - /** - * The type aliases. - */ - typeAliases: TypeAlias[]; -}; diff --git a/language-server-protocol/_specifications/lsp/3.17/notebookDocument/notebook.md b/language-server-protocol/_specifications/lsp/3.17/notebookDocument/notebook.md deleted file mode 100644 index 026bc2565..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/notebookDocument/notebook.md +++ /dev/null @@ -1,617 +0,0 @@ -### Notebook Document Synchronization - -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: - -- *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. - -The two concepts are defined as follows: - -
- -```typescript -/** - * A notebook document. - * - * @since 3.17.0 - */ -export interface NotebookDocument { - - /** - * 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[]; -} -``` - -
- - -```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; -} -``` - -
- -```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; -} -``` - -
- -```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: - -
- -```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; -} -``` - -
- -```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/**/; -``` -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 `notebookDocument/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 - -
- -```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; - - /** - * The client supports sending execution summary data per cell. - */ - executionSummarySupport?: 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: - -
- -```typescript -/** - * Options specific to a notebook plus its cells - * to be synced to the server. - * - * If a selector provides 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 - * documents 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. - */ - notebook: 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. - */ - notebook?: 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: - -
- -```typescript -/** - * Registration options specific to a notebook. - * - * @since 3.17.0 - */ -export interface NotebookDocumentSyncRegistrationOptions extends - NotebookDocumentSyncOptions, StaticRegistrationOptions { -} -``` - -#### DidOpenNotebookDocument Notification (:arrow_right:) - -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: - -
- -```typescript -/** - * The params sent in an 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[]; -} -``` - -#### DidChangeNotebookDocument Notification (:arrow_right:) - -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: - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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[]; - }[]; - }; -} -``` - -
- -```typescript -/** - * A change describing how to move a `NotebookCell` - * array from state S to S'. - * - * @since 3.17.0 - */ -export interface NotebookCellArrayChange { - /** - * The start offset of the cell that changed. - */ - start: uinteger; - - /** - * The deleted cells - */ - deleteCount: uinteger; - - /** - * The new cells, if any - */ - cells?: NotebookCell[]; -} -``` - -#### DidSaveNotebookDocument Notification (:arrow_right:) - -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_: - -
- -* method: `notebookDocument/didSave` -* params: `DidSaveNotebookDocumentParams` defined as follows: - -
- -```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; -} -``` - -#### DidCloseNotebookDocument Notification (:arrow_right:) - -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_: - -
- -* method: `notebookDocument/didClose` -* params: `DidCloseNotebookDocumentParams` defined as follows: - -
- -```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[]; -} -``` - -
- -```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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/specification.md b/language-server-protocol/_specifications/lsp/3.17/specification.md deleted file mode 100644 index 27a352351..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/specification.md +++ /dev/null @@ -1,869 +0,0 @@ ---- -title: Specification -shortTitle: 3.17 (Upcoming) -layout: specifications -sectionid: specification-3-17 -toc: specification-3-17-toc -fullTitle: Language Server Protocol Specification - 3.17 -index: 2 -redirect_from: - - specification - - specification/ - - specifications/specification-current - - specifications/specification-current/ ---- - -This document describes the 3.17.x version of the language server protocol. An implementation for node of the 3.17.x version of the protocol can be found [here](https://github.com/Microsoft/vscode-languageserver-node). - -**Note:** edits to this specification can be made via a pull request against this markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.17/specification.md). - -## What's new in 3.17 - -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. - -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. - -## Base Protocol - -The base protocol consists of a header and a content part (comparable to HTTP). The header and content part are -separated by a '\r\n'. - -### Header Part - -The header part consists of header fields. Each header field is comprised of a name and a value, separated by ': ' (a colon and a space). The structure of header fields conform to the [HTTP semantic](https://tools.ietf.org/html/rfc7230#section-3.2). Each header field is terminated by '\r\n'. Considering the last header field and the overall header itself are each terminated with '\r\n', and that at least one header is mandatory, this means that two '\r\n' sequences always immediately precede the content part of a message. - -Currently the following header fields are supported: - -| Header Field Name | Value Type | Description | -|:------------------|:------------|:------------| -| Content-Length | number | The length of the content part in bytes. This header is required. | -| Content-Type | string | The mime type of the content part. Defaults to application/vscode-jsonrpc; charset=utf-8 | -{: .table .table-bordered .table-responsive} - -The header part is encoded using the 'ascii' encoding. This includes the '\r\n' separating the header and content part. - -### Content Part - -Contains the actual content of the message. The content part of a message uses [JSON-RPC](http://www.jsonrpc.org/) to describe requests, responses and notifications. The content part is encoded using the charset provided in the Content-Type field. It defaults to `utf-8`, which is the only encoding supported right now. If a server or client receives a header with a different encoding than `utf-8` it should respond with an error. - -(Prior versions of the protocol used the string constant `utf8` which is not a correct encoding constant according to [specification](http://www.iana.org/assignments/character-sets/character-sets.xhtml).) For backwards compatibility it is highly recommended that a client and a server treats the string `utf8` as `utf-8`. - -### Example: - -``` -Content-Length: ...\r\n -\r\n -{ - "jsonrpc": "2.0", - "id": 1, - "method": "textDocument/didOpen", - "params": { - ... - } -} -``` -### Base Protocol JSON structures - -The following TypeScript definitions describe the base [JSON-RPC protocol](http://www.jsonrpc.org/specification): - -#### Base Types - -The protocol use the following definitions for integers, unsigned integers, decimal numbers, objects and arrays: - -
- -```typescript -/** - * Defines an integer number in the range of -2^31 to 2^31 - 1. - */ -export type integer = number; -``` - -
- -```typescript -/** - * Defines an unsigned integer number in the range of 0 to 2^31 - 1. - */ -export type uinteger = number; -``` - -
- -```typescript -/** - * Defines a decimal number. Since decimal numbers are very - * rare in the language server specification we denote the - * exact range with every decimal using the mathematics - * interval notation (e.g. [0, 1] denotes all decimals d with - * 0 <= d <= 1. - */ -export type decimal = number; -``` - -
- -```typescript -/** - * The LSP any type - * - * @since 3.17.0 - */ -export type LSPAny = LSPObject | LSPArray | string | integer | uinteger | - decimal | boolean | null; -``` - -
- -```typescript -/** - * LSP object definition. - * - * @since 3.17.0 - */ -export type LSPObject = { [key: string]: LSPAny }; -``` - -
- -```typescript -/** - * LSP arrays. - * - * @since 3.17.0 - */ -export type LSPArray = LSPAny[]; -``` - -#### Abstract Message - -A general message as defined by JSON-RPC. The language server protocol always uses "2.0" as the `jsonrpc` version. - -
- -```typescript -interface Message { - jsonrpc: string; -} -``` -#### Request Message - -A request message to describe a request between the client and the server. Every processed request must send a response back to the sender of the request. - -```typescript -interface RequestMessage extends Message { - - /** - * The request id. - */ - id: integer | string; - - /** - * The method to be invoked. - */ - method: string; - - /** - * The method's params. - */ - params?: array | object; -} -``` - -#### Response Message - -A Response Message sent as a result of a request. If a request doesn't provide a result value the receiver of a request still needs to return a response message to conform to the JSON-RPC specification. The result property of the ResponseMessage should be set to `null` in this case to signal a successful request. - -```typescript -interface ResponseMessage extends Message { - /** - * The request id. - */ - id: integer | string | null; - - /** - * The result of a request. This member is REQUIRED on success. - * This member MUST NOT exist if there was an error invoking the method. - */ - result?: string | number | boolean | object | null; - - /** - * The error object in case a request fails. - */ - error?: ResponseError; -} -``` - -
- -```typescript -interface ResponseError { - /** - * A number indicating the error type that occurred. - */ - code: integer; - - /** - * A string providing a short description of the error. - */ - message: string; - - /** - * A primitive or structured value that contains additional - * information about the error. Can be omitted. - */ - data?: string | number | boolean | array | object | null; -} -``` - -
- -```typescript -export namespace ErrorCodes { - // Defined by JSON-RPC - export const ParseError: integer = -32700; - export const InvalidRequest: integer = -32600; - export const MethodNotFound: integer = -32601; - export const InvalidParams: integer = -32602; - export const InternalError: integer = -32603; - - /** - * This is the start range of JSON-RPC reserved error codes. - * It doesn't denote a real error code. No LSP error codes should - * be defined between the start and end range. For backwards - * compatibility the `ServerNotInitialized` and the `UnknownErrorCode` - * are left in the range. - * - * @since 3.16.0 - */ - export const jsonrpcReservedErrorRangeStart: integer = -32099; - /** @deprecated use jsonrpcReservedErrorRangeStart */ - export const serverErrorStart: integer = jsonrpcReservedErrorRangeStart; - - /** - * Error code indicating that a server received a notification or - * request before the server has received the `initialize` request. - */ - export const ServerNotInitialized: integer = -32002; - export const UnknownErrorCode: integer = -32001; - - /** - * This is the end range of JSON-RPC reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - export const jsonrpcReservedErrorRangeEnd = -32000; - /** @deprecated use jsonrpcReservedErrorRangeEnd */ - export const serverErrorEnd: integer = jsonrpcReservedErrorRangeEnd; - - /** - * This is the start range of LSP reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - 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; - - /** - * This is the end range of LSP reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - export const lspReservedErrorRangeEnd: integer = -32800; -} -``` -#### Notification Message - -A notification message. A processed notification message must not send a response back. They work like events. - -```typescript -interface NotificationMessage extends Message { - /** - * The method to be invoked. - */ - method: string; - - /** - * The notification's params. - */ - params?: array | object; -} -``` - -#### $ Notifications and Requests - -Notification and requests whose methods start with '\$/' are messages which are protocol implementation dependent and might not be implementable in all clients or servers. For example if the server implementation uses a single threaded synchronous programming language then there is little a server can do to react to a `$/cancelRequest` notification. If a server or client receives notifications starting with '\$/' it is free to ignore the notification. If a server or client receives a request starting with '\$/' it must error the request with error code `MethodNotFound` (e.g. `-32601`). - -#### Cancellation Support (:arrow_right: :arrow_left:) - -The base protocol offers support for request cancellation. To cancel a request, a notification message with the following properties is sent: - -_Notification_: -* method: '$/cancelRequest' -* params: `CancelParams` defined as follows: - -```typescript -interface CancelParams { - /** - * The request id to cancel. - */ - id: integer | string; -} -``` - -A request that got canceled still needs to return from the server and send a response back. It can not be left open / hanging. This is in line with the JSON-RPC protocol that requires that every request sends a response back. In addition it allows for returning partial results on cancel. If the request returns an error response on cancellation it is advised to set the error code to `ErrorCodes.RequestCancelled`. - -#### Progress Support (:arrow_right: :arrow_left:) - -> *Since version 3.15.0* - -The base protocol offers also support to report progress in a generic fashion. This mechanism can be used to report any kind of progress including [work done progress](#workDoneProgress) (usually used to report progress in the user interface using a progress bar) and partial result progress to support streaming of results. - -A progress notification has the following properties: - -_Notification_: -* method: '$/progress' -* params: `ProgressParams` defined as follows: - -```typescript -type ProgressToken = integer | string; -``` - -```typescript -interface ProgressParams { - /** - * The progress token provided by the client or server. - */ - token: ProgressToken; - - /** - * The progress data. - */ - value: T; -} -``` - -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 - -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. - -### Capabilities - -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. - -### 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. - -### Message Documentation - -As said LSP defines a set of requests, responses and notifications. Each of those are documented 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. - - -### Basic JSON Structures - -There are quite some JSON structures that are shared between different requests and notifications. Their structure and capabilities are documented in this section. - -{% include_relative types/uri.md %} -{% include_relative types/regexp.md %} -{% include_relative types/enumerations.md %} - -{% include_relative types/textDocuments.md %} -{% include_relative types/position.md %} -{% include_relative types/range.md %} -{% include_relative types/textDocumentItem.md %} -{% include_relative types/textDocumentIdentifier.md %} -{% include_relative types/versionedTextDocumentIdentifier.md %} -{% include_relative types/textDocumentPositionParams.md %} -{% include_relative types/documentFilter.md %} - -{% include_relative types/textEdit.md %} -{% include_relative types/textEditArray.md %} -{% include_relative types/textDocumentEdit.md %} -{% include_relative types/location.md %} -{% include_relative types/locationLink.md %} -{% include_relative types/diagnostic.md %} -{% include_relative types/command.md %} -{% include_relative types/markupContent.md %} -{% include_relative types/resourceChanges.md %} -{% include_relative types/workspaceEdit.md %} - -{% include_relative types/workDoneProgress.md %} -{% include_relative types/partialResults.md %} -{% include_relative types/partialResultParams.md %} -{% include_relative types/traceValue.md %} - -### Server lifecycle - -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. - -{% include_relative general/initialize.md %} -{% include_relative general/initialized.md %} -{% include_relative client/registerCapability.md %} -{% include_relative client/unregisterCapability.md %} -{% include_relative general/setTrace.md %} -{% include_relative general/logTrace.md %} -{% include_relative general/shutdown.md %} -{% include_relative general/exit.md %} - -### Text Document Synchronization - -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). - -_Client Capability_: -* property path (optional): `textDocument.synchronization.dynamicRegistration` -* property type: `boolean` - -Controls whether text document synchronization supports dynamic registration. - -_Server Capability_: -* 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): - -
- -```typescript -/** - * Defines how the host (editor) should sync document changes to the language - * server. - */ -export namespace TextDocumentSyncKind { - /** - * Documents should not be synced at all. - */ - export const None = 0; - - /** - * Documents are synced by always sending the full content - * of the document. - */ - export const Full = 1; - - /** - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * sent. - */ - export const Incremental = 2; -} - -export type TextDocumentSyncKind = 0 | 1 | 2; -``` - -
- -```typescript -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. If omitted open - * close notifications should not be sent. - */ - openClose?: boolean; - - /** - * Change notifications are sent to the server. See - * TextDocumentSyncKind.None, TextDocumentSyncKind.Full and - * TextDocumentSyncKind.Incremental. If omitted it defaults to - * TextDocumentSyncKind.None. - */ - change?: TextDocumentSyncKind; -} -``` - -{% include_relative textDocument/didOpen.md %} -{% include_relative textDocument/didChange.md %} -{% include_relative textDocument/willSave.md %} -{% include_relative textDocument/willSaveWaitUntil.md %} -{% include_relative textDocument/didSave.md %} -{% include_relative textDocument/didClose.md %} -{% include_relative textDocument/didRename.md %} - -The final structure of the `TextDocumentSyncClientCapabilities` and the `TextDocumentSyncOptions` server options look like this - -
- -```typescript -export interface TextDocumentSyncClientCapabilities { - /** - * Whether text document synchronization supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports sending will save notifications. - */ - willSave?: boolean; - - /** - * The client supports sending a will save request and - * waits for a response providing text edits which will - * be applied to the document before it is saved. - */ - willSaveWaitUntil?: boolean; - - /** - * The client supports did save notifications. - */ - didSave?: boolean; -} -``` - -
- -```typescript -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. If omitted open - * close notification should not be sent. - */ - openClose?: boolean; - /** - * Change notifications are sent to the server. See - * TextDocumentSyncKind.None, TextDocumentSyncKind.Full and - * TextDocumentSyncKind.Incremental. If omitted it defaults to - * TextDocumentSyncKind.None. - */ - change?: TextDocumentSyncKind; - /** - * If present will save notifications are sent to the server. If omitted - * the notification should not be sent. - */ - willSave?: boolean; - /** - * If present will save wait until requests are sent to the server. If - * omitted the request should not be sent. - */ - willSaveWaitUntil?: boolean; - /** - * If present save notifications are sent to the server. If omitted the - * notification should not be sent. - */ - save?: boolean | SaveOptions; -} -``` - -{% include_relative notebookDocument/notebook.md %} - -### Language Features - -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. - -{% include_relative language/declaration.md %} -{% include_relative language/definition.md %} -{% include_relative language/typeDefinition.md %} -{% include_relative language/implementation.md %} -{% include_relative language/references.md %} -{% include_relative language/callHierarchy.md %} -{% include_relative language/typeHierarchy.md %} -{% include_relative language/documentHighlight.md %} -{% include_relative language/documentLink.md %} -{% include_relative language/hover.md %} -{% include_relative language/codeLens.md %} -{% include_relative language/foldingRange.md %} -{% include_relative language/selectionRange.md %} -{% include_relative language/documentSymbol.md %} -{% include_relative language/semanticTokens.md %} -{% include_relative language/inlayHint.md %} -{% include_relative language/inlineValue.md %} -{% include_relative language/moniker.md %} -{% include_relative language/completion.md %} -{% include_relative language/publishDiagnostics.md %} -{% include_relative language/pullDiagnostics.md %} -{% include_relative language/signatureHelp.md %} -{% include_relative language/codeAction.md %} -{% include_relative language/documentColor.md %} -{% include_relative language/colorPresentation.md %} -{% include_relative language/formatting.md %} -{% include_relative language/rangeFormatting.md %} -{% include_relative language/onTypeFormatting.md %} -{% include_relative language/rename.md %} -{% include_relative language/linkedEditingRange.md %} - -### Workspace Features - -{% include_relative workspace/symbol.md %} -{% include_relative workspace/configuration.md %} -{% include_relative workspace/didChangeConfiguration.md %} -{% include_relative workspace/workspaceFolders.md %} -{% include_relative workspace/didChangeWorkspaceFolders.md %} -{% include_relative workspace/willCreateFiles.md %} -{% include_relative workspace/didCreateFiles.md %} -{% include_relative workspace/willRenameFiles.md %} -{% include_relative workspace/didRenameFiles.md %} -{% include_relative workspace/willDeleteFiles.md %} -{% include_relative workspace/didDeleteFiles.md %} -{% include_relative workspace/didChangeWatchedFiles.md %} -{% include_relative workspace/executeCommand.md %} -{% include_relative workspace/applyEdit.md %} - -### Window Features - -{% include_relative window/showMessage.md %} -{% include_relative window/showMessageRequest.md %} -{% include_relative window/showDocument.md %} -{% include_relative window/logMessage.md %} -{% include_relative window/workDoneProgressCreate.md %} -{% include_relative window/workDoneProgressCancel.md %} -{% include_relative telemetry/event.md %} - -#### Miscellaneous - -#### Implementation Considerations - -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: - -- if a client sends a request to the server and the client state changes in a way that it invalidates the response it should do the following: - - cancel the server request and ignore the result if the result is not useful for the client anymore. If necessary the client should resend the request. - - 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 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: - -- **stdio**: uses stdio as the communication channel. -- **pipe**: use pipes (Windows) or socket files (Linux, Mac) as the communication channel. The pipe / socket file name is passed as the next arg or with `--pipe=`. -- **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`. - -#### Meta Model - -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. - -### Change Log - -#### 3.17.0 (05/10/2022) - -* 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. - -#### 3.16.0 (12/14/2020) - -* Add support for tracing. -* Add semantic token support. -* Add call hierarchy support. -* Add client capability for resolving text edits on completion items. -* Add support for client default behavior on renames. -* Add support for insert and replace ranges on `CompletionItem`. -* Add support for diagnostic code descriptions. -* Add support for document symbol provider label. -* Add support for tags on `SymbolInformation` and `DocumentSymbol`. -* Add support for moniker request method. -* Add support for code action `data` property. -* Add support for code action `disabled` property. -* Add support for code action resolve request. -* Add support for diagnostic `data` property. -* Add support for signature information `activeParameter` property. -* Add support for `workspace/didCreateFiles` notifications and `workspace/willCreateFiles` requests. -* Add support for `workspace/didRenameFiles` notifications and `workspace/willRenameFiles` requests. -* Add support for `workspace/didDeleteFiles` notifications and `workspace/willDeleteFiles` requests. -* Add client capability to signal whether the client normalizes line endings. -* Add support to preserve additional attributes on `MessageActionItem`. -* Add support to provide the clients locale in the initialize call. -* Add support for opening and showing a document in the client user interface. -* Add support for linked editing. -* Add support for change annotations in text edits as well as in create file, rename file and delete file operations. - -#### 3.15.0 (01/14/2020) - -* Add generic progress reporting support. -* Add specific work done progress reporting support to requests where applicable. -* Add specific partial result progress support to requests where applicable. -* Add support for `textDocument/selectionRange`. -* Add support for server and client information. -* Add signature help context. -* Add Erlang and Elixir to the list of supported programming languages -* Add `version` on `PublishDiagnosticsParams` -* Add `CodeAction#isPreferred` support. -* Add `CompletionItem#tag` support. -* Add `Diagnostic#tag` support. -* Add `DocumentLink#tooltip` support. -* Add `trimTrailingWhitespace`, `insertFinalNewline` and `trimFinalNewlines` to `FormattingOptions`. -* Clarified `WorkspaceSymbolParams#query` parameter. - - -#### 3.14.0 (12/13/2018) - -* Add support for signature label offsets. -* Add support for location links. -* Add support for `textDocument/declaration` request. - -#### 3.13.0 (9/11/2018) - -* Add support for file and folder operations (create, rename, move) to workspace edits. - -#### 3.12.0 (8/23/2018) - -* Add support for `textDocument/prepareRename` request. - -#### 3.11.0 (8/21/2018) - -* Add support for CodeActionOptions to allow a server to provide a list of code action it supports. - -#### 3.10.0 (7/23/2018) - -* Add support for hierarchical document symbols as a valid response to a `textDocument/documentSymbol` request. -* Add support for folding ranges as a valid response to a `textDocument/foldingRange` request. - -#### 3.9.0 (7/10/2018) - -* Add support for `preselect` property in `CompletionItem` - -#### 3.8.0 (6/11/2018) - -* Added support for CodeAction literals to the `textDocument/codeAction` request. -* ColorServerCapabilities.colorProvider can also be a boolean -* Corrected ColorPresentationParams.colorInfo to color (as in the `d.ts` and in implementations) - -#### 3.7.0 (4/5/2018) - -* Added support for related information to Diagnostics. - -#### 3.6.0 (2/22/2018) - -Merge the proposed protocol for workspace folders, configuration, go to type definition, go to implementation and document color provider into the main branch of the specification. For details see: - -* [Get Workspace Folders](https://microsoft.github.io/language-server-protocol/specification#workspace_workspaceFolders) -* [DidChangeWorkspaceFolders Notification](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeWorkspaceFolders) -* [Get Configuration](https://microsoft.github.io/language-server-protocol/specification#workspace_configuration) -* [Go to Type Definition](https://microsoft.github.io/language-server-protocol/specification#textDocument_typeDefinition) -* [Go to Implementation](https://microsoft.github.io/language-server-protocol/specification#textDocument_implementation) -* [Document Color](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor) -* [Color Presentation](https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation) - -In addition we enhanced the `CompletionTriggerKind` with a new value `TriggerForIncompleteCompletions: 3 = 3` to signal the a completion request got trigger since the last result was incomplete. - -#### 3.5.0 - -Decided to skip this version to bring the protocol version number in sync the with npm module vscode-languageserver-protocol. - -#### 3.4.0 (11/27/2017) - -* [extensible completion item and symbol kinds](https://github.com/Microsoft/language-server-protocol/issues/129) - -#### 3.3.0 (11/24/2017) - -* Added support for `CompletionContext` -* Added support for `MarkupContent` -* Removed old New and Updated markers. - -#### 3.2.0 (09/26/2017) - -* Added optional `commitCharacters` property to the `CompletionItem` - -#### 3.1.0 (02/28/2017) - -* Make the `WorkspaceEdit` changes backwards compatible. -* Updated the specification to correctly describe the breaking changes from 2.x to 3.x around `WorkspaceEdit`and `TextDocumentEdit`. - -#### 3.0 Version - -- add support for client feature flags to support that servers can adapt to different client capabilities. An example is the new `textDocument/willSaveWaitUntil` request which not all clients might be able to support. If the feature is disabled in the client capabilities sent on the initialize request, the server can't rely on receiving the request. -- add support to experiment with new features. The new `ClientCapabilities.experimental` section together with feature flags allow servers to provide experimental feature without the need of ALL clients to adopt them immediately. -- servers can more dynamically react to client features. Capabilities can now be registered and unregistered after the initialize request using the new `client/registerCapability` and `client/unregisterCapability`. This for example allows servers to react to settings or configuration changes without a restart. -- add support for `textDocument/willSave` notification and `textDocument/willSaveWaitUntil` request. -- add support for `textDocument/documentLink` request. -- add a `rootUri` property to the initializeParams in favor of the `rootPath` property. diff --git a/language-server-protocol/_specifications/lsp/3.17/telemetry/event.md b/language-server-protocol/_specifications/lsp/3.17/telemetry/event.md deleted file mode 100644 index e7eed029a..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/telemetry/event.md +++ /dev/null @@ -1,7 +0,0 @@ -#### Telemetry Notification (:arrow_left:) - -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'; diff --git a/language-server-protocol/_specifications/lsp/3.17/textDocument/didChange.md b/language-server-protocol/_specifications/lsp/3.17/textDocument/didChange.md deleted file mode 100644 index f72023881..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/textDocument/didChange.md +++ /dev/null @@ -1,93 +0,0 @@ -#### DidChangeTextDocument Notification (:arrow_right:) - -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. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentChangeRegistrationOptions` defined as follows: - -
- -```typescript -/** - * Describe options to be used when registering for text document change events. - */ -export interface TextDocumentChangeRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * How documents are synced to the server. See TextDocumentSyncKind.Full - * and TextDocumentSyncKind.Incremental. - */ - syncKind: TextDocumentSyncKind; -} -``` - -_Notification_: -* method: `textDocument/didChange` -* params: `DidChangeTextDocumentParams` defined as follows: - -
- -```typescript -interface DidChangeTextDocumentParams { - /** - * The document that did change. The version number points - * to the version after all provided content changes have - * been applied. - */ - textDocument: VersionedTextDocumentIdentifier; - - /** - * The actual content changes. The content changes describe single state - * changes to the document. So if there are two content changes c1 (at - * array index 0) and c2 (at array index 1) for a document in state S then - * c1 moves the document from S to S' and c2 from S' to S''. So c1 is - * computed on the state S and c2 is computed on the state S'. - * - * To mirror the content of a document using change events use the following - * approach: - * - start with the same initial content - * - apply the 'textDocument/didChange' notifications in the order you - * receive them. - * - apply the `TextDocumentContentChangeEvent`s in a single notification - * in the order you receive them. - */ - contentChanges: TextDocumentContentChangeEvent[]; -} -``` - -
- -```typescript -/** - * 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 = { - /** - * The range of the document that changed. - */ - range: Range; - - /** - * The optional length of the range that got replaced. - * - * @deprecated use range instead. - */ - rangeLength?: uinteger; - - /** - * The new text for the provided range. - */ - text: string; -} | { - /** - * The new text of the whole document. - */ - text: string; -}; -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/textDocument/didClose.md b/language-server-protocol/_specifications/lsp/3.17/textDocument/didClose.md deleted file mode 100644 index 48e4032cc..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/textDocument/didClose.md +++ /dev/null @@ -1,26 +0,0 @@ -#### DidCloseTextDocument Notification (:arrow_right:) - -The document close notification is sent from the client to the server when the document got closed in the client. The document's master now exists where the document's Uri points to (e.g. if the document's Uri is a file Uri the master now exists on disk). As with the open notification the close notification is about managing the document's content. Receiving a close notification doesn't mean that the document was open in an editor before. A close notification requires a previous open notification to be sent. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: `textDocument/didClose` -* params: `DidCloseTextDocumentParams` defined as follows: - -
- -```typescript -interface DidCloseTextDocumentParams { - /** - * The document that was closed. - */ - textDocument: TextDocumentIdentifier; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/textDocument/didOpen.md b/language-server-protocol/_specifications/lsp/3.17/textDocument/didOpen.md deleted file mode 100644 index 9704bcfb9..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/textDocument/didOpen.md +++ /dev/null @@ -1,28 +0,0 @@ -#### DidOpenTextDocument Notification (:arrow_right:) - -The document open notification is sent from the client to the server to signal newly opened text documents. The document's content is now managed by the client and the server must not try to read the document's content using the document's Uri. Open in this sense means it is managed by the client. It doesn't necessarily mean that its content is presented in an editor. An open notification must not be sent more than once without a corresponding close notification send before. This means open and close notification must be balanced and the max open count for a particular textDocument is one. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -The `DidOpenTextDocumentParams` contain the language id the document is associated with. If the language id of a document changes, the client needs to send a `textDocument/didClose` to the server followed by a `textDocument/didOpen` with the new language id if the server handles the new language id as well. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: [`TextDocumentRegistrationOptions`](#textDocumentRegistrationOptions) - -_Notification_: -* method: 'textDocument/didOpen' -* params: `DidOpenTextDocumentParams` defined as follows: - -
- -```typescript -interface DidOpenTextDocumentParams { - /** - * The document that was opened. - */ - textDocument: TextDocumentItem; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/textDocument/didRename.md b/language-server-protocol/_specifications/lsp/3.17/textDocument/didRename.md deleted file mode 100644 index e7f415357..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/textDocument/didRename.md +++ /dev/null @@ -1,5 +0,0 @@ -#### Renaming a document - -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. diff --git a/language-server-protocol/_specifications/lsp/3.17/textDocument/didSave.md b/language-server-protocol/_specifications/lsp/3.17/textDocument/didSave.md deleted file mode 100644 index 8e4f308be..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/textDocument/didSave.md +++ /dev/null @@ -1,61 +0,0 @@ -#### DidSaveTextDocument Notification (:arrow_right:) - -The document save notification is sent from the client to the server when the document was saved in the client. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.didSave` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/didSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.save` -* property type: `boolean | SaveOptions` where `SaveOptions` is defined as follows: - -
- -```typescript -export interface SaveOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -The capability indicates that the server is interested in `textDocument/didSave` notifications. - -_Registration Options_: `TextDocumentSaveRegistrationOptions` defined as follows: - -
- -```typescript -export interface TextDocumentSaveRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -_Notification_: -* method: `textDocument/didSave` -* params: `DidSaveTextDocumentParams` defined as follows: - -
- -```typescript -interface DidSaveTextDocumentParams { - /** - * The document that was saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * Optional the content when saved. Depends on the includeText value - * when the save notification was requested. - */ - text?: string; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/textDocument/willSave.md b/language-server-protocol/_specifications/lsp/3.17/textDocument/willSave.md deleted file mode 100644 index cb61d54db..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/textDocument/willSave.md +++ /dev/null @@ -1,68 +0,0 @@ -#### WillSaveTextDocument Notification (:arrow_right:) - -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` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSave` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSave` notifications. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: 'textDocument/willSave' -* params: `WillSaveTextDocumentParams` defined as follows: - -
- -```typescript -/** - * The parameters send in a will save text document notification. - */ -export interface WillSaveTextDocumentParams { - /** - * The document that will be saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * The 'TextDocumentSaveReason'. - */ - reason: TextDocumentSaveReason; -} -``` - -
- -```typescript -/** - * Represents reasons why a text document is saved. - */ -export namespace TextDocumentSaveReason { - - /** - * Manually triggered, e.g. by the user pressing save, by starting - * debugging, or by an API call. - */ - export const Manual = 1; - - /** - * Automatic after a delay. - */ - export const AfterDelay = 2; - - /** - * When the editor lost focus. - */ - export const FocusOut = 3; -} - -export type TextDocumentSaveReason = 1 | 2 | 3; -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/textDocument/willSaveWaitUntil.md b/language-server-protocol/_specifications/lsp/3.17/textDocument/willSaveWaitUntil.md deleted file mode 100644 index ba2d3f41a..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/textDocument/willSaveWaitUntil.md +++ /dev/null @@ -1,25 +0,0 @@ -#### WillSaveWaitUntilTextDocument Request (:leftwards_arrow_with_hook:) - -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` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSaveWaitUntil` requests. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSaveWaitUntil` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSaveWaitUntil` requests. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Request_: -* method: `textDocument/willSaveWaitUntil` -* params: `WillSaveTextDocumentParams` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` -* error: code and message set in case an exception happens during the `textDocument/willSaveWaitUntil` request. diff --git a/language-server-protocol/_specifications/lsp/3.17/types/command.md b/language-server-protocol/_specifications/lsp/3.17/types/command.md deleted file mode 100644 index 0d30506a2..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/command.md +++ /dev/null @@ -1,21 +0,0 @@ -#### Command - -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[]; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/diagnostic.md b/language-server-protocol/_specifications/lsp/3.17/types/diagnostic.md deleted file mode 100644 index 6c40d0958..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/diagnostic.md +++ /dev/null @@ -1,158 +0,0 @@ -#### Diagnostic - -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; -``` - -
- -```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: - -
- -```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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/documentFilter.md b/language-server-protocol/_specifications/lsp/3.17/types/documentFilter.md deleted file mode 100644 index 056d71df8..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/documentFilter.md +++ /dev/null @@ -1,48 +0,0 @@ -#### DocumentFilter - -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`: -```typescript -{ language: 'typescript', scheme: 'file' } -{ language: 'json', pattern: '**/package.json' } -``` - -```typescript -export interface DocumentFilter { - /** - * A language id, like `typescript`. - */ - language?: string; - - /** - * A Uri [scheme](#Uri.scheme), like `file` or `untitled`. - */ - scheme?: string; - - /** - * A glob pattern, like `*.{ts,js}`. - * - * 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`) - */ - pattern?: string; -} -``` - -Please note that for a document filter to be valid at least one of the properties for `language`, `scheme`, or `pattern` must be set. To keep the type definition simple all properties are marked as optional. - -A document selector is the combination of one or more document filters. - -
- -```typescript -export type DocumentSelector = DocumentFilter[]; -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/enumerations.md b/language-server-protocol/_specifications/lsp/3.17/types/enumerations.md deleted file mode 100644 index 1738506db..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/enumerations.md +++ /dev/null @@ -1,5 +0,0 @@ -#### Enumerations - -The protocol supports two kind of enumerations: (a) integer based enumerations and (b) strings based enumerations. Integer based enumerations usually start with `1`. The ones 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 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. diff --git a/language-server-protocol/_specifications/lsp/3.17/types/location.md b/language-server-protocol/_specifications/lsp/3.17/types/location.md deleted file mode 100644 index 1aab270fe..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/location.md +++ /dev/null @@ -1,9 +0,0 @@ -#### Location - -Represents a location inside a resource, such as a line inside a text file. -```typescript -interface Location { - uri: DocumentUri; - range: Range; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/locationLink.md b/language-server-protocol/_specifications/lsp/3.17/types/locationLink.md deleted file mode 100644 index e93ecbb25..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/locationLink.md +++ /dev/null @@ -1,36 +0,0 @@ -#### LocationLink - -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 - * `targetRange`. See also `DocumentSymbol#range` - */ - targetSelectionRange: Range; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/markupContent.md b/language-server-protocol/_specifications/lsp/3.17/types/markupContent.md deleted file mode 100644 index 4e7b95e78..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/markupContent.md +++ /dev/null @@ -1,106 +0,0 @@ -#### MarkupContent - - 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/). - -```typescript -/** - * Describes the content type that a client supports in various - * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. - * - * Please note that `MarkupKinds` must not start with a `$`. This kinds - * are reserved for internal usage. - */ -export namespace MarkupKind { - /** - * Plain text is supported as a content format - */ - export const PlainText: 'plaintext' = 'plaintext'; - - /** - * Markdown is supported as a content format - */ - export const Markdown: 'markdown' = 'markdown'; -} -export type MarkupKind = 'plaintext' | 'markdown'; -``` - -
- -```typescript -/** - * A `MarkupContent` literal represents a string value which content is - * interpreted base on its kind flag. Currently the protocol supports - * `plaintext` and `markdown` as markup kinds. - * - * If the kind is `markdown` then the value can contain fenced code blocks like - * in GitHub issues. - * - * Here is an example how such a string can be constructed using - * JavaScript / TypeScript: - * ```typescript - * let markdown: MarkdownContent = { - * kind: MarkupKind.Markdown, - * value: [ - * '# Header', - * 'Some text', - * '```typescript', - * 'someCode();', - * '```' - * ].join('\n') - * }; - * ``` - * - * *Please Note* that clients might sanitize the return markdown. A client could - * decide to remove HTML from the markdown to avoid script execution. - */ -export interface MarkupContent { - /** - * The type of the Markup - */ - kind: MarkupKind; - - /** - * The content itself - */ - value: string; -} -``` - -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 -/** - * Client capabilities specific to the used markdown parser. - * - * @since 3.16.0 - */ -export interface MarkdownClientCapabilities { - /** - * The name of the parser. - */ - parser: string; - - /** - * 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/) -Python-Markdown | 3.2.2 | [Python-Markdown Documentation](https://python-markdown.github.io) - diff --git a/language-server-protocol/_specifications/lsp/3.17/types/partialResultParams.md b/language-server-protocol/_specifications/lsp/3.17/types/partialResultParams.md deleted file mode 100644 index 98dfc0474..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/partialResultParams.md +++ /dev/null @@ -1,13 +0,0 @@ -#### PartialResultParams - -A parameter literal used to pass a partial result token. - -```typescript -export interface PartialResultParams { - /** - * An optional token that a server can use to report partial results (e.g. - * streaming) to the client. - */ - partialResultToken?: ProgressToken; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/partialResults.md b/language-server-protocol/_specifications/lsp/3.17/types/partialResults.md deleted file mode 100644 index f8f0545a2..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/partialResults.md +++ /dev/null @@ -1,33 +0,0 @@ -#### Partial Result Progress - -> *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[]` \| `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 -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae", - // The token used to report partial result progress. - "partialResultToken": "5f6f349e-4f81-4a3b-afff-ee04bff96804" -} -``` - -The `partialResultToken` is then used to report partial results for the find references request. - -If a server reports partial result via a corresponding `$/progress`, the whole result must be reported using n `$/progress` notifications. The final response has to be empty in terms of result values. This avoids confusion about how the final result should be interpreted, e.g. as another partial result or as a replacing result. - -If the response errors the provided partial results should be treated as follows: - -- 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. diff --git a/language-server-protocol/_specifications/lsp/3.17/types/position.md b/language-server-protocol/_specifications/lsp/3.17/types/position.md deleted file mode 100644 index af608c0dd..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/position.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Position - -Position in a text document expressed as zero-based line and zero-based character offset. A position is between two characters like an 'insert' cursor in an editor. Special values like for example `-1` to denote the end of a line are not supported. - -```typescript -interface Position { - /** - * Line position in a document (zero-based). - */ - line: uinteger; - - /** - * 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. - */ - 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. - -
- - -```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 (e.g bytes). - */ - 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'; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/types/range.md b/language-server-protocol/_specifications/lsp/3.17/types/range.md deleted file mode 100644 index ddc09471d..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/range.md +++ /dev/null @@ -1,23 +0,0 @@ -#### Range - -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: -```typescript -{ - start: { line: 5, character: 23 }, - end : { line: 6, character: 0 } -} -``` - -```typescript -interface Range { - /** - * The range's start position. - */ - start: Position; - - /** - * The range's end position. - */ - end: Position; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/types/regexp.md b/language-server-protocol/_specifications/lsp/3.17/types/regexp.md deleted file mode 100644 index 7d1403048..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/regexp.md +++ /dev/null @@ -1,47 +0,0 @@ -#### Regular Expressions - -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: - -* the client will announce which regular expression engine it will use. This will allow server that are written for a very specific client make full use of the regular expression capabilities of the client -* the specification will define a set of regular expression features that should be supported by a client. Instead of writing a new specification LSP will refer to the [ECMAScript Regular Expression specification](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) and remove features from it that are not necessary in the context of LSP or hard to implement for other clients. - -_Client Capability_: - -The following client capability is used to announce a client's regular expression engine - -* property path (optional): `general.regularExpressions` -* property type: `RegularExpressionsClientCapabilities` defined as follows: - -```typescript -/** - * Client capabilities specific to regular expressions. - */ -export interface RegularExpressionsClientCapabilities { - /** - * The engine's name. - */ - engine: string; - - /** - * The engine's version. - */ - version?: string; -} -``` - -The following table lists the well known engine values. Please note that the table should be driven by the community which integrates LSP into existing clients. It is not the goal of the spec to list all available regular expression engines. - -Engine | Version | Documentation -------- | ------- | ------------- -ECMAScript | `ES2020` | [ECMAScript 2020](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) & [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions) - -_Regular Expression Subset_: - -The following features from the [ECMAScript 2020](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) regular expression specification are NOT mandatory for a client: - -- *Assertions*: Lookahead assertion, Negative lookahead assertion, lookbehind assertion, negative lookbehind assertion. -- *Character classes*: matching control characters using caret notation (e.g. `\cX`) and matching UTF-16 code units (e.g. `\uhhhh`). -- *Group and ranges*: named capturing groups. -- *Unicode property escapes*: none of the features needs to be supported. - -The only regular expression flag that a client needs to support is 'i' to specify a case insensitive search. diff --git a/language-server-protocol/_specifications/lsp/3.17/types/resourceChanges.md b/language-server-protocol/_specifications/lsp/3.17/types/resourceChanges.md deleted file mode 100644 index 555b72745..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/resourceChanges.md +++ /dev/null @@ -1,160 +0,0 @@ -### File Resource changes - -> 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; -} -``` - -
- -```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; -} -``` - -
- -```typescript -/** - * Rename file options - */ -export interface RenameFileOptions { - /** - * Overwrite target if existing. Overwrite wins over `ignoreIfExists` - */ - overwrite?: boolean; - - /** - * Ignores if target exists. - */ - ignoreIfExists?: boolean; -} -``` - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentEdit.md b/language-server-protocol/_specifications/lsp/3.17/types/textDocumentEdit.md deleted file mode 100644 index 51a89c7f2..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentEdit.md +++ /dev/null @@ -1,22 +0,0 @@ -#### TextDocumentEdit - -> 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)[]; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentIdentifier.md b/language-server-protocol/_specifications/lsp/3.17/types/textDocumentIdentifier.md deleted file mode 100644 index 728bbbac7..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentIdentifier.md +++ /dev/null @@ -1,11 +0,0 @@ -#### TextDocumentIdentifier - -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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentItem.md b/language-server-protocol/_specifications/lsp/3.17/types/textDocumentItem.md deleted file mode 100644 index 08f222799..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentItem.md +++ /dev/null @@ -1,90 +0,0 @@ -#### TextDocumentItem - -An item to transfer a text document from the client to the server. - -```typescript -interface TextDocumentItem { - /** - * The text document's URI. - */ - uri: DocumentUri; - - /** - * The text document's language identifier. - */ - languageId: string; - - /** - * The version number of this document (it will increase after each - * change, including undo/redo). - */ - version: integer; - - /** - * The content of the opened text document. - */ - text: string; -} -``` - -Text documents have a language identifier to identify a document on the server side when it handles more than one language to avoid re-interpreting the file extension. If a document refers to one of the programming languages listed below it is recommended that clients use those ids. - -Language | Identifier --------- | ---------- -ABAP | `abap` -Windows Bat | `bat` -BibTeX | `bibtex` -Clojure | `clojure` -Coffeescript | `coffeescript` -C | `c` -C++ | `cpp` -C# | `csharp` -CSS | `css` -Diff | `diff` -Dart | `dart` -Dockerfile | `dockerfile` -Elixir | `elixir` -Erlang | `erlang` -F# | `fsharp` -Git | `git-commit` and `git-rebase` -Go | `go` -Groovy | `groovy` -Handlebars | `handlebars` -HTML | `html` -Ini | `ini` -Java | `java` -JavaScript | `javascript` -JavaScript React | `javascriptreact` -JSON | `json` -LaTeX | `latex` -Less | `less` -Lua | `lua` -Makefile | `makefile` -Markdown | `markdown` -Objective-C | `objective-c` -Objective-C++ | `objective-cpp` -Perl | `perl` -Perl 6 | `perl6` -PHP | `php` -Powershell | `powershell` -Pug | `jade` -Python | `python` -R | `r` -Razor (cshtml) | `razor` -Ruby | `ruby` -Rust | `rust` -SCSS | `scss` (syntax using curly brackets), `sass` (indented syntax) -Scala | `scala` -ShaderLab | `shaderlab` -Shell Script (Bash) | `shellscript` -SQL | `sql` -Swift | `swift` -TypeScript | `typescript` -TypeScript React| `typescriptreact` -TeX | `tex` -Visual Basic | `vb` -XML | `xml` -XSL | `xsl` -YAML | `yaml` -{: .table .table-bordered .table-responsive} - diff --git a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentPositionParams.md b/language-server-protocol/_specifications/lsp/3.17/types/textDocumentPositionParams.md deleted file mode 100644 index ad2c0be69..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/textDocumentPositionParams.md +++ /dev/null @@ -1,19 +0,0 @@ -#### TextDocumentPositionParams - -Was `TextDocumentPosition` in 1.0 with inlined parameters. - -A parameter literal used in requests to pass a text document and a position inside that document. It is up to the client to decide how a selection is converted into a position when issuing a request for a text document. The client can for example honor or ignore the selection direction to make LSP request consistent with features implemented internally. - -```typescript -interface TextDocumentPositionParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The position inside the text document. - */ - position: Position; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/textDocuments.md b/language-server-protocol/_specifications/lsp/3.17/types/textDocuments.md deleted file mode 100644 index b9fa54f97..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/textDocuments.md +++ /dev/null @@ -1,13 +0,0 @@ -#### Text Documents - -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. - -> 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']; -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/types/textEdit.md b/language-server-protocol/_specifications/lsp/3.17/types/textEdit.md deleted file mode 100644 index 1b3a26013..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/textEdit.md +++ /dev/null @@ -1,81 +0,0 @@ -#### TextEdit & AnnotatedTextEdit - -> 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 identifiers 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; -``` - -
- -```typescript -/** - * A special text edit with an additional change annotation. - * - * @since 3.16.0. - */ -export interface AnnotatedTextEdit extends TextEdit { - /** - * The actual annotation identifier. - */ - annotationId: ChangeAnnotationIdentifier; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/textEditArray.md b/language-server-protocol/_specifications/lsp/3.17/types/textEditArray.md deleted file mode 100644 index e1004be3f..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/textEditArray.md +++ /dev/null @@ -1,5 +0,0 @@ -#### TextEdit[] - -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 they 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. diff --git a/language-server-protocol/_specifications/lsp/3.17/types/traceValue.md b/language-server-protocol/_specifications/lsp/3.17/types/traceValue.md deleted file mode 100644 index ac7e6669d..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/traceValue.md +++ /dev/null @@ -1,8 +0,0 @@ -#### TraceValue - -A `TraceValue` represents the level of verbosity with which the server systematically reports its execution trace using [$/logTrace](#logTrace) notifications. -The initial trace value is set by the client at initialization and can be modified later using the [$/setTrace](#setTrace) notification. - -```typescript -export type TraceValue = 'off' | 'messages' | 'verbose'; -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/uri.md b/language-server-protocol/_specifications/lsp/3.17/types/uri.md deleted file mode 100644 index 1ffd89829..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/uri.md +++ /dev/null @@ -1,29 +0,0 @@ -#### URI - -URI's are transferred as strings. The URI's format is defined in [https://tools.ietf.org/html/rfc3986](https://tools.ietf.org/html/rfc3986) - -``` - foo://example.com:8042/over/there?name=ferret#nose - \_/ \______________/\_________/ \_________/ \__/ - | | | | | -scheme authority path query fragment - | _____________________|__ - / \ / \ - urn:example:animal:ferret:nose -``` - -We also maintain a node module to parse a string into `scheme`, `authority`, `path`, `query`, and `fragment` URI components. The GitHub repository is [https://github.com/Microsoft/vscode-uri](https://github.com/Microsoft/vscode-uri) the npm module is [https://www.npmjs.com/package/vscode-uri](https://www.npmjs.com/package/vscode-uri). - -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. - -
- -```typescript -type DocumentUri = string; -``` - -There is also a tagging interface for normal non document URIs. It maps to a `string` as well. - -```typescript -type URI = string; -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/versionedTextDocumentIdentifier.md b/language-server-protocol/_specifications/lsp/3.17/types/versionedTextDocumentIdentifier.md deleted file mode 100644 index 0ec853eaf..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/versionedTextDocumentIdentifier.md +++ /dev/null @@ -1,36 +0,0 @@ -#### VersionedTextDocumentIdentifier - -An identifier to denote a specific version of a text document. This information usually flows from the client to the server. - -```typescript -interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. - * - * The version number of a document will increase after each change, - * including undo/redo. The number doesn't need to be consecutive. - */ - version: integer; -} -``` - -An identifier which optionally denotes a specific version of a text document. This information usually flows from the server to the client. - -
- -```typescript -interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. If an optional versioned text document - * identifier is sent from the server to the client and the file is not - * open in the editor (the server has not received an open notification - * before) the server can send `null` to indicate that the version is - * known and the content on disk is the master (as specified with document - * content ownership). - * - * The version number of a document will increase after each change, - * including undo/redo. The number doesn't need to be consecutive. - */ - version: integer | null; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/workDoneProgress.md b/language-server-protocol/_specifications/lsp/3.17/types/workDoneProgress.md deleted file mode 100644 index d7be6317e..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/workDoneProgress.md +++ /dev/null @@ -1,205 +0,0 @@ -#### Work Done Progress - -> *Since version 3.15.0* - -Work done progress is reported using the generic [`$/progress`](#progress) notification. The value payload of a work done progress notification can be of three different forms. - -##### Work Done Progress Begin - -To start progress reporting a `$/progress` notification with the following payload must be sent: - -```typescript -export interface WorkDoneProgressBegin { - - kind: 'begin'; - - /** - * Mandatory title of the progress operation. Used to briefly inform about - * the kind of operation being performed. - * - * Examples: "Indexing" or "Linking dependencies". - */ - title: string; - - /** - * Controls if a cancel button should show to allow the user to cancel the - * long running operation. Clients that don't support cancellation are - * allowed to ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. The value range is [0, 100] - */ - percentage?: uinteger; -} -``` - -##### Work Done Progress Report - -Reporting progress is done using the following payload: - -```typescript -export interface WorkDoneProgressReport { - - kind: 'report'; - - /** - * Controls enablement state of a cancel button. This property is only valid - * if a cancel button got requested in the `WorkDoneProgressBegin` payload. - * - * Clients that don't support cancellation or don't support control the - * button's enablement state are allowed to ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. The value range is [0, 100] - */ - percentage?: uinteger; -} -``` - -##### Work Done Progress End - -Signaling the end of a progress reporting is done using the following payload: - -```typescript -export interface WorkDoneProgressEnd { - - kind: 'end'; - - /** - * Optional, a final message indicating to for example indicate the outcome - * of the operation. - */ - message?: string; -} -``` - -##### Initiating Work Done Progress - -Work Done progress can be initiated in two different ways: - -1. by the sender of a request (mostly clients) using the predefined `workDoneToken` property in the requests parameter literal. The document will refer to this kind of progress as client initiated progress. -1. by a server using the request `window/workDoneProgress/create`. The document will refer to this kind of progress as server initiated progress. - -###### Client Initiated Progress - -Consider a client sending a `textDocument/reference` request to a server and the client accepts work done progress reporting on that request. To signal this to the server the client would add a `workDoneToken` property to the reference request parameters. Something like this: - -```json -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae" -} -``` - -The corresponding type definition for the parameter property looks like this: - - -
- -```typescript -export interface WorkDoneProgressParams { - /** - * An optional token that a server can use to report work done progress. - */ - workDoneToken?: ProgressToken; -} -``` - -A server uses the `workDoneToken` to report progress for the specific `textDocument/reference`. For the above request the `$/progress` notification params look like this: - -```json -{ - "token": "1d546990-40a3-4b77-b134-46622995f6ae", - "value": { - "kind": "begin", - "title": "Finding references for A#foo", - "cancellable": false, - "message": "Processing file X.ts", - "percentage": 0 - } -} -``` - -The token received via the `workDoneToken` property in a request's param literal is only valid as long as the request has not send a response back. - -There is no specific client capability signaling whether a client will send a progress token per request. The reason for this is that this is in many clients not a static aspect and might even change for every request instance for the same request type. So the capability is signal on every request instance by the presence of a `workDoneToken` property. - -To avoid that clients set up a progress monitor user interface before sending a request but the server doesn't actually report any progress a server needs to signal general work done progress reporting support in the corresponding server capability. For the above find references example a server would signal such a support by setting the `referencesProvider` property in the server capabilities as follows: - -```json -{ - "referencesProvider": { - "workDoneProgress": true - } -} -``` - -The corresponding type definition for the server capability looks like this: - -
- -```typescript -export interface WorkDoneProgressOptions { - workDoneProgress?: boolean; -} -``` -###### Server Initiated Progress - -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: - -```typescript - /** - * Window specific client capabilities. - */ - window?: { - /** - * Whether client supports server initiated progress using the - * `window/workDoneProgress/create` request. - */ - workDoneProgress?: boolean; - }; -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/types/workspaceEdit.md b/language-server-protocol/_specifications/lsp/3.17/types/workspaceEdit.md deleted file mode 100644 index 5313e2e51..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/types/workspaceEdit.md +++ /dev/null @@ -1,174 +0,0 @@ -#### WorkspaceEdit - -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; - }; -} -``` - -##### WorkspaceEditClientCapabilities - -> 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; - }; -} -``` - -
- -```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'; -} -``` - -
- -```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'; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/window/logMessage.md b/language-server-protocol/_specifications/lsp/3.17/window/logMessage.md deleted file mode 100644 index 7625ce4ce..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/window/logMessage.md +++ /dev/null @@ -1,23 +0,0 @@ -#### LogMessage Notification (:arrow_left:) - -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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/window/showDocument.md b/language-server-protocol/_specifications/lsp/3.17/window/showDocument.md deleted file mode 100644 index 387a9d90a..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/window/showDocument.md +++ /dev/null @@ -1,88 +0,0 @@ -#### Show Document Request (:arrow_right_hook:) - -> 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 resource referenced by a URI 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 resource. - * - * @since 3.16.0 - */ -export interface ShowDocumentParams { - /** - * The 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. diff --git a/language-server-protocol/_specifications/lsp/3.17/window/showMessage.md b/language-server-protocol/_specifications/lsp/3.17/window/showMessage.md deleted file mode 100644 index cd73c0c65..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/window/showMessage.md +++ /dev/null @@ -1,48 +0,0 @@ -#### ShowMessage Notification (:arrow_left:) - -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; -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/window/showMessageRequest.md b/language-server-protocol/_specifications/lsp/3.17/window/showMessageRequest.md deleted file mode 100644 index 28650c0f9..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/window/showMessageRequest.md +++ /dev/null @@ -1,68 +0,0 @@ -#### ShowMessage Request (:arrow_right_hook:) - -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: - -
- -```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; -} -``` - -_Response_: -* result: the selected `MessageActionItem` \| `null` if none got selected. -* error: code and message set in case an exception happens during showing a message. diff --git a/language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCancel.md b/language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCancel.md deleted file mode 100644 index ce83fc8d7..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCancel.md +++ /dev/null @@ -1,17 +0,0 @@ -#### Cancel a Work Done Progress (:arrow_right:) - -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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCreate.md b/language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCreate.md deleted file mode 100644 index 88180e373..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/window/workDoneProgressCreate.md +++ /dev/null @@ -1,26 +0,0 @@ -#### Create Work Done Progress (:arrow_right_hook:) - -The `window/workDoneProgress/create` request is sent from the server to the client to ask the client to create a work done progress. - -_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`. diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/applyEdit.md b/language-server-protocol/_specifications/lsp/3.17/workspace/applyEdit.md deleted file mode 100644 index a26bdf973..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/applyEdit.md +++ /dev/null @@ -1,61 +0,0 @@ -#### Applies a WorkspaceEdit (:arrow_right_hook:) - -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: `ApplyWorkspaceEditResult` defined as follows: - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/configuration.md b/language-server-protocol/_specifications/lsp/3.17/workspace/configuration.md deleted file mode 100644 index c79d4eba0..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/configuration.md +++ /dev/null @@ -1,43 +0,0 @@ -#### Configuration Request (:arrow_right_hook:) - -> *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 - -
- -```typescript -export interface ConfigurationParams { - items: ConfigurationItem[]; -} -``` - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeConfiguration.md b/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeConfiguration.md deleted file mode 100644 index 04bf9bb2d..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeConfiguration.md +++ /dev/null @@ -1,33 +0,0 @@ -#### DidChangeConfiguration Notification (:arrow_right:) - -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: - -
- -```typescript -export interface DidChangeConfigurationClientCapabilities { - /** - * Did change configuration notification supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Notification_: -* method: 'workspace/didChangeConfiguration', -* params: `DidChangeConfigurationParams` defined as follows: - -
- -```typescript -interface DidChangeConfigurationParams { - /** - * The actual changed settings - */ - settings: LSPAny; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWatchedFiles.md b/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWatchedFiles.md deleted file mode 100644 index 19bd9ac51..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWatchedFiles.md +++ /dev/null @@ -1,210 +0,0 @@ -#### DidChangeWatchedFiles Notification (:arrow_right:) - -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; - - /** - * Whether the client has support for relative patterns - * or not. - * - * @since 3.17.0 - */ - relativePatternSupport?: 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[]; -} -``` - -
- -```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; -``` - -
- -```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; -} -``` - -
- -```typescript -/** - * The glob pattern. Either a string pattern or a relative pattern. - * - * @since 3.17.0 - */ -export type GlobPattern = Pattern | RelativePattern; -``` - -
- -```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; -} -``` - -
- -```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: - -
- -```typescript -interface DidChangeWatchedFilesParams { - /** - * The actual file events. - */ - changes: FileEvent[]; -} -``` - -Where FileEvents are described as follows: - -
- -```typescript -/** - * An event describing a file change. - */ -interface FileEvent { - /** - * The file's URI. - */ - uri: DocumentUri; - /** - * The change type. - */ - type: uinteger; -} -``` - -
- -```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; -} - -export type FileChangeType = 1 | 2 | 3; -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWorkspaceFolders.md b/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWorkspaceFolders.md deleted file mode 100644 index eaf586bf6..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/didChangeWorkspaceFolders.md +++ /dev/null @@ -1,45 +0,0 @@ -#### DidChangeWorkspaceFolders Notification (:arrow_right:) - -> *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: - -
- -```typescript -export interface DidChangeWorkspaceFoldersParams { - /** - * The actual workspace folder change event. - */ - event: WorkspaceFoldersChangeEvent; -} -``` - -
- -```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[]; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/didCreateFiles.md b/language-server-protocol/_specifications/lsp/3.17/workspace/didCreateFiles.md deleted file mode 100644 index 04837a97d..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/didCreateFiles.md +++ /dev/null @@ -1,19 +0,0 @@ -#### DidCreateFiles Notification (:arrow_right:) - -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` diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/didDeleteFiles.md b/language-server-protocol/_specifications/lsp/3.17/workspace/didDeleteFiles.md deleted file mode 100644 index b2bcde517..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/didDeleteFiles.md +++ /dev/null @@ -1,19 +0,0 @@ -#### DidDeleteFiles Notification (:arrow_right:) - -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` diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/didRenameFiles.md b/language-server-protocol/_specifications/lsp/3.17/workspace/didRenameFiles.md deleted file mode 100644 index 67cf77533..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/didRenameFiles.md +++ /dev/null @@ -1,19 +0,0 @@ -#### DidRenameFiles Notification (:arrow_right:) - -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` diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/executeCommand.md b/language-server-protocol/_specifications/lsp/3.17/workspace/executeCommand.md deleted file mode 100644 index 6ca8a8c27..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/executeCommand.md +++ /dev/null @@ -1,72 +0,0 @@ -#### Execute a command (:leftwards_arrow_with_hook:) - -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?: 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. diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/symbol.md b/language-server-protocol/_specifications/lsp/3.17/workspace/symbol.md deleted file mode 100644 index ecd09bbca..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/symbol.md +++ /dev/null @@ -1,176 +0,0 @@ -#### Workspace Symbols Request (:leftwards_arrow_with_hook:) - -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 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` 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: - -
- -```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: - -
- -```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[]` \| `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: - -
- -```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 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; - - /** - * 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 }; - - /** - * A data entry field that is preserved on a workspace symbol between a - * workspace symbol request and a workspace symbol resolve request. - */ - data?: LSPAny; -} -``` -* partial result: `SymbolInformation[]` \| `WorkspaceSymbol[]` as defined above. -* error: code and message set in case an exception happens during the workspace symbol request. - -#### Workspace Symbol Resolve Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/willCreateFiles.md b/language-server-protocol/_specifications/lsp/3.17/workspace/willCreateFiles.md deleted file mode 100644 index 0c6e7af73..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/willCreateFiles.md +++ /dev/null @@ -1,179 +0,0 @@ -#### WillCreateFiles Request (:leftwards_arrow_with_hook:) - -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. Hence the `WorkspaceEdit` can not manipulate the content of the files to be 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[]; -} -``` - -
- -```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'; -``` - -
- -```typescript -/** - * Matching options for the file operation pattern. - * - * @since 3.16.0 - */ -export interface FileOperationPatternOptions { - - /** - * The pattern should be matched ignoring casing. - */ - ignoreCase?: boolean; -} -``` - -
- -```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; -} -``` - -
- -```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: - -
- -```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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/willDeleteFiles.md b/language-server-protocol/_specifications/lsp/3.17/workspace/willDeleteFiles.md deleted file mode 100644 index 030206a58..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/willDeleteFiles.md +++ /dev/null @@ -1,60 +0,0 @@ -#### WillDeleteFiles Request (:leftwards_arrow_with_hook:) - -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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/willRenameFiles.md b/language-server-protocol/_specifications/lsp/3.17/workspace/willRenameFiles.md deleted file mode 100644 index 1932678c2..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/willRenameFiles.md +++ /dev/null @@ -1,66 +0,0 @@ -#### WillRenameFiles Request (:leftwards_arrow_with_hook:) - -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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.17/workspace/workspaceFolders.md b/language-server-protocol/_specifications/lsp/3.17/workspace/workspaceFolders.md deleted file mode 100644 index 502ce5885..000000000 --- a/language-server-protocol/_specifications/lsp/3.17/workspace/workspaceFolders.md +++ /dev/null @@ -1,62 +0,0 @@ -#### Workspace folders request (:arrow_right_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/lsp/3.18/client/registerCapability.md b/language-server-protocol/_specifications/lsp/3.18/client/registerCapability.md deleted file mode 100644 index aa946169e..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/client/registerCapability.md +++ /dev/null @@ -1,107 +0,0 @@ -#### Register Capability (:arrow_right_hook:) - -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). - -Server must not register the same capability both statically through the initialize result and dynamically for the same document selector. If a server wants to support both static and dynamic registration it needs to check the client capability in the initialize request and only register the capability statically if the client doesn't support dynamic registration for that capability. - -_Request_: -* method: 'client/registerCapability' -* params: `RegistrationParams` - -Where `RegistrationParams` are defined as follows: - -
- -```typescript -/** - * General parameters to register for a capability. - */ -export interface Registration { - /** - * The id used to register the request. The id can be used to deregister - * the request again. - */ - id: string; - - /** - * The method / capability to register for. - */ - method: string; - - /** - * Options necessary for the registration. - */ - registerOptions?: LSPAny; -} -``` - -
- -```typescript -export interface RegistrationParams { - registrations: Registration[]; -} -``` - -Since most of the registration options require to specify a document selector there is a base interface that can be used. See `TextDocumentRegistrationOptions`. - -An example JSON-RPC message to register dynamically for the `textDocument/willSaveWaitUntil` feature on the client side is as follows (only details shown): - -```json -{ - "method": "client/registerCapability", - "params": { - "registrations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil", - "registerOptions": { - "documentSelector": [ - { "language": "javascript" } - ] - } - } - ] - } -} -``` - -This message is sent from the server to the client and after the client has successfully executed the request further `textDocument/willSaveWaitUntil` requests for JavaScript text documents are sent from the client to the server. - -_Response_: -* 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. - -
- -```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. - -
- -```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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/client/unregisterCapability.md b/language-server-protocol/_specifications/lsp/3.18/client/unregisterCapability.md deleted file mode 100644 index 0d56e6778..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/client/unregisterCapability.md +++ /dev/null @@ -1,59 +0,0 @@ -#### Unregister Capability (:arrow_right_hook:) - -The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability. - -_Request_: -* method: 'client/unregisterCapability' -* params: `UnregistrationParams` - -Where `UnregistrationParams` are defined as follows: - -
- -```typescript -/** - * General parameters to unregister a capability. - */ -export interface Unregistration { - /** - * The id used to unregister the request or notification. Usually an id - * provided during the register request. - */ - id: string; - - /** - * The method / capability to unregister for. - */ - method: string; -} -``` - -
- -```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 - // of the specification. - unregisterations: Unregistration[]; -} -``` - -An example JSON-RPC message to unregister the above registered `textDocument/willSaveWaitUntil` feature looks like this: - -```json -{ - "method": "client/unregisterCapability", - "params": { - "unregisterations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil" - } - ] - } -} -``` -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. diff --git a/language-server-protocol/_specifications/lsp/3.18/general/exit.md b/language-server-protocol/_specifications/lsp/3.18/general/exit.md deleted file mode 100644 index e696e4a9a..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/general/exit.md +++ /dev/null @@ -1,8 +0,0 @@ -#### Exit Notification (:arrow_right:) - -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 diff --git a/language-server-protocol/_specifications/lsp/3.18/general/initialize.md b/language-server-protocol/_specifications/lsp/3.18/general/initialize.md deleted file mode 100644 index 70f998b69..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/general/initialize.md +++ /dev/null @@ -1,931 +0,0 @@ -#### Initialize Request (:leftwards_arrow_with_hook:) - -The initialize request is sent as the first request from the client to the server. If the server receives a request or notification before the `initialize` request it should act as follows: - -* For a request the response should be an error with `code: -32002`. The message can be picked by the server. -* Notifications should be dropped, except for the exit notification. This will allow the exit of a server without an initialize request. - -Until the server has responded to the `initialize` request with an `InitializeResult`, the client must not send any additional requests or notifications to the server. In addition the server is not allowed to send any requests or notifications to the client until it has responded with an `InitializeResult`, with the exception that during the `initialize` request the server is allowed to send the notifications `window/showMessage`, `window/logMessage` and `telemetry/event` as well as the `window/showMessageRequest` request to the client. In case the client sets up a progress token in the initialize params (e.g. property `workDoneToken`) the server is also allowed to use that token (and only that token) using the `$/progress` notification sent from the server to the client. - -The `initialize` request may only be sent once. - -_Request_: -* method: 'initialize' -* params: `InitializeParams` defined as follows: - -
- -```typescript -interface InitializeParams extends WorkDoneProgressParams { - /** - * The process Id of the parent process that started the server. Is null if - * the process has not been started by another process. If the parent - * process is not alive then the server should exit (see exit notification) - * its process. - */ - processId: integer | null; - - /** - * Information about the client - * - * @since 3.15.0 - */ - clientInfo?: { - /** - * The name of the client as defined by the client. - */ - name: string; - - /** - * The client's version as defined by the client. - */ - version?: string; - }; - - /** - * The locale the client is currently showing the user interface - * in. This must not necessarily be the locale of the operating - * system. - * - * Uses IETF language tags as the value's syntax - * (See https://en.wikipedia.org/wiki/IETF_language_tag) - * - * @since 3.16.0 - */ - locale?: string; - - /** - * The rootPath of the workspace. Is null - * if no folder is open. - * - * @deprecated in favour of `rootUri`. - */ - rootPath?: string | null; - - /** - * The rootUri of the workspace. Is null if no - * folder is open. If both `rootPath` and `rootUri` are set - * `rootUri` wins. - * - * @deprecated in favour of `workspaceFolders` - */ - rootUri: DocumentUri | null; - - /** - * User provided initialization options. - */ - initializationOptions?: LSPAny; - - /** - * The capabilities provided by the client (editor or tool) - */ - capabilities: ClientCapabilities; - - /** - * The initial trace setting. If omitted trace is disabled ('off'). - */ - trace?: TraceValue; - - /** - * The workspace folders configured in the client when the server starts. - * This property is only available if the client supports workspace folders. - * It can be `null` if the client supports workspace folders but none are - * configured. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFolder[] | null; -} -``` -Where `ClientCapabilities` and `TextDocumentClientCapabilities` are defined as follows: - - -##### TextDocumentClientCapabilities - -`TextDocumentClientCapabilities` define capabilities the editor / tool provides on text documents. - -
- -```typescript -/** - * Text document specific client capabilities. - */ -export interface TextDocumentClientCapabilities { - - synchronization?: TextDocumentSyncClientCapabilities; - - /** - * Capabilities specific to the `textDocument/completion` request. - */ - completion?: CompletionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/hover` request. - */ - hover?: HoverClientCapabilities; - - /** - * Capabilities specific to the `textDocument/signatureHelp` request. - */ - signatureHelp?: SignatureHelpClientCapabilities; - - /** - * Capabilities specific to the `textDocument/declaration` request. - * - * @since 3.14.0 - */ - declaration?: DeclarationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/definition` request. - */ - definition?: DefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/typeDefinition` request. - * - * @since 3.6.0 - */ - typeDefinition?: TypeDefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/implementation` request. - * - * @since 3.6.0 - */ - implementation?: ImplementationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/references` request. - */ - references?: ReferenceClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentHighlight` request. - */ - documentHighlight?: DocumentHighlightClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentSymbol` request. - */ - documentSymbol?: DocumentSymbolClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeAction` request. - */ - codeAction?: CodeActionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeLens` request. - */ - codeLens?: CodeLensClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentLink` request. - */ - documentLink?: DocumentLinkClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentColor` and the - * `textDocument/colorPresentation` request. - * - * @since 3.6.0 - */ - colorProvider?: DocumentColorClientCapabilities; - - /** - * Capabilities specific to the `textDocument/formatting` request. - */ - formatting?: DocumentFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/rangeFormatting` request. - */ - rangeFormatting?: DocumentRangeFormattingClientCapabilities; - - /** request. - * Capabilities specific to the `textDocument/onTypeFormatting` request. - */ - onTypeFormatting?: DocumentOnTypeFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/rename` request. - */ - rename?: RenameClientCapabilities; - - /** - * Capabilities specific to the `textDocument/publishDiagnostics` - * notification. - */ - publishDiagnostics?: PublishDiagnosticsClientCapabilities; - - /** - * Capabilities specific to the `textDocument/foldingRange` request. - * - * @since 3.10.0 - */ - foldingRange?: FoldingRangeClientCapabilities; - - /** - * Capabilities specific to the `textDocument/selectionRange` request. - * - * @since 3.15.0 - */ - selectionRange?: SelectionRangeClientCapabilities; - - /** - * Capabilities specific to the `textDocument/linkedEditingRange` request. - * - * @since 3.16.0 - */ - linkedEditingRange?: LinkedEditingRangeClientCapabilities; - - /** - * Capabilities specific to the various call hierarchy requests. - * - * @since 3.16.0 - */ - callHierarchy?: CallHierarchyClientCapabilities; - - /** - * Capabilities specific to the various semantic token requests. - * - * @since 3.16.0 - */ - semanticTokens?: SemanticTokensClientCapabilities; - - /** - * Capabilities specific to the `textDocument/moniker` request. - * - * @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. - -
- -```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). - -
- -```typescript -interface ClientCapabilities { - /** - * Workspace specific client capabilities. - */ - workspace?: { - /** - * The client supports applying batch edits - * to the workspace by supporting the request - * 'workspace/applyEdit' - */ - applyEdit?: boolean; - - /** - * Capabilities specific to `WorkspaceEdit`s - */ - workspaceEdit?: WorkspaceEditClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeConfiguration` - * notification. - */ - didChangeConfiguration?: DidChangeConfigurationClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeWatchedFiles` - * notification. - */ - didChangeWatchedFiles?: DidChangeWatchedFilesClientCapabilities; - - /** - * Capabilities specific to the `workspace/symbol` request. - */ - symbol?: WorkspaceSymbolClientCapabilities; - - /** - * Capabilities specific to the `workspace/executeCommand` request. - */ - executeCommand?: ExecuteCommandClientCapabilities; - - /** - * The client has support for workspace folders. - * - * @since 3.6.0 - */ - workspaceFolders?: boolean; - - /** - * The client supports `workspace/configuration` requests. - * - * @since 3.6.0 - */ - configuration?: boolean; - - /** - * Capabilities specific to the semantic token requests scoped to the - * workspace. - * - * @since 3.16.0 - */ - semanticTokens?: SemanticTokensWorkspaceClientCapabilities; - - /** - * Capabilities specific to the code lens requests scoped to the - * workspace. - * - * @since 3.16.0 - */ - codeLens?: CodeLensWorkspaceClientCapabilities; - - /** - * The client has support for file requests/notifications. - * - * @since 3.16.0 - */ - fileOperations?: { - /** - * Whether the client supports dynamic registration for file - * requests/notifications. - */ - dynamicRegistration?: boolean; - - /** - * The client has support for sending didCreateFiles notifications. - */ - didCreate?: boolean; - - /** - * The client has support for sending willCreateFiles requests. - */ - willCreate?: boolean; - - /** - * The client has support for sending didRenameFiles notifications. - */ - didRename?: boolean; - - /** - * The client has support for sending willRenameFiles requests. - */ - willRename?: boolean; - - /** - * The client has support for sending didDeleteFiles notifications. - */ - didDelete?: boolean; - - /** - * The client has support for sending willDeleteFiles requests. - */ - 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; - }; - - /** - * Text document specific client capabilities. - */ - textDocument?: TextDocumentClientCapabilities; - - /** - * Capabilities specific to the notebook document support. - * - * @since 3.17.0 - */ - notebookDocument?: NotebookDocumentClientCapabilities; - - /** - * Window specific client capabilities. - */ - window?: { - /** - * 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 - */ - workDoneProgress?: boolean; - - /** - * Capabilities specific to the showMessage request - * - * @since 3.16.0 - */ - showMessage?: ShowMessageRequestClientCapabilities; - - /** - * Client capabilities for the show document request. - * - * @since 3.16.0 - */ - showDocument?: ShowDocumentClientCapabilities; - }; - - /** - * General client capabilities. - * - * @since 3.16.0 - */ - 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 - */ - regularExpressions?: RegularExpressionsClientCapabilities; - - /** - * Client capabilities specific to the client's markdown parser. - * - * @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?: LSPAny; -} -``` - -_Response_: -* result: `InitializeResult` defined as follows: - -
- -```typescript -interface InitializeResult { - /** - * The capabilities the language server provides. - */ - capabilities: ServerCapabilities; - - /** - * Information about the server. - * - * @since 3.15.0 - */ - serverInfo?: { - /** - * The name of the server as defined by the server. - */ - name: string; - - /** - * The server's version as defined by the server. - */ - version?: string; - }; -} -``` -* error.code: - -
- -```typescript -/** - * Known error codes for an `InitializeErrorCodes`; - */ -export namespace InitializeErrorCodes { - - /** - * 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: - -
- -```typescript -interface InitializeError { - /** - * Indicates whether the client execute the following retry logic: - * (1) show the message provided by the ResponseError to the user - * (2) user selects retry or cancel - * (3) if user selected retry the initialize method is sent again. - */ - retry: boolean; -} -``` - -The server can signal the following capabilities: - -
- -```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 - * TextDocumentSyncKind number. If omitted it defaults to - * `TextDocumentSyncKind.None`. - */ - textDocumentSync?: TextDocumentSyncOptions | TextDocumentSyncKind; - - /** - * Defines how notebook documents are synced. - * - * @since 3.17.0 - */ - notebookDocumentSync?: NotebookDocumentSyncOptions - | NotebookDocumentSyncRegistrationOptions; - - /** - * The server provides completion support. - */ - completionProvider?: CompletionOptions; - - /** - * The server provides hover support. - */ - hoverProvider?: boolean | HoverOptions; - - /** - * The server provides signature help support. - */ - signatureHelpProvider?: SignatureHelpOptions; - - /** - * The server provides go to declaration support. - * - * @since 3.14.0 - */ - declarationProvider?: boolean | DeclarationOptions - | DeclarationRegistrationOptions; - - /** - * The server provides goto definition support. - */ - definitionProvider?: boolean | DefinitionOptions; - - /** - * The server provides goto type definition support. - * - * @since 3.6.0 - */ - typeDefinitionProvider?: boolean | TypeDefinitionOptions - | TypeDefinitionRegistrationOptions; - - /** - * The server provides goto implementation support. - * - * @since 3.6.0 - */ - implementationProvider?: boolean | ImplementationOptions - | ImplementationRegistrationOptions; - - /** - * The server provides find references support. - */ - referencesProvider?: boolean | ReferenceOptions; - - /** - * The server provides document highlight support. - */ - documentHighlightProvider?: boolean | DocumentHighlightOptions; - - /** - * The server provides document symbol support. - */ - documentSymbolProvider?: boolean | DocumentSymbolOptions; - - /** - * The server provides code actions. The `CodeActionOptions` return type is - * only valid if the client signals code action literal support via the - * property `textDocument.codeAction.codeActionLiteralSupport`. - */ - codeActionProvider?: boolean | CodeActionOptions; - - /** - * The server provides code lens. - */ - codeLensProvider?: CodeLensOptions; - - /** - * The server provides document link support. - */ - documentLinkProvider?: DocumentLinkOptions; - - /** - * The server provides color provider support. - * - * @since 3.6.0 - */ - colorProvider?: boolean | DocumentColorOptions - | DocumentColorRegistrationOptions; - - /** - * The server provides document formatting. - */ - documentFormattingProvider?: boolean | DocumentFormattingOptions; - - /** - * The server provides document range formatting. - */ - documentRangeFormattingProvider?: boolean | DocumentRangeFormattingOptions; - - /** - * The server provides document formatting on typing. - */ - documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions; - - /** - * The server provides rename support. RenameOptions may only be - * specified if the client states that it supports - * `prepareSupport` in its initial `initialize` request. - */ - renameProvider?: boolean | RenameOptions; - - /** - * The server provides folding provider support. - * - * @since 3.10.0 - */ - foldingRangeProvider?: boolean | FoldingRangeOptions - | FoldingRangeRegistrationOptions; - - /** - * The server provides execute command support. - */ - executeCommandProvider?: ExecuteCommandOptions; - - /** - * The server provides selection range support. - * - * @since 3.15.0 - */ - selectionRangeProvider?: boolean | SelectionRangeOptions - | SelectionRangeRegistrationOptions; - - /** - * The server provides linked editing range support. - * - * @since 3.16.0 - */ - linkedEditingRangeProvider?: boolean | LinkedEditingRangeOptions - | LinkedEditingRangeRegistrationOptions; - - /** - * The server provides call hierarchy support. - * - * @since 3.16.0 - */ - callHierarchyProvider?: boolean | CallHierarchyOptions - | CallHierarchyRegistrationOptions; - - /** - * The server provides semantic tokens support. - * - * @since 3.16.0 - */ - semanticTokensProvider?: SemanticTokensOptions - | SemanticTokensRegistrationOptions; - - /** - * Whether server provides moniker support. - * - * @since 3.16.0 - */ - 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; - - /** - * Workspace specific server capabilities - */ - workspace?: { - /** - * The server supports workspace folder. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFoldersServerCapabilities; - - /** - * The server is interested in file notifications/requests. - * - * @since 3.16.0 - */ - fileOperations?: { - /** - * The server is interested in receiving didCreateFiles - * notifications. - */ - didCreate?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willCreateFiles requests. - */ - willCreate?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving didRenameFiles - * notifications. - */ - didRename?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willRenameFiles requests. - */ - willRename?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving didDeleteFiles file - * notifications. - */ - didDelete?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willDeleteFiles file - * requests. - */ - willDelete?: FileOperationRegistrationOptions; - }; - }; - - /** - * Experimental server capabilities. - */ - experimental?: LSPAny; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/general/initialized.md b/language-server-protocol/_specifications/lsp/3.18/general/initialized.md deleted file mode 100644 index 122b60279..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/general/initialized.md +++ /dev/null @@ -1,12 +0,0 @@ -#### Initialized Notification (:arrow_right:) - -The initialized notification is sent from the client to the server after the client received the result of the `initialize` request but before the client is sending any other request or notification to the server. The server can use the `initialized` notification, for example, to dynamically register capabilities. The `initialized` notification may only be sent once. - -_Notification_: -* method: 'initialized' -* params: `InitializedParams` defined as follows: - -```typescript -interface InitializedParams { -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/general/logTrace.md b/language-server-protocol/_specifications/lsp/3.18/general/logTrace.md deleted file mode 100644 index 6c04a7b76..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/general/logTrace.md +++ /dev/null @@ -1,27 +0,0 @@ -#### LogTrace Notification (:arrow_left:) - -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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/general/setTrace.md b/language-server-protocol/_specifications/lsp/3.18/general/setTrace.md deleted file mode 100644 index 1c9b0f088..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/general/setTrace.md +++ /dev/null @@ -1,16 +0,0 @@ -#### SetTrace Notification (:arrow_right:) - -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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/general/shutdown.md b/language-server-protocol/_specifications/lsp/3.18/general/shutdown.md deleted file mode 100644 index 4055ac8de..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/general/shutdown.md +++ /dev/null @@ -1,13 +0,0 @@ -#### Shutdown Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/callHierarchy.md b/language-server-protocol/_specifications/lsp/3.18/language/callHierarchy.md deleted file mode 100644 index 4486ea14d..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/callHierarchy.md +++ /dev/null @@ -1,209 +0,0 @@ -#### Prepare Call Hierarchy Request (:leftwards_arrow_with_hook:) - -> *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 - -#### Call Hierarchy Incoming Calls (:leftwards_arrow_with_hook:) - -> *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 - -#### Call Hierarchy Outgoing Calls (:leftwards_arrow_with_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/lsp/3.18/language/codeAction.md b/language-server-protocol/_specifications/lsp/3.18/language/codeAction.md deleted file mode 100644 index e9c632c06..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/codeAction.md +++ /dev/null @@ -1,472 +0,0 @@ -#### Code Action Request (:leftwards_arrow_with_hook:) - -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. - -*Since version 3.16.0:* a client can offer a server to delay the computation of code action properties during a 'textDocument/codeAction' request: - -This is useful for cases where it is expensive to compute the value of a property (for example, the `edit` property). Clients signal this through the `codeAction.resolveSupport` capability which lists all properties a client can resolve lazily. The server capability `codeActionProvider.resolveProvider` signals that a server will offer a `codeAction/resolve` route. To help servers to uniquely identify a code action in the resolve request, a code action literal can optional carry a data property. This is also guarded by an additional client capability `codeAction.dataSupport`. In general, a client should offer data support if it offers resolve support. It should also be noted that servers shouldn't alter existing attributes of a code action in a codeAction/resolve request. - -> *Since version 3.8.0:* support for CodeAction literals to enable the following scenarios: - -- the ability to directly return a workspace edit from the code action request. This avoids having another server roundtrip to execute an actual code action. However server providers should be aware that if the code action is expensive to compute or the edits are huge it might still be beneficial if the result is simply a command and the actual edit is only computed when needed. -- the ability to group code actions using a kind. Clients are allowed to ignore that information. However it allows them to better group code action, for example, into corresponding menus (e.g. all refactor code actions into a refactor menu). - -Clients need to announce their support for code action literals (e.g. literals of type `CodeAction`) and code action kinds via the corresponding client capability `codeAction.codeActionLiteralSupport`. - -_Client Capability_: -* property name (optional): `textDocument.codeAction` -* property type: `CodeActionClientCapabilities` defined as follows: - -
- -```typescript -export interface CodeActionClientCapabilities { - /** - * Whether code action supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports code action literals as a valid - * response of the `textDocument/codeAction` request. - * - * @since 3.8.0 - */ - codeActionLiteralSupport?: { - /** - * The code action kind is supported with the following value - * set. - */ - codeActionKind: { - - /** - * The code action kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - */ - valueSet: CodeActionKind[]; - }; - }; - - /** - * Whether code action supports the `isPreferred` property. - * - * @since 3.15.0 - */ - isPreferredSupport?: boolean; - - /** - * Whether code action supports the `disabled` property. - * - * @since 3.16.0 - */ - disabledSupport?: boolean; - - /** - * Whether code action supports the `data` property which is - * preserved between a `textDocument/codeAction` and a - * `codeAction/resolve` request. - * - * @since 3.16.0 - */ - dataSupport?: boolean; - - - /** - * Whether the client supports resolving additional code action - * properties via a separate `codeAction/resolve` request. - * - * @since 3.16.0 - */ - resolveSupport?: { - /** - * The properties that a client can resolve lazily. - */ - properties: string[]; - }; - - /** - * Whether the client honors the change annotations in - * text edits and resource operations returned via the - * `CodeAction#edit` property by, for example, presenting - * the workspace edit in the user interface and asking - * for confirmation. - * - * @since 3.16.0 - */ - honorsChangeAnnotations?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `codeActionProvider` -* property type: `boolean | CodeActionOptions` where `CodeActionOptions` is defined as follows: - -
- -```typescript -export interface CodeActionOptions extends WorkDoneProgressOptions { - /** - * CodeActionKinds that this server may return. - * - * The list of kinds may be generic, such as `CodeActionKind.Refactor`, - * or the server may list out every specific kind they provide. - */ - codeActionKinds?: CodeActionKind[]; - - /** - * The server provides support to resolve additional - * information for a code action. - * - * @since 3.16.0 - */ - resolveProvider?: boolean; -} -``` - -_Registration Options_: `CodeActionRegistrationOptions` defined as follows: - -
- -```typescript -export interface CodeActionRegistrationOptions extends - TextDocumentRegistrationOptions, CodeActionOptions { -} -``` - -_Request_: -* method: `textDocument/codeAction` -* params: `CodeActionParams` defined as follows: - -
- -```typescript -/** - * Params for the CodeActionRequest - */ -export interface CodeActionParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The document in which the command was invoked. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range for which the command was invoked. - */ - range: Range; - - /** - * Context carrying additional information. - */ - context: CodeActionContext; -} -``` - -
- -```typescript -/** - * The kind of a code action. - * - * Kinds are a hierarchical list of identifiers separated by `.`, - * e.g. `"refactor.extract.function"`. - * - * The set of kinds is open and client needs to announce the kinds it supports - * to the server during initialization. - */ -export type CodeActionKind = string; - -/** - * A set of predefined code action kinds. - */ -export namespace CodeActionKind { - - /** - * Empty kind. - */ - export const Empty: CodeActionKind = ''; - - /** - * Base kind for quickfix actions: 'quickfix'. - */ - export const QuickFix: CodeActionKind = 'quickfix'; - - /** - * Base kind for refactoring actions: 'refactor'. - */ - export const Refactor: CodeActionKind = 'refactor'; - - /** - * Base kind for refactoring extraction actions: 'refactor.extract'. - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - export const RefactorExtract: CodeActionKind = 'refactor.extract'; - - /** - * Base kind for refactoring inline actions: 'refactor.inline'. - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - export const RefactorInline: CodeActionKind = 'refactor.inline'; - - /** - * Base kind for refactoring move actions: 'refactor.move' - * - * Example move actions: - * - * - Move a function to a new file - * - Move a property between classes - * - Move method to base class - * - ... - * - * @since 3.18.0 - proposed - */ - export const RefactorMove: CodeActionKind = 'refactor.move'; - - /** - * Base kind for refactoring rewrite actions: 'refactor.rewrite'. - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - ... - */ - export const RefactorRewrite: CodeActionKind = 'refactor.rewrite'; - - /** - * Base kind for source actions: `source`. - * - * Source code actions apply to the entire file. - */ - export const Source: CodeActionKind = 'source'; - - /** - * Base kind for an organize imports source action: - * `source.organizeImports`. - */ - 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'; -} -``` - -
- -```typescript -/** - * Contains additional diagnostic information about the context in which - * a code action is run. - */ -export interface CodeActionContext { - /** - * An array of diagnostics known on the client side overlapping the range - * provided to the `textDocument/codeAction` request. They are provided so - * that the server knows which errors are currently presented to the user - * for the given range. There is no guarantee that these accurately reflect - * the error state of the resource. The primary parameter - * to compute code actions is the provided range. - */ - diagnostics: Diagnostic[]; - - /** - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out by the client before being - * shown. So servers can omit computing them. - */ - only?: CodeActionKind[]; - - /** - * The reason why code actions were requested. - * - * @since 3.17.0 - */ - triggerKind?: CodeActionTriggerKind; -} -``` - -
- -```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: - -
- -```typescript -/** - * A code action represents a change that can be performed in code, e.g. to fix - * a problem or to refactor code. - * - * A CodeAction must set either `edit` and/or a `command`. If both are supplied, - * the `edit` is applied first, then the `command` is executed. - */ -export interface CodeAction { - - /** - * A short, human-readable, title for this code action. - */ - title: string; - - /** - * The kind of the code action. - * - * Used to filter code actions. - */ - kind?: CodeActionKind; - - /** - * The diagnostics that this code action resolves. - */ - diagnostics?: Diagnostic[]; - - /** - * Marks this as a preferred action. Preferred actions are used by the - * `auto fix` command and can be targeted by keybindings. - * - * A quick fix should be marked preferred if it properly addresses the - * underlying error. A refactoring should be marked preferred if it is the - * most reasonable choice of actions to take. - * - * @since 3.15.0 - */ - isPreferred?: boolean; - - /** - * Marks that the code action cannot currently be applied. - * - * Clients should follow the following guidelines regarding disabled code - * actions: - * - * - Disabled code actions are not shown in automatic lightbulbs code - * action menus. - * - * - Disabled actions are shown as faded out in the code action menu when - * the user request a more specific type of code action, such as - * refactorings. - * - * - If the user has a keybinding that auto applies a code action and only - * a disabled code actions are returned, the client should show the user - * an error message with `reason` in the editor. - * - * @since 3.16.0 - */ - disabled?: { - - /** - * Human readable description of why the code action is currently - * disabled. - * - * This is displayed in the code actions UI. - */ - reason: string; - }; - - /** - * The workspace edit this code action performs. - */ - edit?: WorkspaceEdit; - - /** - * A command this code action executes. If a code action - * provides an edit and a command, first the edit is - * executed and then the command. - */ - command?: Command; - - /** - * A data entry field that is preserved on a code action between - * a `textDocument/codeAction` and a `codeAction/resolve` request. - * - * @since 3.16.0 - */ - data?: LSPAny; -} -``` -* partial result: `(Command | CodeAction)[]` -* error: code and message set in case an exception happens during the code action request. - -#### Code Action Resolve Request (:leftwards_arrow_with_hook:) - -> *Since version 3.16.0* - -The request is sent from the client to the server to resolve additional information for a given code action. This is usually used to compute -the `edit` property of a code action to avoid its unnecessary computation during the `textDocument/codeAction` request. - -Consider the clients announces the `edit` property as a property that can be resolved lazy using the client capability - -```typescript -textDocument.codeAction.resolveSupport = { properties: ['edit'] }; -``` - -then a code action - -```typescript -{ - "title": "Do Foo" -} -``` - -needs to be resolved using the `codeAction/resolve` request before it can be applied. - -_Client Capability_: -* property name (optional): `textDocument.codeAction.resolveSupport` -* property type: `{ properties: string[]; }` - -_Request_: -* method: `codeAction/resolve` -* params: `CodeAction` - -_Response_: -* result: `CodeAction` -* error: code and message set in case an exception happens during the code action resolve request. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/codeLens.md b/language-server-protocol/_specifications/lsp/3.18/language/codeLens.md deleted file mode 100644 index 8755da315..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/codeLens.md +++ /dev/null @@ -1,144 +0,0 @@ -#### Code Lens Request (:leftwards_arrow_with_hook:) - -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?: LSPAny; -} -``` -* partial result: `CodeLens[]` -* error: code and message set in case an exception happens during the code lens request. - -#### Code Lens Resolve Request (:leftwards_arrow_with_hook:) - -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. - -#### Code Lens Refresh Request (:arrow_right_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/lsp/3.18/language/colorPresentation.md b/language-server-protocol/_specifications/lsp/3.18/language/colorPresentation.md deleted file mode 100644 index b02ac3503..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/colorPresentation.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Color Presentation Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The color presentation request is sent from the client to the server to obtain a list of presentations for a color value at a given location. Clients can use the result to -- modify a color reference. -- show in a color picker and let users pick one of the presentations - -This request has no special capabilities and registration options since it is send as a resolve request for the `textDocument/documentColor` request. - -_Request_: - -* method: `textDocument/colorPresentation` -* params: `ColorPresentationParams` defined as follows - -
- -```typescript -interface ColorPresentationParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The color information to request presentations for. - */ - color: Color; - - /** - * The range where the color would be inserted. Serves as a context. - */ - range: Range; -} -``` - -_Response_: -* result: `ColorPresentation[]` defined as follows: - -
- -```typescript -interface ColorPresentation { - /** - * The label of this color presentation. It will be shown on the color - * picker header. By default this is also the text that is inserted when - * selecting this color presentation. - */ - label: string; - /** - * An [edit](#TextEdit) which is applied to a document when selecting - * this presentation for the color. When `falsy` the - * [label](#ColorPresentation.label) is used. - */ - textEdit?: TextEdit; - /** - * An optional array of additional [text edits](#TextEdit) that are applied - * when selecting this color presentation. Edits must not overlap with the - * main [edit](#ColorPresentation.textEdit) nor with themselves. - */ - additionalTextEdits?: TextEdit[]; -} -``` - -* partial result: `ColorPresentation[]` -* error: code and message set in case an exception happens during the 'textDocument/colorPresentation' request diff --git a/language-server-protocol/_specifications/lsp/3.18/language/completion.md b/language-server-protocol/_specifications/lsp/3.18/language/completion.md deleted file mode 100644 index e19d5fbee..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/completion.md +++ /dev/null @@ -1,849 +0,0 @@ -#### Completion Request (:leftwards_arrow_with_hook:) - -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: - -
- -```typescript -export interface CompletionClientCapabilities { - /** - * Whether completion supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `CompletionItem` specific - * capabilities. - */ - completionItem?: { - /** - * Client supports snippets as insert text. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are - * linked, that is typing in one will update others too. - */ - snippetSupport?: boolean; - - /** - * Client supports commit characters on a completion item. - */ - commitCharactersSupport?: boolean; - - /** - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client supports the deprecated property on a completion item. - */ - deprecatedSupport?: boolean; - - /** - * Client supports the preselect property on a completion item. - */ - preselectSupport?: boolean; - - /** - * Client supports the tag property on a completion item. Clients - * supporting tags have to handle unknown tags gracefully. Clients - * especially need to preserve unknown tags when sending a completion - * item back to the server in a resolve call. - * - * @since 3.15.0 - */ - tagSupport?: { - /** - * The tags supported by the client. - */ - valueSet: CompletionItemTag[]; - }; - - /** - * Client supports insert replace edit to control different behavior if - * a completion item is inserted in the text or should replace text. - * - * @since 3.16.0 - */ - insertReplaceSupport?: boolean; - - /** - * Indicates which properties a client can resolve lazily on a - * completion item. Before version 3.16.0 only the predefined properties - * `documentation` and `detail` could be resolved lazily. - * - * @since 3.16.0 - */ - resolveSupport?: { - /** - * The properties that a client can resolve lazily. - */ - properties: string[]; - }; - - /** - * The client supports the `insertTextMode` property on - * a completion item to override the whitespace handling mode - * 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?: { - /** - * The completion item 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 completion items kinds from `Text` to `Reference` as defined in - * the initial version of the protocol. - */ - valueSet?: CompletionItemKind[]; - }; - - /** - * The client supports to send additional context information for a - * `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 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[]; - } -} -``` - -_Server Capability_: -* property name (optional): `completionProvider` -* property type: `CompletionOptions` defined as follows: - -
- -```typescript -/** - * Completion options. - */ -export interface CompletionOptions extends WorkDoneProgressOptions { - /** - * Most tools trigger completion request automatically without explicitly - * requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they - * do so when the user starts to type an identifier. For example, if the user - * types `c` in a JavaScript file code complete will automatically pop up - * present `console` besides others as a completion item. Characters that - * make up identifiers don't need to be listed here. - * - * If code complete should automatically be trigger on characters not being - * valid inside an identifier (for example, `.` in JavaScript) list them in - * `triggerCharacters`. - */ - triggerCharacters?: string[]; - - /** - * The list of all possible characters that commit a completion. This field - * can be used if clients don't support individual commit characters per - * completion item. See client capability - * `completion.completionItem.commitCharactersSupport`. - * - * If a server provides both `allCommitCharacters` and commit characters on - * an individual completion item the ones on the completion item win. - * - * @since 3.2.0 - */ - allCommitCharacters?: string[]; - - /** - * The server provides support to resolve additional - * 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: - -
- -```typescript -export interface CompletionRegistrationOptions - extends TextDocumentRegistrationOptions, CompletionOptions { -} -``` - -_Request_: -* method: `textDocument/completion` -* params: `CompletionParams` defined as follows: - -
- -```typescript -export interface CompletionParams extends TextDocumentPositionParams, - WorkDoneProgressParams, PartialResultParams { - /** - * The completion context. This is only available if the client specifies - * to send this using the client capability - * `completion.contextSupport === true` - */ - context?: CompletionContext; -} -``` - -
- -```typescript -/** - * How a completion was triggered - */ -export namespace CompletionTriggerKind { - /** - * Completion was triggered by typing an identifier (24x7 code - * complete), manual invocation (e.g Ctrl+Space) or via API. - */ - export const Invoked: 1 = 1; - - /** - * Completion was triggered by a trigger character specified by - * the `triggerCharacters` properties of the - * `CompletionRegistrationOptions`. - */ - export const TriggerCharacter: 2 = 2; - - /** - * Completion was re-triggered as the current completion list is incomplete. - */ - export const TriggerForIncompleteCompletions: 3 = 3; -} -export type CompletionTriggerKind = 1 | 2 | 3; -``` - -
- -```typescript -/** - * Contains additional information about the context in which a completion - * request is triggered. - */ -export interface CompletionContext { - /** - * How the completion was triggered. - */ - triggerKind: CompletionTriggerKind; - - /** - * The trigger character (a single character) that has trigger code - * complete. Is undefined if - * `triggerKind !== CompletionTriggerKind.TriggerCharacter` - */ - triggerCharacter?: string; -} -``` - -_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 }` - -
- -```typescript -/** - * Represents a collection of [completion items](#CompletionItem) to be - * presented in the editor. - */ -export interface CompletionList { - /** - * This list is not complete. Further typing should result in recomputing - * this list. - * - * Recomputed lists have all their items replaced (not appended) in the - * incomplete completion sessions. - */ - 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; - - /** - * A default data value. - * - * @since 3.17.0 - */ - data?: LSPAny; - } - - /** - * The completion items. - */ - items: CompletionItem[]; -} -``` - -
- -```typescript -/** - * Defines whether the insert text in a completion item should be interpreted as - * plain text or a snippet. - */ -export namespace InsertTextFormat { - /** - * The primary text to be inserted is treated as a plain string. - */ - export const PlainText = 1; - - /** - * The primary text to be inserted is treated as a snippet. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - */ - export const Snippet = 2; -} - -export type InsertTextFormat = 1 | 2; -``` - -
- -```typescript -/** - * Completion item tags are extra annotations that tweak the rendering of a - * completion item. - * - * @since 3.15.0 - */ -export namespace CompletionItemTag { - /** - * Render a completion as obsolete, usually using a strike-out. - */ - export const Deprecated = 1; -} - -export type CompletionItemTag = 1; -``` - -
- -```typescript -/** - * A special text edit to provide an insert and a replace operation. - * - * @since 3.16.0 - */ -export interface InsertReplaceEdit { - /** - * The string to be inserted. - */ - newText: string; - - /** - * The range if the insert is requested - */ - insert: Range; - - /** - * The range if the replace is requested. - */ - replace: Range; -} -``` - -
- -```typescript -/** - * How whitespace and indentation is handled during completion - * item insertion. - * - * @since 3.16.0 - */ -export namespace InsertTextMode { - /** - * The insertion or replace strings is taken as it is. If the - * value is multi line the lines below the cursor will be - * inserted using the indentation defined in the string value. - * The client will not apply any kind of adjustments to the - * string. - */ - export const asIs: 1 = 1; - - /** - * The editor adjusts leading whitespace of new lines so that - * they match the indentation up to the cursor of the line for - * which the item is accepted. - * - * Consider a line like this: <2tabs><3tabs>foo. Accepting a - * multi line completion item is indented using 2 tabs and all - * following lines inserted will be indented using 2 tabs as well. - */ - export const adjustIndentation: 2 = 2; -} - -export type InsertTextMode = 1 | 2; -``` - -
- -```typescript -/** - * Additional details for a completion item label. - * - * @since 3.17.0 - */ -export interface CompletionItemLabelDetails { - - /** - * 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; -} -``` - -
- -```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`. - */ - kind?: CompletionItemKind; - - /** - * Tags for this completion item. - * - * @since 3.15.0 - */ - tags?: CompletionItemTag[]; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - detail?: string; - - /** - * A human-readable string that represents a doc-comment. - */ - documentation?: string | MarkupContent; - - /** - * Indicates if this item is deprecated. - * - * @deprecated Use `tags` instead if supported. - */ - deprecated?: boolean; - - /** - * Select this item when showing. - * - * *Note* that only one completion item can be selected and that the - * tool / client decides which item that is. The rule is that the *first* - * item of those that match best is selected. - */ - preselect?: boolean; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the label is used - * as the sort text for this item. - */ - sortText?: string; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the label is used as the - * filter text for this item. - */ - filterText?: string; - - /** - * A string that should be inserted into a document when selecting - * this completion. When `falsy` the label is used as the insert text - * for this item. - * - * The `insertText` is subject to interpretation by the client side. - * Some tools might not take the string literally. For example - * VS Code when code complete is requested in this example - * `con` and a completion item with an `insertText` of - * `console` is provided it will only insert `sole`. Therefore it is - * recommended to use `textEdit` instead since it avoids additional client - * side interpretation. - */ - insertText?: string; - - /** - * 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 depends on - * the `textDocument.completion.insertTextMode` client capability. - * - * @since 3.16.0 - * @since 3.17.0 - support for `textDocument.completion.insertTextMode` - */ - insertTextMode?: InsertTextMode; - - /** - * An edit which is applied to a document when selecting this completion. - * When an edit is provided the value of `insertText` is ignored. - * - * *Note:* The range of the edit must be a single line range and it must - * contain the position at which completion has been requested. - * - * Most editors support two different operations when accepting a completion - * item. One is to insert a completion text and the other is to replace an - * 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.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 which completion has been requested. - * *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range - * must be a prefix of the edit's replace range, that means it must be - * contained and starting at the same position. - * - * @since 3.16.0 additional type `InsertReplaceEdit` - */ - 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. - * - * Additional text edits should be used to change text unrelated to the - * current cursor position (for example, adding an import statement at the - * top of the file if the completion item will insert an unqualified type). - */ - additionalTextEdits?: TextEdit[]; - - /** - * An optional set of characters that when pressed while this completion is - * active will accept it first and then type that character. *Note* that all - * commit characters should have `length=1` and that superfluous characters - * will be ignored. - */ - commitCharacters?: string[]; - - /** - * An optional command that is executed *after* inserting this completion. - * *Note* that additional modifications to the current document should be - * described with the additionalTextEdits-property. - */ - command?: Command; - - /** - * A data entry field that is preserved on a completion item between - * a completion and a completion resolve request. - */ - data?: LSPAny; -} -``` - -
- -```typescript -/** - * The kind of a completion entry. - */ -export namespace CompletionItemKind { - export const Text = 1; - export const Method = 2; - export const Function = 3; - export const Constructor = 4; - export const Field = 5; - export const Variable = 6; - export const Class = 7; - export const Interface = 8; - export const Module = 9; - export const Property = 10; - export const Unit = 11; - export const Value = 12; - export const Enum = 13; - export const Keyword = 14; - export const Snippet = 15; - export const Color = 16; - export const File = 17; - export const Reference = 18; - export const Folder = 19; - export const EnumMember = 20; - export const Constant = 21; - export const Struct = 22; - export const Event = 23; - export const Operator = 24; - export const TypeParameter = 25; -} - -export type CompletionItemKind = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25; -``` -* partial result: `CompletionItem[]` or `CompletionList` followed by `CompletionItem[]`. If the first provided result item is of type `CompletionList` subsequent partial results of `CompletionItem[]` add to the `items` property of the `CompletionList`. -* error: code and message set in case an exception happens during the completion request. - -Completion items support snippets (see `InsertTextFormat.Snippet`). The snippet format is as follows: - -##### Snippet Syntax - -The `body` of a snippet can use special constructs to control cursors and the text being inserted. The following are supported features and their syntaxes: - -##### Tab stops - -With tab stops, you can make the editor cursor move inside a snippet. Use `$1`, `$2` to specify cursor locations. The number is the order in which tab stops will be visited, whereas `$0` denotes the final cursor position. Multiple tab stops are linked and updated in sync. - -##### Placeholders - -Placeholders are tab stops with values, like `${1:foo}`. The placeholder text will be inserted and selected such that it can be easily changed. Placeholders can be nested, like `${1:another ${2:placeholder}}`. - -##### Choice - -Placeholders can have choices as values. The syntax is a comma separated enumeration of values, enclosed with the pipe-character, for example, `${1|one,two,three|}`. When the snippet is inserted and the placeholder selected, choices will prompt the user to pick one of the values. - -##### Variables - -With `$name` or `${name:default}` you can insert the value of a variable. When a variable isn’t set, its *default* or the empty string is inserted. When a variable is unknown (that is, its name isn’t defined) the name of the variable is inserted and it is transformed into a placeholder. - -The following variables can be used: - -* `TM_SELECTED_TEXT` The currently selected text or the empty string -* `TM_CURRENT_LINE` The contents of the current line -* `TM_CURRENT_WORD` The contents of the word under cursor or the empty string -* `TM_LINE_INDEX` The zero-index based line number -* `TM_LINE_NUMBER` The one-index based line number -* `TM_FILENAME` The filename of the current document -* `TM_FILENAME_BASE` The filename of the current document without its extensions -* `TM_DIRECTORY` The directory of the current document -* `TM_FILEPATH` The full file path of the current document - -##### Variable Transforms - -Transformations allow you to modify the value of a variable before it is inserted. The definition of a transformation consists of three parts: - -1. A [regular expression](#regExp) that is matched against the value of a variable, or the empty string when the variable cannot be resolved. -2. A "format string" that allows to reference matching groups from the regular expression. The format string allows for conditional inserts and simple modifications. -3. Options that are passed to the regular expression. - -The following example inserts the name of the current file without its ending, so from `foo.txt` it makes `foo`. - -``` -${TM_FILENAME/(.*)\..+$/$1/} - | | | | - | | | |-> no options - | | | - | | |-> references the contents of the first - | | capture group - | | - | |-> regex to capture everything before - | the final `.suffix` - | - |-> resolves to the filename -``` - -##### Grammar - -Below is the EBNF ([extended Backus-Naur form](https://en.wikipedia.org/wiki/Extended_Backus-Naur_form)) for snippets. With `\` (backslash), you can escape `$`, `}` and `\`. Within choice elements, the backslash also escapes comma and pipe characters. - -``` -any ::= tabstop | placeholder | choice | variable | text -tabstop ::= '$' int | '${' int '}' -placeholder ::= '${' int ':' any '}' -choice ::= '${' int '|' text (',' text)* '|}' -variable ::= '$' var | '${' var }' - | '${' var ':' any '}' - | '${' var '/' regex '/' (format | text)+ '/' options '}' -format ::= '$' int | '${' int '}' - | '${' int ':' '/upcase' | '/downcase' | '/capitalize' '}' - | '${' int ':+' if '}' - | '${' int ':?' if ':' else '}' - | '${' int ':-' else '}' | '${' int ':' else '}' -regex ::= Regular Expression value (ctor-string) -options ::= Regular Expression option (ctor-options) -var ::= [_a-zA-Z] [_a-zA-Z0-9]* -int ::= [0-9]+ -text ::= .* -if ::= text -else ::= text -``` - -#### Completion Item Resolve Request (:leftwards_arrow_with_hook:) - -The request is sent from the client to the server to resolve additional information for a given completion item. - -_Request_: -* method: `completionItem/resolve` -* params: `CompletionItem` - -_Response_: -* result: `CompletionItem` -* error: code and message set in case an exception happens during the completion resolve request. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/declaration.md b/language-server-protocol/_specifications/lsp/3.18/language/declaration.md deleted file mode 100644 index 8cef5fbe3..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/declaration.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Goto Declaration Request (:leftwards_arrow_with_hook:) - -> *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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/definition.md b/language-server-protocol/_specifications/lsp/3.18/language/definition.md deleted file mode 100644 index bf9693bf9..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/definition.md +++ /dev/null @@ -1,65 +0,0 @@ -#### Goto Definition Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/documentColor.md b/language-server-protocol/_specifications/lsp/3.18/language/documentColor.md deleted file mode 100644 index eaa00d97c..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/documentColor.md +++ /dev/null @@ -1,114 +0,0 @@ -#### Document Color Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The document color request is sent from the client to the server to list all color references found in a given text document. Along with the range, a color value in RGB is returned. - -Clients can use the result to decorate color references in an editor. For example: -- Color boxes showing the actual color next to the reference -- Show a color picker when a color reference is edited - -_Client Capability_: -* property name (optional): `textDocument.colorProvider` -* property type: `DocumentColorClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentColorClientCapabilities { - /** - * Whether document color supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `colorProvider` -* property type: `boolean | DocumentColorOptions | DocumentColorRegistrationOptions` where `DocumentColorOptions` is defined as follows: - -
- -```typescript -export interface DocumentColorOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentColorRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentColorRegistrationOptions extends - TextDocumentRegistrationOptions, StaticRegistrationOptions, - DocumentColorOptions { -} -``` - -_Request_: - -* method: `textDocument/documentColor` -* params: `DocumentColorParams` defined as follows - -
- -```typescript -interface DocumentColorParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: -* result: `ColorInformation[]` defined as follows: - -
- -```typescript -interface ColorInformation { - /** - * The range in the document where this color appears. - */ - range: Range; - - /** - * The actual color value for this color range. - */ - color: Color; -} -``` - -
- -```typescript -/** - * Represents a color in RGBA space. - */ -interface Color { - - /** - * The red component of this color in the range [0-1]. - */ - readonly red: decimal; - - /** - * The green component of this color in the range [0-1]. - */ - readonly green: decimal; - - /** - * The blue component of this color in the range [0-1]. - */ - readonly blue: decimal; - - /** - * The alpha component of this color in the range [0-1]. - */ - readonly alpha: decimal; -} -``` -* partial result: `ColorInformation[]` -* error: code and message set in case an exception happens during the 'textDocument/documentColor' request diff --git a/language-server-protocol/_specifications/lsp/3.18/language/documentHighlight.md b/language-server-protocol/_specifications/lsp/3.18/language/documentHighlight.md deleted file mode 100644 index a27e99f2a..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/documentHighlight.md +++ /dev/null @@ -1,108 +0,0 @@ -#### Document Highlights Request (:leftwards_arrow_with_hook:) - -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; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/documentLink.md b/language-server-protocol/_specifications/lsp/3.18/language/documentLink.md deleted file mode 100644 index 8ed5b4bc6..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/documentLink.md +++ /dev/null @@ -1,121 +0,0 @@ -#### Document Link Request (:leftwards_arrow_with_hook:) - -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?: URI; - - /** - * 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. - -#### Document Link Resolve Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/documentSymbol.md b/language-server-protocol/_specifications/lsp/3.18/language/documentSymbol.md deleted file mode 100644 index 5e28907c3..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/documentSymbol.md +++ /dev/null @@ -1,295 +0,0 @@ -#### Document Symbols Request (:leftwards_arrow_with_hook:) - -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; -} - -export type SymbolKind = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26; -``` - -
- -```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; -``` - -
- -```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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/foldingRange.md b/language-server-protocol/_specifications/lsp/3.18/language/foldingRange.md deleted file mode 100644 index 7d2d754f2..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/foldingRange.md +++ /dev/null @@ -1,195 +0,0 @@ -#### Folding Range Request (:leftwards_arrow_with_hook:) - -> *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; - - /** - * 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: - -
- -```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 -/** - * 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; -``` - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.18/language/formatting.md b/language-server-protocol/_specifications/lsp/3.18/language/formatting.md deleted file mode 100644 index 26ef83018..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/formatting.md +++ /dev/null @@ -1,108 +0,0 @@ -#### Document Formatting Request (:leftwards_arrow_with_hook:) - -The document formatting request is sent from the client to the server to format a whole document. - -_Client Capability_: -* property name (optional): `textDocument.formatting` -* property type: `DocumentFormattingClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentFormattingProvider` -* property type: `boolean | DocumentFormattingOptions` where `DocumentFormattingOptions` is defined as follows: - -
- -```typescript -export interface DocumentFormattingOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentFormattingOptions { -} -``` - -_Request_: -* method: `textDocument/formatting` -* params: `DocumentFormattingParams` defined as follows - -
- -```typescript -interface DocumentFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The format options. - */ - options: FormattingOptions; -} -``` - -
- -```typescript -/** - * Value-object describing what options formatting should use. - */ -interface FormattingOptions { - /** - * Size of a tab in spaces. - */ - tabSize: uinteger; - - /** - * Prefer spaces over tabs. - */ - insertSpaces: boolean; - - /** - * Trim trailing whitespace on a line. - * - * @since 3.15.0 - */ - trimTrailingWhitespace?: boolean; - - /** - * Insert a newline character at the end of the file if one does not exist. - * - * @since 3.15.0 - */ - insertFinalNewline?: boolean; - - /** - * Trim all newlines after the final newline at the end of the file. - * - * @since 3.15.0 - */ - trimFinalNewlines?: boolean; - - /** - * Signature for further properties. - */ - [key: string]: boolean | integer | string; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the formatting request. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/hover.md b/language-server-protocol/_specifications/lsp/3.18/language/hover.md deleted file mode 100644 index 51634bdb1..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/hover.md +++ /dev/null @@ -1,107 +0,0 @@ -#### Hover Request (:leftwards_arrow_with_hook:) - -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: - -
- -```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: - -
- -```typescript -export interface HoverOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `HoverRegistrationOptions` defined as follows: - -
- -```typescript -export interface HoverRegistrationOptions - extends TextDocumentRegistrationOptions, HoverOptions { -} -``` - -_Request_: -* method: `textDocument/hover` -* params: `HoverParams` defined as follows: - -
- -```typescript -export interface HoverParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: -* result: `Hover` \| `null` defined as follows: - -
- -```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: - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/implementation.md b/language-server-protocol/_specifications/lsp/3.18/language/implementation.md deleted file mode 100644 index 505e2af7b..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/implementation.md +++ /dev/null @@ -1,70 +0,0 @@ -#### Goto Implementation Request (:leftwards_arrow_with_hook:) - -> *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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/inlayHint.md b/language-server-protocol/_specifications/lsp/3.18/language/inlayHint.md deleted file mode 100644 index 2e38cae8f..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/inlayHint.md +++ /dev/null @@ -1,321 +0,0 @@ -#### Inlay Hint Request (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```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: - -
- -```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: - -
- -```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: - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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; -} - -export type InlayHintKind = 1 | 2; -``` - -* error: code and message set in case an exception happens during the inlay hint request. - -#### Inlay Hint Resolve Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Inlay Hint Refresh Request (:arrow_right_hook:) - -> *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: - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.18/language/inlineValue.md b/language-server-protocol/_specifications/lsp/3.18/language/inlineValue.md deleted file mode 100644 index c2ddf3cd8..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/inlineValue.md +++ /dev/null @@ -1,252 +0,0 @@ -#### Inline Value Request (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```typescript -/** - * Inline value options used during static registration. - * - * @since 3.17.0 - */ -export interface InlineValueOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `InlineValueRegistrationOptions` defined as follows: - -
- -```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: - -
- -```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; -} -``` - -
- -```typescript -/** - * @since 3.17.0 - */ -export interface InlineValueContext { - /** - * The stack frame (as a DAP Id) where the execution has stopped. - */ - frameId: integer; - - /** - * The document range where execution has stopped. - * Typically the end position of the range denotes the line where the - * inline values are shown. - */ - stoppedLocation: Range; -} -``` - -_Response_: -* result: `InlineValue[]` \| `null` defined as follows: - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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. - -#### Inline Value Refresh Request (:arrow_right_hook:) - -> *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: - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.18/language/linkedEditingRange.md b/language-server-protocol/_specifications/lsp/3.18/language/linkedEditingRange.md deleted file mode 100644 index 14c71e7d5..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/linkedEditingRange.md +++ /dev/null @@ -1,85 +0,0 @@ -#### Linked Editing Range(:leftwards_arrow_with_hook:) - -> *Since version 3.16.0* - -The linked editing request is sent from the client to the server to return for a given position in a document the range of the symbol at the position and all ranges that have the same content. Optionally a word pattern can be returned to describe valid contents. A rename to one of the ranges can be applied to all other ranges if the new content is valid. If no result-specific word pattern is provided, the word pattern from the client's language configuration is used. - -_Client Capabilities_: - -* property name (optional): `textDocument.linkedEditingRange` -* property type: `LinkedEditingRangeClientCapabilities` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeClientCapabilities { - /** - * Whether the 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): `linkedEditingRangeProvider` -* property type: `boolean` \| `LinkedEditingRangeOptions` \| `LinkedEditingRangeRegistrationOptions` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `LinkedEditingRangeRegistrationOptions` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeRegistrationOptions extends - TextDocumentRegistrationOptions, LinkedEditingRangeOptions, - StaticRegistrationOptions { -} -``` - -_Request_: - -* method: `textDocument/linkedEditingRange` -* params: `LinkedEditingRangeParams` defined as follows: - -
- -```typescript -export interface LinkedEditingRangeParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: - -* result: `LinkedEditingRanges` \| `null` defined as follows: - -
- -```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. - */ - 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. - */ - wordPattern?: string; -} -``` -* error: code and message set in case an exception happens during the 'textDocument/linkedEditingRange' request diff --git a/language-server-protocol/_specifications/lsp/3.18/language/moniker.md b/language-server-protocol/_specifications/lsp/3.18/language/moniker.md deleted file mode 100644 index 204c44798..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/moniker.md +++ /dev/null @@ -1,162 +0,0 @@ -#### Monikers (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```typescript -export interface MonikerOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `MonikerRegistrationOptions` defined as follows: - -
- -```typescript -export interface MonikerRegistrationOptions extends - TextDocumentRegistrationOptions, MonikerOptions { -} -``` - -_Request_: - -* method: `textDocument/moniker` -* params: `MonikerParams` defined as follows: - -
- -```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: - -
- -```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' -} -``` - -
- -```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' -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/onTypeFormatting.md b/language-server-protocol/_specifications/lsp/3.18/language/onTypeFormatting.md deleted file mode 100644 index 419a4f4e0..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/onTypeFormatting.md +++ /dev/null @@ -1,88 +0,0 @@ -#### Document on Type Formatting Request (:leftwards_arrow_with_hook:) - -The document on type formatting request is sent from the client to the server to format parts of the document during typing. - -_Client Capability_: -* property name (optional): `textDocument.onTypeFormatting` -* property type: `DocumentOnTypeFormattingClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentOnTypeFormattingClientCapabilities { - /** - * Whether on type formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentOnTypeFormattingProvider` -* property type: `DocumentOnTypeFormattingOptions` defined as follows: - -
- -```typescript -export interface DocumentOnTypeFormattingOptions { - /** - * A character on which formatting should be triggered, like `{`. - */ - firstTriggerCharacter: string; - - /** - * More trigger characters. - */ - moreTriggerCharacter?: string[]; -} -``` - -_Registration Options_: `DocumentOnTypeFormattingRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentOnTypeFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentOnTypeFormattingOptions { -} -``` - -_Request_: -* method: `textDocument/onTypeFormatting` -* params: `DocumentOnTypeFormattingParams` defined as follows: - -
- -```typescript -interface DocumentOnTypeFormattingParams { - - /** - * 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 formatting options. - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document. -* error: code and message set in case an exception happens during the range formatting request. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/publishDiagnostics.md b/language-server-protocol/_specifications/lsp/3.18/language/publishDiagnostics.md deleted file mode 100644 index 35443615c..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/publishDiagnostics.md +++ /dev/null @@ -1,92 +0,0 @@ -#### PublishDiagnostics Notification (:arrow_left:) - -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.publishDiagnostics` -* property type: `PublishDiagnosticsClientCapabilities` defined as follows: - -
- -```typescript -export interface PublishDiagnosticsClientCapabilities { - /** - * 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: - -
- -```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[]; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/language/pullDiagnostics.md b/language-server-protocol/_specifications/lsp/3.18/language/pullDiagnostics.md deleted file mode 100644 index a68d3be4d..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/pullDiagnostics.md +++ /dev/null @@ -1,502 +0,0 @@ -#### Pull Diagnostics - -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: - -
- -```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; - - /** - * Whether the clients supports related documents for document diagnostic - * pulls. - */ - relatedDocumentSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `diagnosticProvider` -* property type: `DiagnosticOptions` defined as follows: - -
- -```typescript -/** - * 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_: `DiagnosticRegistrationOptions` options defined as follows: - -
- -```typescript -/** - * Diagnostic registration options. - * - * @since 3.17.0 - */ -export interface DiagnosticRegistrationOptions extends - TextDocumentRegistrationOptions, DiagnosticOptions, - StaticRegistrationOptions { -} -``` - -##### Document Diagnostics(:leftwards_arrow_with_hook:) - -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/diagnostic'. -* params: `DocumentDiagnosticParams` defined as follows: - -
- -```typescript -/** - * 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: `DocumentDiagnosticReport` defined as follows: - -
- -```typescript -/** - * 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 type DocumentDiagnosticReport = RelatedFullDocumentDiagnosticReport - | RelatedUnchangedDocumentDiagnosticReport; -``` - -
- -```typescript -/** - * The document diagnostic report kinds. - * - * @since 3.17.0 - */ -export namespace DocumentDiagnosticReportKind { - /** - * A diagnostic report with a full - * set of problems. - */ - export const Full = 'full'; - - /** - * A report indicating that the last - * returned report is still accurate. - */ - export const Unchanged = 'unchanged'; -} - -export type DocumentDiagnosticReportKind = 'full' | 'unchanged'; -``` - -
- -```typescript -/** - * A diagnostic report with a full set of problems. - * - * @since 3.17.0 - */ -export interface FullDocumentDiagnosticReport { - /** - * A full document diagnostic report. - */ - kind: DocumentDiagnosticReportKind.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[]; -} -``` - -
- -```typescript -/** - * A diagnostic report indicating that the last returned - * report is still accurate. - * - * @since 3.17.0 - */ -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: DocumentDiagnosticReportKind.Unchanged; - - /** - * A result id which will be sent on the next - * diagnostic request for the same document. - */ - resultId: string; -} -``` - -
- -```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; - }; -} -``` - -
- -```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: - -
- -```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 }`: - -
- -```typescript -/** - * Cancellation data returned from a diagnostic request. - * - * @since 3.17.0 - */ -export interface DiagnosticServerCancellationData { - retriggerRequest: boolean; -} -``` - -##### Workspace Diagnostics(:leftwards_arrow_with_hook:) - -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: - -
- -```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[]; -} -``` - -
- -```typescript -/** - * A previous result id in a workspace pull request. - * - * @since 3.17.0 - */ -export interface PreviousResultId { - /** - * The URI for which the client knows a - * result id. - */ - uri: DocumentUri; - - /** - * The value of the previous result id. - */ - value: string; -} -``` - -_Response_: -* result: `WorkspaceDiagnosticReport` defined as follows: - -
- -```typescript -/** - * A workspace diagnostic report. - * - * @since 3.17.0 - */ -export interface WorkspaceDiagnosticReport { - items: WorkspaceDocumentDiagnosticReport[]; -} -``` - -
- -```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; -} -``` - -
- -```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; -}; -``` - -
- -```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: - -
- -```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 }`: - -##### Diagnostics Refresh(:arrow_right_hook:) - -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: - -
- - -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/rangeFormatting.md b/language-server-protocol/_specifications/lsp/3.18/language/rangeFormatting.md deleted file mode 100644 index 957f73419..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/rangeFormatting.md +++ /dev/null @@ -1,69 +0,0 @@ -#### Document Range Formatting Request (:leftwards_arrow_with_hook:) - -The document range formatting request is sent from the client to the server to format a given range in a document. - -_Client Capability_: -* property name (optional): `textDocument.rangeFormatting` -* property type: `DocumentRangeFormattingClientCapabilities` defined as follows: - -
- -```typescript -export interface DocumentRangeFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentRangeFormattingProvider` -* property type: `boolean | DocumentRangeFormattingOptions` where `DocumentRangeFormattingOptions` is defined as follows: - -
- -```typescript -export interface DocumentRangeFormattingOptions extends - WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: - -
- -```typescript -export interface DocumentRangeFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentRangeFormattingOptions { -} -``` - -_Request_: -* method: `textDocument/rangeFormatting`, -* params: `DocumentRangeFormattingParams` defined as follows: - -
- -```typescript -interface DocumentRangeFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range to format - */ - range: Range; - - /** - * The format options - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the range formatting request. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/references.md b/language-server-protocol/_specifications/lsp/3.18/language/references.md deleted file mode 100644 index e7d2e0303..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/references.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Find References Request (:leftwards_arrow_with_hook:) - -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; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/rename.md b/language-server-protocol/_specifications/lsp/3.18/language/rename.md deleted file mode 100644 index 0a91b0866..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/rename.md +++ /dev/null @@ -1,132 +0,0 @@ -#### Rename Request (:leftwards_arrow_with_hook:) - -The rename request is sent from the client to the server to ask the server to compute a workspace change so that the client can perform a workspace-wide rename of a symbol. - -_Client Capability_: -* property name (optional): `textDocument.rename` -* property type: `RenameClientCapabilities` defined as follows: - -
- -```typescript -export namespace PrepareSupportDefaultBehavior { - /** - * The client's default behavior is to select the identifier - * according to the language's syntax rule. - */ - export const Identifier: 1 = 1; -} - -export type PrepareSupportDefaultBehavior = 1; -``` - -
- -```typescript -export interface RenameClientCapabilities { - /** - * Whether rename supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * Client supports testing for validity of rename operations - * before execution. - * - * @since version 3.12.0 - */ - prepareSupport?: boolean; - - /** - * Client supports the default behavior result - * (`{ defaultBehavior: boolean }`). - * - * The value indicates the default behavior used by the - * client. - * - * @since version 3.16.0 - */ - prepareSupportDefaultBehavior?: PrepareSupportDefaultBehavior; - - /** - * 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. - * - * @since 3.16.0 - */ - honorsChangeAnnotations?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `renameProvider` -* property type: `boolean | RenameOptions` where `RenameOptions` is defined as follows: - -`RenameOptions` may only be specified if the client states that it supports `prepareSupport` in its initial `initialize` request. - -
- -```typescript -export interface RenameOptions extends WorkDoneProgressOptions { - /** - * Renames should be checked and tested before being executed. - */ - prepareProvider?: boolean; -} -``` - -_Registration Options_: `RenameRegistrationOptions` defined as follows: - -
- -```typescript -export interface RenameRegistrationOptions extends - TextDocumentRegistrationOptions, RenameOptions { -} -``` - -_Request_: -* method: `textDocument/rename` -* params: `RenameParams` defined as follows - -
- -```typescript -interface RenameParams extends TextDocumentPositionParams, - WorkDoneProgressParams { - /** - * The new name of the symbol. If the given name is not valid the - * request must return a [ResponseError](#ResponseError) with an - * appropriate message set. - */ - newName: string; -} -``` - -_Response_: -* 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). - -#### Prepare Rename Request (:leftwards_arrow_with_hook:) - -> *Since version 3.12.0* - -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` -* params: `PrepareRenameParams` defined as follows: - -
- -```typescript -export interface PrepareRenameParams extends TextDocumentPositionParams, WorkDoneProgressParams { -} -``` - -_Response_: -* 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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/selectionRange.md b/language-server-protocol/_specifications/lsp/3.18/language/selectionRange.md deleted file mode 100644 index c85db1695..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/selectionRange.md +++ /dev/null @@ -1,94 +0,0 @@ -#### Selection Range Request (:leftwards_arrow_with_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/lsp/3.18/language/semanticTokens.md b/language-server-protocol/_specifications/lsp/3.18/language/semanticTokens.md deleted file mode 100644 index 786ef7c3c..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/semanticTokens.md +++ /dev/null @@ -1,533 +0,0 @@ -#### Semantic Tokens (:leftwards_arrow_with_hook:) - -> *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' - /** - * @since 3.17.0 - */ - decorator = 'decorator' -} -``` - -
- -```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). - -
- -```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` - -The `deltaStart` and the `length` values must be encoded using the encoding the client and server agrees on during the `initialize` request (see also [TextDocuments](#textDocuments)). -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; - - /** - * 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: - -
- -```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[]; -} -``` - -
- -```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: - -
- -```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_: - -
- -* 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 diff --git a/language-server-protocol/_specifications/lsp/3.18/language/signatureHelp.md b/language-server-protocol/_specifications/lsp/3.18/language/signatureHelp.md deleted file mode 100644 index e7c390548..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/signatureHelp.md +++ /dev/null @@ -1,300 +0,0 @@ -#### Signature Help Request (:leftwards_arrow_with_hook:) - -The signature help request is sent from the client to the server to request signature information at a given cursor position. - -_Client Capability_: -* property name (optional): `textDocument.signatureHelp` -* property type: `SignatureHelpClientCapabilities` defined as follows: - -
- -```typescript -export interface SignatureHelpClientCapabilities { - /** - * Whether signature help supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `SignatureInformation` - * specific properties. - */ - signatureInformation?: { - /** - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client capabilities specific to parameter information. - */ - parameterInformation?: { - /** - * The client supports processing label offsets instead of a - * simple label string. - * - * @since 3.14.0 - */ - labelOffsetSupport?: boolean; - }; - - /** - * The client supports the `activeParameter` property on - * `SignatureInformation` literal. - * - * @since 3.16.0 - */ - activeParameterSupport?: boolean; - }; - - /** - * The client supports to send additional context information for a - * `textDocument/signatureHelp` request. A client that opts into - * contextSupport will also support the `retriggerCharacters` on - * `SignatureHelpOptions`. - * - * @since 3.15.0 - */ - contextSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `signatureHelpProvider` -* property type: `SignatureHelpOptions` defined as follows: - -
- -```typescript -export interface SignatureHelpOptions extends WorkDoneProgressOptions { - /** - * The characters that trigger signature help - * automatically. - */ - triggerCharacters?: string[]; - - /** - * List of characters that re-trigger signature help. - * - * These trigger characters are only active when signature help is already - * showing. All trigger characters are also counted as re-trigger - * characters. - * - * @since 3.15.0 - */ - retriggerCharacters?: string[]; -} -``` - -_Registration Options_: `SignatureHelpRegistrationOptions` defined as follows: - -
- -```typescript -export interface SignatureHelpRegistrationOptions - extends TextDocumentRegistrationOptions, SignatureHelpOptions { -} -``` - -_Request_: -* method: `textDocument/signatureHelp` -* params: `SignatureHelpParams` defined as follows: - -
- -```typescript -export interface SignatureHelpParams extends TextDocumentPositionParams, - WorkDoneProgressParams { - /** - * The signature help context. This is only available if the client - * specifies to send this using the client capability - * `textDocument.signatureHelp.contextSupport === true` - * - * @since 3.15.0 - */ - context?: SignatureHelpContext; -} -``` - -
- -```typescript -/** - * How a signature help was triggered. - * - * @since 3.15.0 - */ -export namespace SignatureHelpTriggerKind { - /** - * Signature help was invoked manually by the user or by a command. - */ - export const Invoked: 1 = 1; - /** - * Signature help was triggered by a trigger character. - */ - export const TriggerCharacter: 2 = 2; - /** - * Signature help was triggered by the cursor moving or by the document - * content changing. - */ - export const ContentChange: 3 = 3; -} -export type SignatureHelpTriggerKind = 1 | 2 | 3; -``` - -
- -```typescript -/** - * Additional information about the context in which a signature help request - * was triggered. - * - * @since 3.15.0 - */ -export interface SignatureHelpContext { - /** - * Action that caused signature help to be triggered. - */ - triggerKind: SignatureHelpTriggerKind; - - /** - * Character that caused signature help to be triggered. - * - * This is undefined when triggerKind !== - * SignatureHelpTriggerKind.TriggerCharacter - */ - triggerCharacter?: string; - - /** - * `true` if signature help was already showing when it was triggered. - * - * Retriggers occur when the signature help is already active and can be - * caused by actions such as typing a trigger character, a cursor move, or - * document content changes. - */ - isRetrigger: boolean; - - /** - * The currently active `SignatureHelp`. - * - * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field - * updated based on the user navigating through available signatures. - */ - activeSignatureHelp?: SignatureHelp; -} -``` - -_Response_: -* result: `SignatureHelp` \| `null` defined as follows: - -
- -```typescript -/** - * Signature help represents the signature of something - * callable. There can be multiple signature but only one - * active and only one active parameter. - */ -export interface SignatureHelp { - /** - * One or more signatures. If no signatures are available the signature help - * request should return `null`. - */ - signatures: SignatureInformation[]; - - /** - * The active signature. If omitted or the value lies outside the - * 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. - * - * In future version of the protocol this property might become - * mandatory to better express this. - */ - activeSignature?: uinteger; - - /** - * The active parameter of the active signature. If omitted or the value - * lies outside the range of `signatures[activeSignature].parameters` - * defaults to 0 if the active signature has parameters. If - * the active signature has no parameters it is ignored. - * In future version of the protocol this property might become - * mandatory to better express the active parameter if the - * active signature does have any. - */ - activeParameter?: uinteger; -} -``` - -
- -```typescript -/** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ -export interface SignatureInformation { - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; - - /** - * The parameters of this signature. - */ - parameters?: ParameterInformation[]; - - /** - * The index of the active parameter. - * - * If provided, this is used in place of `SignatureHelp.activeParameter`. - * - * @since 3.16.0 - */ - activeParameter?: uinteger; -} -``` - -
- -```typescript -/** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ -export interface ParameterInformation { - - /** - * The label of this parameter information. - * - * Either a string or an inclusive start and exclusive end offsets within - * its containing signature label. (see SignatureInformation.label). The - * offsets are based on a UTF-16 string representation as `Position` and - * `Range` does. - * - * *Note*: a label of type string should be a substring of its containing - * signature label. Its intended use case is to highlight the parameter - * label part in the `SignatureInformation.label`. - */ - label: string | [uinteger, uinteger]; - - /** - * The human-readable doc-comment of this parameter. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; -} -``` - -* error: code and message set in case an exception happens during the signature help request. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/typeDefinition.md b/language-server-protocol/_specifications/lsp/3.18/language/typeDefinition.md deleted file mode 100644 index e6df8458d..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/typeDefinition.md +++ /dev/null @@ -1,70 +0,0 @@ -#### Goto Type Definition Request (:leftwards_arrow_with_hook:) - -> *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. diff --git a/language-server-protocol/_specifications/lsp/3.18/language/typeHierarchy.md b/language-server-protocol/_specifications/lsp/3.18/language/typeHierarchy.md deleted file mode 100644 index c446602ca..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/language/typeHierarchy.md +++ /dev/null @@ -1,172 +0,0 @@ - -#### Prepare Type Hierarchy Request (:leftwards_arrow_with_hook:) - -> *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: - -
- -```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: - -
- -```typescript -export interface TypeHierarchyOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `TypeHierarchyRegistrationOptions` defined as follows: - -
- -```typescript -export interface TypeHierarchyRegistrationOptions extends - TextDocumentRegistrationOptions, TypeHierarchyOptions, - StaticRegistrationOptions { -} -``` - -_Request_: - -* method: 'textDocument/prepareTypeHierarchy' -* params: `TypeHierarchyPrepareParams` defined as follows: - -
- -```typescript -export interface TypeHierarchyPrepareParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: - -* result: `TypeHierarchyItem[] | null` defined as follows: - -
- -```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 - -#### Type Hierarchy Supertypes(:leftwards_arrow_with_hook:) - -> *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: - -
- -```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 - -#### Type Hierarchy Subtypes(:leftwards_arrow_with_hook:) - -> *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: - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.json b/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.json deleted file mode 100644 index f8ef0384c..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.json +++ /dev/null @@ -1,14373 +0,0 @@ -{ - "metaData": { - "version": "3.17.0" - }, - "requests": [ - { - "method": "textDocument/implementation", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Definition" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ImplementationParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "ImplementationRegistrationOptions" - }, - "documentation": "A request to resolve the implementation locations of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPositionParams]\n(#TextDocumentPositionParams) the response is of type {@link Definition} or a\nThenable that resolves to such." - }, - { - "method": "textDocument/typeDefinition", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Definition" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeDefinitionParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "TypeDefinitionRegistrationOptions" - }, - "documentation": "A request to resolve the type definition locations of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPositionParams]\n(#TextDocumentPositionParams) the response is of type {@link Definition} or a\nThenable that resolves to such." - }, - { - "method": "workspace/workspaceFolders", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "serverToClient", - "documentation": "The `workspace/workspaceFolders` is sent from the server to the client to fetch the open workspace folders." - }, - { - "method": "workspace/configuration", - "result": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ConfigurationParams" - }, - "documentation": "The 'workspace/configuration' request is sent from the server to the client to fetch a certain\nconfiguration setting.\n\nThis pull model replaces the old push model were the client signaled configuration change via an\nevent. If the server still needs to react to configuration changes (since the server caches the\nresult of `workspace/configuration` requests) the server should register for an empty configuration\nchange event and empty the cache if such an event is received." - }, - { - "method": "textDocument/documentColor", - "result": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorInformation" - } - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentColorParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorInformation" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentColorRegistrationOptions" - }, - "documentation": "A request to list all color symbols found in a given text document. The request's\nparameter is of type {@link DocumentColorParams} the\nresponse is of type {@link ColorInformation ColorInformation[]} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/colorPresentation", - "result": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorPresentation" - } - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ColorPresentationParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ColorPresentation" - } - }, - "registrationOptions": { - "kind": "and", - "items": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ] - }, - "documentation": "A request to list all presentation for a color. The request's\nparameter is of type {@link ColorPresentationParams} the\nresponse is of type {@link ColorInformation ColorInformation[]} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/foldingRange", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "FoldingRange" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "FoldingRangeParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FoldingRange" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "FoldingRangeRegistrationOptions" - }, - "documentation": "A request to provide folding ranges in a document. The request's\nparameter is of type {@link FoldingRangeParams}, the\nresponse is of type {@link FoldingRangeList} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/declaration", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Declaration" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DeclarationLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DeclarationParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DeclarationLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "DeclarationRegistrationOptions" - }, - "documentation": "A request to resolve the type definition locations of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPositionParams]\n(#TextDocumentPositionParams) the response is of type {@link Declaration}\nor a typed array of {@link DeclarationLink} or a Thenable that resolves\nto such." - }, - { - "method": "textDocument/selectionRange", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SelectionRange" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SelectionRangeParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SelectionRange" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "SelectionRangeRegistrationOptions" - }, - "documentation": "A request to provide selection ranges in a document. The request's\nparameter is of type {@link SelectionRangeParams}, the\nresponse is of type {@link SelectionRange SelectionRange[]} or a Thenable\nthat resolves to such." - }, - { - "method": "window/workDoneProgress/create", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "WorkDoneProgressCreateParams" - }, - "documentation": "The `window/workDoneProgress/create` request is sent from the server to the client to initiate progress\nreporting from the server." - }, - { - "method": "textDocument/prepareCallHierarchy", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CallHierarchyPrepareParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "CallHierarchyRegistrationOptions" - }, - "documentation": "A request to result a `CallHierarchyItem` in a document at a given position.\nCan be used as an input to an incoming or outgoing call hierarchy.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "callHierarchy/incomingCalls", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyIncomingCall" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CallHierarchyIncomingCallsParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyIncomingCall" - } - }, - "documentation": "A request to resolve the incoming calls for a given `CallHierarchyItem`.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "callHierarchy/outgoingCalls", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyOutgoingCall" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CallHierarchyOutgoingCallsParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CallHierarchyOutgoingCall" - } - }, - "documentation": "A request to resolve the outgoing calls for a given `CallHierarchyItem`.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/semanticTokens/full", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokens" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SemanticTokensParams" - }, - "partialResult": { - "kind": "reference", - "name": "SemanticTokensPartialResult" - }, - "registrationMethod": "textDocument/semanticTokens", - "registrationOptions": { - "kind": "reference", - "name": "SemanticTokensRegistrationOptions" - }, - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/semanticTokens/full/delta", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokens" - }, - { - "kind": "reference", - "name": "SemanticTokensDelta" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SemanticTokensDeltaParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokensPartialResult" - }, - { - "kind": "reference", - "name": "SemanticTokensDeltaPartialResult" - } - ] - }, - "registrationMethod": "textDocument/semanticTokens", - "registrationOptions": { - "kind": "reference", - "name": "SemanticTokensRegistrationOptions" - }, - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/semanticTokens/range", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokens" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SemanticTokensRangeParams" - }, - "partialResult": { - "kind": "reference", - "name": "SemanticTokensPartialResult" - }, - "registrationMethod": "textDocument/semanticTokens", - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/semanticTokens/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "window/showDocument", - "result": { - "kind": "reference", - "name": "ShowDocumentResult" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ShowDocumentParams" - }, - "documentation": "A request to show a document. This request might open an\nexternal program depending on the value of the URI to open.\nFor example, a request to open `https://code.visualstudio.com/`\nwill very likely open the URI in a WEB browser.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/linkedEditingRange", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "LinkedEditingRanges" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "LinkedEditingRangeParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "LinkedEditingRangeRegistrationOptions" - }, - "documentation": "A request to provide ranges that can be edited together.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/willCreateFiles", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CreateFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The will create files request is sent from the client to the server before files are actually\ncreated as long as the creation is triggered from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/willRenameFiles", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "RenameFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The will rename files request is sent from the client to the server before files are actually\nrenamed as long as the rename is triggered from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/willDeleteFiles", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DeleteFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The did delete files notification is sent from the client to the server when\nfiles were deleted from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/moniker", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Moniker" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "MonikerParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Moniker" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "MonikerRegistrationOptions" - }, - "documentation": "A request to get the moniker of a symbol at a given text document position.\nThe request parameter is of type {@link TextDocumentPositionParams}.\nThe response is of type {@link Moniker Moniker[]} or `null`." - }, - { - "method": "textDocument/prepareTypeHierarchy", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeHierarchyPrepareParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TypeHierarchyRegistrationOptions" - }, - "documentation": "A request to result a `TypeHierarchyItem` in a document at a given position.\nCan be used as an input to a subtypes or supertypes type hierarchy.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "typeHierarchy/supertypes", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeHierarchySupertypesParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - "documentation": "A request to resolve the supertypes for a given `TypeHierarchyItem`.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "typeHierarchy/subtypes", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "TypeHierarchySubtypesParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - }, - "documentation": "A request to resolve the subtypes for a given `TypeHierarchyItem`.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/inlineValue", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlineValue" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InlineValueParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlineValue" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "InlineValueRegistrationOptions" - }, - "documentation": "A request to provide inline values in a document. The request's parameter is of\ntype {@link InlineValueParams}, the response is of type\n{@link InlineValue InlineValue[]} or a Thenable that resolves to such.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/inlineValue/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/inlayHint", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlayHint" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InlayHintParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlayHint" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "InlayHintRegistrationOptions" - }, - "documentation": "A request to provide inlay hints in a document. The request's parameter is of\ntype {@link InlayHintsParams}, the response is of type\n{@link InlayHint InlayHint[]} or a Thenable that resolves to such.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "inlayHint/resolve", - "result": { - "kind": "reference", - "name": "InlayHint" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InlayHint" - }, - "documentation": "A request to resolve additional properties for an inlay hint.\nThe request's parameter is of type {@link InlayHint}, the response is\nof type {@link InlayHint} or a Thenable that resolves to such.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/inlayHint/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/diagnostic", - "result": { - "kind": "reference", - "name": "DocumentDiagnosticReport" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentDiagnosticParams" - }, - "partialResult": { - "kind": "reference", - "name": "DocumentDiagnosticReportPartialResult" - }, - "errorData": { - "kind": "reference", - "name": "DiagnosticServerCancellationData" - }, - "registrationOptions": { - "kind": "reference", - "name": "DiagnosticRegistrationOptions" - }, - "documentation": "The document diagnostic request definition.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/diagnostic", - "result": { - "kind": "reference", - "name": "WorkspaceDiagnosticReport" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkspaceDiagnosticParams" - }, - "partialResult": { - "kind": "reference", - "name": "WorkspaceDiagnosticReportPartialResult" - }, - "errorData": { - "kind": "reference", - "name": "DiagnosticServerCancellationData" - }, - "documentation": "The workspace diagnostic request definition.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "workspace/diagnostic/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "The diagnostic refresh request definition.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "client/registerCapability", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "RegistrationParams" - }, - "documentation": "The `client/registerCapability` request is sent from the server to the client to register a new capability\nhandler on the client side." - }, - { - "method": "client/unregisterCapability", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "UnregistrationParams" - }, - "documentation": "The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability\nhandler on the client side." - }, - { - "method": "initialize", - "result": { - "kind": "reference", - "name": "InitializeResult" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InitializeParams" - }, - "errorData": { - "kind": "reference", - "name": "InitializeError" - }, - "documentation": "The initialize request is sent from the client to the server.\nIt is sent once as the request after starting up the server.\nThe requests parameter is of type {@link InitializeParams}\nthe response if of type {@link InitializeResult} of a Thenable that\nresolves to such." - }, - { - "method": "shutdown", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "clientToServer", - "documentation": "A shutdown request is sent from the client to the server.\nIt is sent once when the client decides to shutdown the\nserver. The only notification that is sent after a shutdown request\nis the exit event." - }, - { - "method": "window/showMessageRequest", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "MessageActionItem" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ShowMessageRequestParams" - }, - "documentation": "The show message request is sent from the server to the client to show a message\nand a set of options actions to the user." - }, - { - "method": "textDocument/willSaveWaitUntil", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WillSaveTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "A document will save request is sent from the client to the server before\nthe document is actually saved. The request can return an array of TextEdits\nwhich will be applied to the text document before it is saved. Please note that\nclients might drop results if computing the text edits took too long or if a\nserver constantly fails on this request. This is done to keep the save fast and\nreliable." - }, - { - "method": "textDocument/completion", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItem" - } - }, - { - "kind": "reference", - "name": "CompletionList" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CompletionParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItem" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "CompletionRegistrationOptions" - }, - "documentation": "Request to request completion at a given text document position. The request's\nparameter is of type {@link TextDocumentPosition} the response\nis of type {@link CompletionItem CompletionItem[]} or {@link CompletionList}\nor a Thenable that resolves to such.\n\nThe request can delay the computation of the {@link CompletionItem.detail `detail`}\nand {@link CompletionItem.documentation `documentation`} properties to the `completionItem/resolve`\nrequest. However, properties that are needed for the initial sorting and filtering, like `sortText`,\n`filterText`, `insertText`, and `textEdit`, must not be changed during resolve." - }, - { - "method": "completionItem/resolve", - "result": { - "kind": "reference", - "name": "CompletionItem" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CompletionItem" - }, - "documentation": "Request to resolve additional information for a given completion item.The request's\nparameter is of type {@link CompletionItem} the response\nis of type {@link CompletionItem} or a Thenable that resolves to such." - }, - { - "method": "textDocument/hover", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Hover" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "HoverParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "HoverRegistrationOptions" - }, - "documentation": "Request to request hover information at a given text document position. The request's\nparameter is of type {@link TextDocumentPosition} the response is of\ntype {@link Hover} or a Thenable that resolves to such." - }, - { - "method": "textDocument/signatureHelp", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SignatureHelp" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SignatureHelpParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "SignatureHelpRegistrationOptions" - } - }, - { - "method": "textDocument/definition", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Definition" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DefinitionParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DefinitionLink" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "DefinitionRegistrationOptions" - }, - "documentation": "A request to resolve the definition location of a symbol at a given text\ndocument position. The request's parameter is of type [TextDocumentPosition]\n(#TextDocumentPosition) the response is of either type {@link Definition}\nor a typed array of {@link DefinitionLink} or a Thenable that resolves\nto such." - }, - { - "method": "textDocument/references", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ReferenceParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "ReferenceRegistrationOptions" - }, - "documentation": "A request to resolve project-wide references for the symbol denoted\nby the given text document position. The request's parameter is of\ntype {@link ReferenceParams} the response is of type\n{@link Location Location[]} or a Thenable that resolves to such." - }, - { - "method": "textDocument/documentHighlight", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentHighlight" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentHighlightParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentHighlight" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentHighlightRegistrationOptions" - }, - "documentation": "Request to resolve a {@link DocumentHighlight} for a given\ntext document position. The request's parameter is of type [TextDocumentPosition]\n(#TextDocumentPosition) the request response is of type [DocumentHighlight[]]\n(#DocumentHighlight) or a Thenable that resolves to such." - }, - { - "method": "textDocument/documentSymbol", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentSymbol" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentSymbolParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentSymbol" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentSymbolRegistrationOptions" - }, - "documentation": "A request to list all symbols found in a given text document. The request's\nparameter is of type {@link TextDocumentIdentifier} the\nresponse is of type {@link SymbolInformation SymbolInformation[]} or a Thenable\nthat resolves to such." - }, - { - "method": "textDocument/codeAction", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Command" - }, - { - "kind": "reference", - "name": "CodeAction" - } - ] - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeActionParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Command" - }, - { - "kind": "reference", - "name": "CodeAction" - } - ] - } - }, - "registrationOptions": { - "kind": "reference", - "name": "CodeActionRegistrationOptions" - }, - "documentation": "A request to provide commands for the given text document and range." - }, - { - "method": "codeAction/resolve", - "result": { - "kind": "reference", - "name": "CodeAction" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeAction" - }, - "documentation": "Request to resolve additional information for a given code action.The request's\nparameter is of type {@link CodeAction} the response\nis of type {@link CodeAction} or a Thenable that resolves to such." - }, - { - "method": "workspace/symbol", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceSymbol" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkspaceSymbolParams" - }, - "partialResult": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolInformation" - } - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceSymbol" - } - } - ] - }, - "registrationOptions": { - "kind": "reference", - "name": "WorkspaceSymbolRegistrationOptions" - }, - "documentation": "A request to list project-wide symbols matching the query string given\nby the {@link WorkspaceSymbolParams}. The response is\nof type {@link SymbolInformation SymbolInformation[]} or a Thenable that\nresolves to such.\n\n@since 3.17.0 - support for WorkspaceSymbol in the returned data. Clients\n need to advertise support for WorkspaceSymbols via the client capability\n `workspace.symbol.resolveSupport`.\n", - "since": "3.17.0 - support for WorkspaceSymbol in the returned data. Clients\nneed to advertise support for WorkspaceSymbols via the client capability\n`workspace.symbol.resolveSupport`." - }, - { - "method": "workspaceSymbol/resolve", - "result": { - "kind": "reference", - "name": "WorkspaceSymbol" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkspaceSymbol" - }, - "documentation": "A request to resolve the range inside the workspace\nsymbol's location.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "textDocument/codeLens", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeLens" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeLensParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeLens" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "CodeLensRegistrationOptions" - }, - "documentation": "A request to provide code lens for the given text document." - }, - { - "method": "codeLens/resolve", - "result": { - "kind": "reference", - "name": "CodeLens" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CodeLens" - }, - "documentation": "A request to resolve a command for a given code lens." - }, - { - "method": "workspace/codeLens/refresh", - "result": { - "kind": "base", - "name": "null" - }, - "messageDirection": "serverToClient", - "documentation": "A request to refresh all code actions\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "textDocument/documentLink", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentLink" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentLinkParams" - }, - "partialResult": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentLink" - } - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentLinkRegistrationOptions" - }, - "documentation": "A request to provide document links" - }, - { - "method": "documentLink/resolve", - "result": { - "kind": "reference", - "name": "DocumentLink" - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentLink" - }, - "documentation": "Request to resolve additional information for a given document link. The request's\nparameter is of type {@link DocumentLink} the response\nis of type {@link DocumentLink} or a Thenable that resolves to such." - }, - { - "method": "textDocument/formatting", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentFormattingParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentFormattingRegistrationOptions" - }, - "documentation": "A request to to format a whole document." - }, - { - "method": "textDocument/rangeFormatting", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentRangeFormattingParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentRangeFormattingRegistrationOptions" - }, - "documentation": "A request to to format a range in a document." - }, - { - "method": "textDocument/onTypeFormatting", - "result": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DocumentOnTypeFormattingParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DocumentOnTypeFormattingRegistrationOptions" - }, - "documentation": "A request to format a document on type." - }, - { - "method": "textDocument/rename", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceEdit" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "RenameParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "RenameRegistrationOptions" - }, - "documentation": "A request to rename a symbol." - }, - { - "method": "textDocument/prepareRename", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "PrepareRenameResult" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "PrepareRenameParams" - }, - "documentation": "A request to test and perform the setup necessary for a rename.\n\n@since 3.16 - support for default behavior", - "since": "3.16 - support for default behavior" - }, - { - "method": "workspace/executeCommand", - "result": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "LSPAny" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "ExecuteCommandParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "ExecuteCommandRegistrationOptions" - }, - "documentation": "A request send from the client to the server to execute a command. The request might return\na workspace edit which the client will apply to the workspace." - }, - { - "method": "workspace/applyEdit", - "result": { - "kind": "reference", - "name": "ApplyWorkspaceEditResult" - }, - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ApplyWorkspaceEditParams" - }, - "documentation": "A request sent from the server to the client to modified certain resources." - } - ], - "notifications": [ - { - "method": "workspace/didChangeWorkspaceFolders", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeWorkspaceFoldersParams" - }, - "documentation": "The `workspace/didChangeWorkspaceFolders` notification is sent from the client to the server when the workspace\nfolder configuration changes." - }, - { - "method": "window/workDoneProgress/cancel", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WorkDoneProgressCancelParams" - }, - "documentation": "The `window/workDoneProgress/cancel` notification is sent from the client to the server to cancel a progress\ninitiated on the server side." - }, - { - "method": "workspace/didCreateFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "CreateFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The did create files notification is sent from the client to the server when\nfiles were created from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/didRenameFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "RenameFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The did rename files notification is sent from the client to the server when\nfiles were renamed from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "workspace/didDeleteFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DeleteFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "documentation": "The will delete files request is sent from the client to the server before files are actually\ndeleted as long as the deletion is triggered from within the client.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "method": "notebookDocument/didOpen", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidOpenNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync", - "documentation": "A notification sent when a notebook opens.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "notebookDocument/didChange", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync" - }, - { - "method": "notebookDocument/didSave", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidSaveNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync", - "documentation": "A notification sent when a notebook document is saved.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "notebookDocument/didClose", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidCloseNotebookDocumentParams" - }, - "registrationMethod": "notebookDocument/sync", - "documentation": "A notification sent when a notebook closes.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "method": "initialized", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "InitializedParams" - }, - "documentation": "The initialized notification is sent from the client to the\nserver after the client is fully initialized and the server\nis allowed to send requests from the server to the client." - }, - { - "method": "exit", - "messageDirection": "clientToServer", - "documentation": "The exit event is sent from the client to the server to\nask the server to exit its process." - }, - { - "method": "workspace/didChangeConfiguration", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeConfigurationParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DidChangeConfigurationRegistrationOptions" - }, - "documentation": "The configuration change notification is sent from the client to the server\nwhen the client's configuration has changed. The notification contains\nthe changed configuration as defined by the language client." - }, - { - "method": "window/showMessage", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "ShowMessageParams" - }, - "documentation": "The show message notification is sent from a server to a client to ask\nthe client to display a particular message in the user interface." - }, - { - "method": "window/logMessage", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "LogMessageParams" - }, - "documentation": "The log message notification is sent from the server to the client to ask\nthe client to log a particular message." - }, - { - "method": "telemetry/event", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "LSPAny" - }, - "documentation": "The telemetry event notification is sent from the server to the client to ask\nthe client to log telemetry data." - }, - { - "method": "textDocument/didOpen", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidOpenTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "The document open notification is sent from the client to the server to signal\nnewly opened text documents. The document's truth is now managed by the client\nand the server must not try to read the document's truth using the document's\nuri. Open in this sense means it is managed by the client. It doesn't necessarily\nmean that its content is presented in an editor. An open notification must not\nbe sent more than once without a corresponding close notification send before.\nThis means open and close notification must be balanced and the max open count\nis one." - }, - { - "method": "textDocument/didChange", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentChangeRegistrationOptions" - }, - "documentation": "The document change notification is sent from the client to the server to signal\nchanges to a text document." - }, - { - "method": "textDocument/didClose", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidCloseTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "The document close notification is sent from the client to the server when\nthe document got closed in the client. The document's truth now exists where\nthe document's uri points to (e.g. if the document's uri is a file uri the\ntruth now exists on disk). As with the open notification the close notification\nis about managing the document's content. Receiving a close notification\ndoesn't mean that the document was open in an editor before. A close\nnotification requires a previous open notification to be sent." - }, - { - "method": "textDocument/didSave", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidSaveTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentSaveRegistrationOptions" - }, - "documentation": "The document save notification is sent from the client to the server when\nthe document got saved in the client." - }, - { - "method": "textDocument/willSave", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "WillSaveTextDocumentParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - "documentation": "A document will save notification is sent from the client to the server before\nthe document is actually saved." - }, - { - "method": "workspace/didChangeWatchedFiles", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "DidChangeWatchedFilesParams" - }, - "registrationOptions": { - "kind": "reference", - "name": "DidChangeWatchedFilesRegistrationOptions" - }, - "documentation": "The watched files notification is sent from the client to the server when\nthe client detects changes to file watched by the language client." - }, - { - "method": "textDocument/publishDiagnostics", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "PublishDiagnosticsParams" - }, - "documentation": "Diagnostics notification are sent from the server to the client to signal\nresults of validation runs." - }, - { - "method": "$/setTrace", - "messageDirection": "clientToServer", - "params": { - "kind": "reference", - "name": "SetTraceParams" - } - }, - { - "method": "$/logTrace", - "messageDirection": "serverToClient", - "params": { - "kind": "reference", - "name": "LogTraceParams" - } - }, - { - "method": "$/cancelRequest", - "messageDirection": "both", - "params": { - "kind": "reference", - "name": "CancelParams" - } - }, - { - "method": "$/progress", - "messageDirection": "both", - "params": { - "kind": "reference", - "name": "ProgressParams" - } - } - ], - "structures": [ - { - "name": "ImplementationParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "Location", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - } - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - } - } - ], - "documentation": "Represents a location inside a resource, such as a line\ninside a text file." - }, - { - "name": "ImplementationRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "ImplementationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "TypeDefinitionParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "TypeDefinitionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "TypeDefinitionOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "WorkspaceFolder", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The associated URI for this workspace folder." - }, - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the workspace folder. Used to refer to this\nworkspace folder in the user interface." - } - ], - "documentation": "A workspace folder inside a client." - }, - { - "name": "DidChangeWorkspaceFoldersParams", - "properties": [ - { - "name": "event", - "type": { - "kind": "reference", - "name": "WorkspaceFoldersChangeEvent" - }, - "documentation": "The actual workspace folder change event." - } - ], - "documentation": "The parameters of a `workspace/didChangeWorkspaceFolders` notification." - }, - { - "name": "ConfigurationParams", - "properties": [ - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ConfigurationItem" - } - } - } - ], - "documentation": "The parameters of a configuration request." - }, - { - "name": "DocumentColorParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DocumentColorRequest}." - }, - { - "name": "ColorInformation", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range in the document where this color appears." - }, - { - "name": "color", - "type": { - "kind": "reference", - "name": "Color" - }, - "documentation": "The actual color value for this color range." - } - ], - "documentation": "Represents a color range from a document." - }, - { - "name": "DocumentColorRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentColorOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "ColorPresentationParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "color", - "type": { - "kind": "reference", - "name": "Color" - }, - "documentation": "The color to request presentations for." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range where the color would be inserted. Serves as a context." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link ColorPresentationRequest}." - }, - { - "name": "ColorPresentation", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The label of this color presentation. It will be shown on the color\npicker header. By default this is also the text that is inserted when selecting\nthis color presentation." - }, - { - "name": "textEdit", - "type": { - "kind": "reference", - "name": "TextEdit" - }, - "optional": true, - "documentation": "An {@link TextEdit edit} which is applied to a document when selecting\nthis presentation for the color. When `falsy` the {@link ColorPresentation.label label}\nis used." - }, - { - "name": "additionalTextEdits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - "optional": true, - "documentation": "An optional array of additional {@link TextEdit text edits} that are applied when\nselecting this color presentation. Edits must not overlap with the main {@link ColorPresentation.textEdit edit} nor with themselves." - } - ] - }, - { - "name": "WorkDoneProgressOptions", - "properties": [ - { - "name": "workDoneProgress", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true - } - ] - }, - { - "name": "TextDocumentRegistrationOptions", - "properties": [ - { - "name": "documentSelector", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "DocumentSelector" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "A document selector to identify the scope of the registration. If set to null\nthe document selector provided on the client side will be used." - } - ], - "documentation": "General text document registration options." - }, - { - "name": "FoldingRangeParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link FoldingRangeRequest}." - }, - { - "name": "FoldingRange", - "properties": [ - { - "name": "startLine", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The zero-based start line of the range to fold. The folded area starts after the line's last character.\nTo be valid, the end must be zero or larger and smaller than the number of lines in the document." - }, - { - "name": "startCharacter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line." - }, - { - "name": "endLine", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The zero-based end line of the range to fold. The folded area ends with the line's last character.\nTo be valid, the end must be zero or larger and smaller than the number of lines in the document." - }, - { - "name": "endCharacter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "FoldingRangeKind" - }, - "optional": true, - "documentation": "Describes the kind of the folding range such as `comment' or 'region'. The kind\nis used to categorize folding ranges and used by commands like 'Fold all comments'.\nSee {@link FoldingRangeKind} for an enumeration of standardized kinds." - }, - { - "name": "collapsedText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The text that the client should show when the specified range is\ncollapsed. If not defined or not supported by the client, a default\nwill be chosen by the client.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Represents a folding range. To be valid, start and end line must be bigger than zero and smaller\nthan the number of lines in the document. Clients are free to ignore invalid ranges." - }, - { - "name": "FoldingRangeRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "FoldingRangeOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "DeclarationParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "DeclarationRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "DeclarationOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "SelectionRangeParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "positions", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Position" - } - }, - "documentation": "The positions inside the text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "A parameter literal used in selection range requests." - }, - { - "name": "SelectionRange", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The {@link Range range} of this selection range." - }, - { - "name": "parent", - "type": { - "kind": "reference", - "name": "SelectionRange" - }, - "optional": true, - "documentation": "The parent selection range containing this range. Therefore `parent.range` must contain `this.range`." - } - ], - "documentation": "A selection range represents a part of a selection hierarchy. A selection range\nmay have a parent selection range that contains it." - }, - { - "name": "SelectionRangeRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "SelectionRangeOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "WorkDoneProgressCreateParams", - "properties": [ - { - "name": "token", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "documentation": "The token to be used to report progress." - } - ] - }, - { - "name": "WorkDoneProgressCancelParams", - "properties": [ - { - "name": "token", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "documentation": "The token to be used to report progress." - } - ] - }, - { - "name": "CallHierarchyPrepareParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameter of a `textDocument/prepareCallHierarchy` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyItem", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this item." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this item." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this item." - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "More detail for this item, e.g. the signature of a function." - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The resource identifier of this item." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code." - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this symbol is being picked, e.g. the name of a function.\nMust be contained by the {@link CallHierarchyItem.range `range`}." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved between a call hierarchy prepare and\nincoming calls or outgoing calls requests." - } - ], - "documentation": "Represents programming constructs like functions or constructors in the context\nof call hierarchy.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CallHierarchyOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Call hierarchy options used during static or dynamic registration.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyIncomingCallsParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `callHierarchy/incomingCalls` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyIncomingCall", - "properties": [ - { - "name": "from", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - }, - "documentation": "The item that makes the call." - }, - { - "name": "fromRanges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Range" - } - }, - "documentation": "The ranges at which the calls appear. This is relative to the caller\ndenoted by {@link CallHierarchyIncomingCall.from `this.from`}." - } - ], - "documentation": "Represents an incoming call, e.g. a caller of a method or constructor.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyOutgoingCallsParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `callHierarchy/outgoingCalls` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CallHierarchyOutgoingCall", - "properties": [ - { - "name": "to", - "type": { - "kind": "reference", - "name": "CallHierarchyItem" - }, - "documentation": "The item that is called." - }, - { - "name": "fromRanges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Range" - } - }, - "documentation": "The range at which this item is called. This is the range relative to the caller, e.g the item\npassed to {@link CallHierarchyItemProvider.provideCallHierarchyOutgoingCalls `provideCallHierarchyOutgoingCalls`}\nand not {@link CallHierarchyOutgoingCall.to `this.to`}." - } - ], - "documentation": "Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokens", - "properties": [ - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional result id. If provided and clients support delta updating\nthe client will include the result id in the next semantic token request.\nA server can then instead of computing all semantic tokens again simply\nsend a delta." - }, - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "uinteger" - } - }, - "documentation": "The actual tokens." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensPartialResult", - "properties": [ - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "uinteger" - } - } - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "SemanticTokensOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensDeltaParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "previousResultId", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The result id of a previous response. The result Id can either point to a full response\nor a delta response depending on what was received last." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensDelta", - "properties": [ - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true - }, - { - "name": "edits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SemanticTokensEdit" - } - }, - "documentation": "The semantic token edits to transform a previous result into a new result." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensDeltaPartialResult", - "properties": [ - { - "name": "edits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SemanticTokensEdit" - } - } - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensRangeParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range the semantic tokens are requested for." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "ShowDocumentParams", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The document uri to show." - }, - { - "name": "external", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates to show the resource in an external program.\nTo show, for example, `https://code.visualstudio.com/`\nin the default WEB browser set `external` to `true`." - }, - { - "name": "takeFocus", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "An optional property to indicate whether the editor\nshowing the document should take focus or not.\nClients might ignore this property if an external\nprogram is started." - }, - { - "name": "selection", - "type": { - "kind": "reference", - "name": "Range" - }, - "optional": true, - "documentation": "An optional selection range if the document is a text\ndocument. Clients might ignore the property if an\nexternal program is started or the file is not a text\nfile." - } - ], - "documentation": "Params to show a document.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "ShowDocumentResult", - "properties": [ - { - "name": "success", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "A boolean indicating if the show was successful." - } - ], - "documentation": "The result of a showDocument request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ] - }, - { - "name": "LinkedEditingRanges", - "properties": [ - { - "name": "ranges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Range" - } - }, - "documentation": "A list of ranges that can be edited together. The ranges must have\nidentical length and contain identical text content. The ranges cannot overlap." - }, - { - "name": "wordPattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional word pattern (regular expression) that describes valid contents for\nthe given ranges. If no pattern is provided, the client configuration's word\npattern will be used." - } - ], - "documentation": "The result of a linked editing range request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "LinkedEditingRangeOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ] - }, - { - "name": "CreateFilesParams", - "properties": [ - { - "name": "files", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileCreate" - } - }, - "documentation": "An array of all files/folders created in this operation." - } - ], - "documentation": "The parameters sent in notifications/requests for user-initiated creation of\nfiles.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "WorkspaceEdit", - "properties": [ - { - "name": "changes", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - } - }, - "optional": true, - "documentation": "Holds changes to existing resources." - }, - { - "name": "documentChanges", - "type": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextDocumentEdit" - }, - { - "kind": "reference", - "name": "CreateFile" - }, - { - "kind": "reference", - "name": "RenameFile" - }, - { - "kind": "reference", - "name": "DeleteFile" - } - ] - } - }, - "optional": true, - "documentation": "Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\nare either an array of `TextDocumentEdit`s to express changes to n different text documents\nwhere each text document edit addresses a specific version of a text document. Or it can contain\nabove `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\nWhether a client supports versioned document edits is expressed via\n`workspace.workspaceEdit.documentChanges` client capability.\n\nIf a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\nonly plain `TextEdit`s using the `changes` property are supported." - }, - { - "name": "changeAnnotations", - "type": { - "kind": "map", - "key": { - "kind": "reference", - "name": "ChangeAnnotationIdentifier" - }, - "value": { - "kind": "reference", - "name": "ChangeAnnotation" - } - }, - "optional": true, - "documentation": "A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\ndelete file / folder operations.\n\nWhether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "A workspace edit represents changes to many resources managed in the workspace. The edit\nshould either provide `changes` or `documentChanges`. If documentChanges are present\nthey are preferred over `changes` if the client can handle versioned document edits.\n\nSince version 3.13.0 a workspace edit can contain resource operations as well. If resource\noperations are present clients need to execute the operations in the order in which they\nare provided. So a workspace edit, for example, can consist of the following two changes:\n(1) a create file a.txt and (2) a text document edit which insert text into file a.txt.\n\nAn invalid sequence (e.g. (1) delete file a.txt and (2) insert text into file a.txt) will\ncause failure of the operation. How the client recovers from the failure is described by\nthe client capability: `workspace.workspaceEdit.failureHandling`" - }, - { - "name": "FileOperationRegistrationOptions", - "properties": [ - { - "name": "filters", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileOperationFilter" - } - }, - "documentation": "The actual filters." - } - ], - "documentation": "The options to register for file operations.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "RenameFilesParams", - "properties": [ - { - "name": "files", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileRename" - } - }, - "documentation": "An array of all files/folders renamed in this operation. When a folder is renamed, only\nthe folder will be included, and not its children." - } - ], - "documentation": "The parameters sent in notifications/requests for user-initiated renames of\nfiles.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DeleteFilesParams", - "properties": [ - { - "name": "files", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileDelete" - } - }, - "documentation": "An array of all files/folders deleted in this operation." - } - ], - "documentation": "The parameters sent in notifications/requests for user-initiated deletes of\nfiles.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ] - }, - { - "name": "Moniker", - "properties": [ - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The scheme of the moniker. For example, `tsc` or `.Net`" - }, - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The identifier of the moniker. The value is opaque in LSIF however\nschema owners are allowed to define the structure if they want." - }, - { - "name": "unique", - "type": { - "kind": "reference", - "name": "UniquenessLevel" - }, - "documentation": "The scope in which the moniker is unique" - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "MonikerKind" - }, - "optional": true, - "documentation": "The moniker kind if known." - } - ], - "documentation": "Moniker definition to match LSIF 0.5 moniker definition.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "MonikerOptions" - } - ] - }, - { - "name": "TypeHierarchyPrepareParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameter of a `textDocument/prepareTypeHierarchy` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchyItem", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this item." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this item." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this item." - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "More detail for this item, e.g. the signature of a function." - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The resource identifier of this item." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range enclosing this symbol not including leading/trailing whitespace\nbut everything else, e.g. comments and code." - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this symbol is being\npicked, e.g. the name of a function. Must be contained by the\n{@link TypeHierarchyItem.range `range`}." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved between a type hierarchy prepare and\nsupertypes or subtypes requests. It could also be used to identify the\ntype hierarchy in the server, helping improve the performance on\nresolving supertypes and subtypes." - } - ], - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchyRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "TypeHierarchyOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Type hierarchy options used during static or dynamic registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchySupertypesParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `typeHierarchy/supertypes` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TypeHierarchySubtypesParams", - "properties": [ - { - "name": "item", - "type": { - "kind": "reference", - "name": "TypeHierarchyItem" - } - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameter of a `typeHierarchy/subtypes` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which inline values should be computed." - }, - { - "name": "context", - "type": { - "kind": "reference", - "name": "InlineValueContext" - }, - "documentation": "Additional information about the context in which inline values were\nrequested." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "A parameter literal used in inline value requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "InlineValueOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Inline value options used during static or dynamic registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which inlay hints should be computed." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "A parameter literal used in inlay hint requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHint", - "properties": [ - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position of this hint." - }, - { - "name": "label", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "InlayHintLabelPart" - } - } - ] - }, - "documentation": "The label of this hint. A human readable string or an array of\nInlayHintLabelPart label parts.\n\n*Note* that neither the string nor the label part can be empty." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "InlayHintKind" - }, - "optional": true, - "documentation": "The kind of this hint. Can be omitted in which case the client\nshould fall back to a reasonable default." - }, - { - "name": "textEdits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - "optional": true, - "documentation": "Optional text edits that are performed when accepting this inlay hint.\n\n*Note* that edits are expected to change the document so that the inlay\nhint (or its nearest variant) is now part of the document and the inlay\nhint itself is now obsolete." - }, - { - "name": "tooltip", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The tooltip text when you hover over this item." - }, - { - "name": "paddingLeft", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Render padding before the hint.\n\nNote: Padding should use the editor's background color, not the\nbackground color of the hint itself. That means padding can be used\nto visually align/separate an inlay hint." - }, - { - "name": "paddingRight", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Render padding after the hint.\n\nNote: Padding should use the editor's background color, not the\nbackground color of the hint itself. That means padding can be used\nto visually align/separate an inlay hint." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on an inlay hint between\na `textDocument/inlayHint` and a `inlayHint/resolve` request." - } - ], - "documentation": "Inlay hint information.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "InlayHintOptions" - }, - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Inlay hint options used during static or dynamic registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DocumentDiagnosticParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The additional identifier provided during registration." - }, - { - "name": "previousResultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The result id of a previous response if provided." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters of the document diagnostic request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DocumentDiagnosticReportPartialResult", - "properties": [ - { - "name": "relatedDocuments", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ] - } - } - } - ], - "documentation": "A partial result for a document diagnostic report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticServerCancellationData", - "properties": [ - { - "name": "retriggerRequest", - "type": { - "kind": "base", - "name": "boolean" - } - } - ], - "documentation": "Cancellation data returned from a diagnostic request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DiagnosticOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Diagnostic registration options.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceDiagnosticParams", - "properties": [ - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The additional identifier provided during registration." - }, - { - "name": "previousResultIds", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "PreviousResultId" - } - }, - "documentation": "The currently known diagnostic reports with their\nprevious result ids." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters of the workspace diagnostic request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceDiagnosticReport", - "properties": [ - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceDocumentDiagnosticReport" - } - } - } - ], - "documentation": "A workspace diagnostic report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceDiagnosticReportPartialResult", - "properties": [ - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceDocumentDiagnosticReport" - } - } - } - ], - "documentation": "A partial result for a workspace diagnostic report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidOpenNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocument" - }, - "documentation": "The notebook document that got opened." - }, - { - "name": "cellTextDocuments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentItem" - } - }, - "documentation": "The text documents that represent the content\nof a notebook cell." - } - ], - "documentation": "The params sent in an open notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidChangeNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "VersionedNotebookDocumentIdentifier" - }, - "documentation": "The notebook document that did change. The version number points\nto the version after all provided changes have been applied. If\nonly the text document content of a cell changes the notebook version\ndoesn't necessarily have to change." - }, - { - "name": "change", - "type": { - "kind": "reference", - "name": "NotebookDocumentChangeEvent" - }, - "documentation": "The actual changes to the notebook document.\n\nThe changes describe single state changes to the notebook document.\nSo if there are two changes c1 (at array index 0) and c2 (at array\nindex 1) for a notebook in state S then c1 moves the notebook from\nS to S' and c2 from S' to S''. So c1 is computed on the state S and\nc2 is computed on the state S'.\n\nTo mirror the content of a notebook using change events use the following approach:\n- start with the same initial content\n- apply the 'notebookDocument/didChange' notifications in the order you receive them.\n- apply the `NotebookChangeEvent`s in a single notification in the order\n you receive them." - } - ], - "documentation": "The params sent in a change notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidSaveNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocumentIdentifier" - }, - "documentation": "The notebook document that got saved." - } - ], - "documentation": "The params sent in a save notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DidCloseNotebookDocumentParams", - "properties": [ - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocumentIdentifier" - }, - "documentation": "The notebook document that got closed." - }, - { - "name": "cellTextDocuments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - }, - "documentation": "The text documents that represent the content\nof a notebook cell that got closed." - } - ], - "documentation": "The params sent in a close notebook document notification.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "RegistrationParams", - "properties": [ - { - "name": "registrations", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Registration" - } - } - } - ] - }, - { - "name": "UnregistrationParams", - "properties": [ - { - "name": "unregisterations", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Unregistration" - } - } - } - ] - }, - { - "name": "InitializeParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "_InitializeParams" - }, - { - "kind": "reference", - "name": "WorkspaceFoldersInitializeParams" - } - ] - }, - { - "name": "InitializeResult", - "properties": [ - { - "name": "capabilities", - "type": { - "kind": "reference", - "name": "ServerCapabilities" - }, - "documentation": "The capabilities the language server provides." - }, - { - "name": "serverInfo", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the server as defined by the server." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The server's version as defined by the server." - } - ] - } - }, - "optional": true, - "documentation": "Information about the server.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "The result returned from an initialize request." - }, - { - "name": "InitializeError", - "properties": [ - { - "name": "retry", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Indicates whether the client execute the following retry logic:\n(1) show the message provided by the ResponseError to the user\n(2) user selects retry or cancel\n(3) if user selected retry the initialize method is sent again." - } - ], - "documentation": "The data type of the ResponseError if the\ninitialize request fails." - }, - { - "name": "InitializedParams", - "properties": [] - }, - { - "name": "DidChangeConfigurationParams", - "properties": [ - { - "name": "settings", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "documentation": "The actual changed settings" - } - ], - "documentation": "The parameters of a change configuration notification." - }, - { - "name": "DidChangeConfigurationRegistrationOptions", - "properties": [ - { - "name": "section", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - } - ] - }, - "optional": true - } - ] - }, - { - "name": "ShowMessageParams", - "properties": [ - { - "name": "type", - "type": { - "kind": "reference", - "name": "MessageType" - }, - "documentation": "The message type. See {@link MessageType}" - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The actual message." - } - ], - "documentation": "The parameters of a notification message." - }, - { - "name": "ShowMessageRequestParams", - "properties": [ - { - "name": "type", - "type": { - "kind": "reference", - "name": "MessageType" - }, - "documentation": "The message type. See {@link MessageType}" - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The actual message." - }, - { - "name": "actions", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MessageActionItem" - } - }, - "optional": true, - "documentation": "The message action items to present." - } - ] - }, - { - "name": "MessageActionItem", - "properties": [ - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A short title like 'Retry', 'Open Log' etc." - } - ] - }, - { - "name": "LogMessageParams", - "properties": [ - { - "name": "type", - "type": { - "kind": "reference", - "name": "MessageType" - }, - "documentation": "The message type. See {@link MessageType}" - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The actual message." - } - ], - "documentation": "The log message parameters." - }, - { - "name": "DidOpenTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentItem" - }, - "documentation": "The document that was opened." - } - ], - "documentation": "The parameters sent in an open text document notification" - }, - { - "name": "DidChangeTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "VersionedTextDocumentIdentifier" - }, - "documentation": "The document that did change. The version number points\nto the version after all provided content changes have\nbeen applied." - }, - { - "name": "contentChanges", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentContentChangeEvent" - } - }, - "documentation": "The actual content changes. The content changes describe single state changes\nto the document. So if there are two content changes c1 (at array index 0) and\nc2 (at array index 1) for a document in state S then c1 moves the document from\nS to S' and c2 from S' to S''. So c1 is computed on the state S and c2 is computed\non the state S'.\n\nTo mirror the content of a document using change events use the following approach:\n- start with the same initial content\n- apply the 'textDocument/didChange' notifications in the order you receive them.\n- apply the `TextDocumentContentChangeEvent`s in a single notification in the order\n you receive them." - } - ], - "documentation": "The change text document notification's parameters." - }, - { - "name": "TextDocumentChangeRegistrationOptions", - "properties": [ - { - "name": "syncKind", - "type": { - "kind": "reference", - "name": "TextDocumentSyncKind" - }, - "documentation": "How documents are synced to the server." - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - } - ], - "documentation": "Describe options to be used when registered for text document change events." - }, - { - "name": "DidCloseTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document that was closed." - } - ], - "documentation": "The parameters sent in a close text document notification" - }, - { - "name": "DidSaveTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document that was saved." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional the content when saved. Depends on the includeText value\nwhen the save notification was requested." - } - ], - "documentation": "The parameters sent in a save text document notification" - }, - { - "name": "TextDocumentSaveRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "SaveOptions" - } - ], - "documentation": "Save registration options." - }, - { - "name": "WillSaveTextDocumentParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document that will be saved." - }, - { - "name": "reason", - "type": { - "kind": "reference", - "name": "TextDocumentSaveReason" - }, - "documentation": "The 'TextDocumentSaveReason'." - } - ], - "documentation": "The parameters sent in a will save text document notification." - }, - { - "name": "TextEdit", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range of the text document to be manipulated. To insert\ntext into a document create a range where start === end." - }, - { - "name": "newText", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The string to be inserted. For delete operations use an\nempty string." - } - ], - "documentation": "A text edit applicable to a text document." - }, - { - "name": "DidChangeWatchedFilesParams", - "properties": [ - { - "name": "changes", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileEvent" - } - }, - "documentation": "The actual file events." - } - ], - "documentation": "The watched files change notification's parameters." - }, - { - "name": "DidChangeWatchedFilesRegistrationOptions", - "properties": [ - { - "name": "watchers", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FileSystemWatcher" - } - }, - "documentation": "The watchers to register." - } - ], - "documentation": "Describe options to be used when registered for text document change events." - }, - { - "name": "PublishDiagnosticsParams", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which diagnostic information is reported." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "optional": true, - "documentation": "Optional the version number of the document the diagnostics are published for.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "diagnostics", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "documentation": "An array of diagnostic information items." - } - ], - "documentation": "The publish diagnostic notification's parameters." - }, - { - "name": "CompletionParams", - "properties": [ - { - "name": "context", - "type": { - "kind": "reference", - "name": "CompletionContext" - }, - "optional": true, - "documentation": "The completion context. This is only available it the client specifies\nto send this using the client capability `textDocument.completion.contextSupport === true`" - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Completion parameters" - }, - { - "name": "CompletionItem", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The label of this completion item.\n\nThe label property is also by default the text that\nis inserted when selecting this completion.\n\nIf label details are provided the label itself should\nbe an unqualified name of the completion item." - }, - { - "name": "labelDetails", - "type": { - "kind": "reference", - "name": "CompletionItemLabelDetails" - }, - "optional": true, - "documentation": "Additional details for the label\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "CompletionItemKind" - }, - "optional": true, - "documentation": "The kind of this completion item. Based of the kind\nan icon is chosen by the editor." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItemTag" - } - }, - "optional": true, - "documentation": "Tags for this completion item.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string with additional information\nabout this item, like type or symbol information." - }, - { - "name": "documentation", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "A human-readable string that represents a doc-comment." - }, - { - "name": "deprecated", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates if this item is deprecated.\n@deprecated Use `tags` instead.", - "deprecated": "Use `tags` instead." - }, - { - "name": "preselect", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Select this item when showing.\n\n*Note* that only one completion item can be selected and that the\ntool / client decides which item that is. The rule is that the *first*\nitem of those that match best is selected." - }, - { - "name": "sortText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A string that should be used when comparing this item\nwith other items. When `falsy` the {@link CompletionItem.label label}\nis used." - }, - { - "name": "filterText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A string that should be used when filtering a set of\ncompletion items. When `falsy` the {@link CompletionItem.label label}\nis used." - }, - { - "name": "insertText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A string that should be inserted into a document when selecting\nthis completion. When `falsy` the {@link CompletionItem.label label}\nis used.\n\nThe `insertText` is subject to interpretation by the client side.\nSome tools might not take the string literally. For example,\nVS Code when code complete is requested in this example\n`con` and a completion item with an `insertText` of\n`console` is provided it will only insert `sole`. Therefore it is\nrecommended to use `textEdit` instead since it avoids additional client\nside interpretation." - }, - { - "name": "insertTextFormat", - "type": { - "kind": "reference", - "name": "InsertTextFormat" - }, - "optional": true, - "documentation": "The format of the insert text. The format applies to both the\n`insertText` property and the `newText` property of a provided\n`textEdit`. If omitted defaults to `InsertTextFormat.PlainText`.\n\nPlease note that the insertTextFormat doesn't apply to\n`additionalTextEdits`." - }, - { - "name": "insertTextMode", - "type": { - "kind": "reference", - "name": "InsertTextMode" - }, - "optional": true, - "documentation": "How whitespace and indentation is handled during completion\nitem insertion. If not provided the clients default value depends on\nthe `textDocument.completion.insertTextMode` client capability.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "textEdit", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextEdit" - }, - { - "kind": "reference", - "name": "InsertReplaceEdit" - } - ] - }, - "optional": true, - "documentation": "An {@link TextEdit edit} which is applied to a document when selecting\nthis completion. When an edit is provided the value of\n{@link CompletionItem.insertText insertText} is ignored.\n\nMost editors support two different operations when accepting a completion\nitem. One is to insert a completion text and the other is to replace an\nexisting text with a completion text. Since this can usually not be\npredetermined by a server it can report both ranges. Clients need to\nsignal support for `InsertReplaceEdits` via the\n`textDocument.completion.insertReplaceSupport` client capability\nproperty.\n\n*Note 1:* The text edit's range as well as both ranges from an insert\nreplace edit must be a [single line] and they must contain the position\nat which completion has been requested.\n*Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range\nmust be a prefix of the edit's replace range, that means it must be\ncontained and starting at the same position.\n\n@since 3.16.0 additional type `InsertReplaceEdit`", - "since": "3.16.0 additional type `InsertReplaceEdit`" - }, - { - "name": "textEditText", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The edit text used if the completion item is part of a CompletionList and\nCompletionList defines an item default for the text edit range.\n\nClients will only honor this property if they opt into completion list\nitem defaults using the capability `completionList.itemDefaults`.\n\nIf not provided and a list's default range is provided the label\nproperty is used as a text.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "additionalTextEdits", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextEdit" - } - }, - "optional": true, - "documentation": "An optional array of additional {@link TextEdit text edits} that are applied when\nselecting this completion. Edits must not overlap (including the same insert position)\nwith the main {@link CompletionItem.textEdit edit} nor with themselves.\n\nAdditional text edits should be used to change text unrelated to the current cursor position\n(for example, adding an import statement at the top of the file if the completion item will\ninsert an unqualified type)." - }, - { - "name": "commitCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "An optional set of characters that when pressed while this completion is active will accept it first and\nthen type that character. *Note* that all commit characters should have `length=1` and that superfluous\ncharacters will be ignored." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "An optional {@link Command command} that is executed *after* inserting this completion. *Note* that\nadditional modifications to the current document should be described with the\n{@link CompletionItem.additionalTextEdits additionalTextEdits}-property." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a completion item between a\n{@link CompletionRequest} and a {@link CompletionResolveRequest}." - } - ], - "documentation": "A completion item represents a text snippet that is\nproposed to complete text that is being typed." - }, - { - "name": "CompletionList", - "properties": [ - { - "name": "isIncomplete", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "This list it not complete. Further typing results in recomputing this list.\n\nRecomputed lists have all their items replaced (not appended) in the\nincomplete completion sessions." - }, - { - "name": "itemDefaults", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "commitCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "A default commit character set.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "editRange", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Range" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "insert", - "type": { - "kind": "reference", - "name": "Range" - } - }, - { - "name": "replace", - "type": { - "kind": "reference", - "name": "Range" - } - } - ] - } - } - ] - }, - "optional": true, - "documentation": "A default edit range.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "insertTextFormat", - "type": { - "kind": "reference", - "name": "InsertTextFormat" - }, - "optional": true, - "documentation": "A default insert text format.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "insertTextMode", - "type": { - "kind": "reference", - "name": "InsertTextMode" - }, - "optional": true, - "documentation": "A default insert text mode.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A default data value.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "In many cases the items of an actual completion result share the same\nvalue for properties like `commitCharacters` or the range of a text\nedit. A completion list can therefore define item defaults which will\nbe used if a completion item itself doesn't specify the value.\n\nIf a completion list specifies a default value and a completion item\nalso specifies a corresponding value the one from the item is used.\n\nServers are only allowed to return default values if the client\nsignals support for this via the `completionList.itemDefaults`\ncapability.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItem" - } - }, - "documentation": "The completion items." - } - ], - "documentation": "Represents a collection of {@link CompletionItem completion items} to be presented\nin the editor." - }, - { - "name": "CompletionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CompletionOptions" - } - ], - "documentation": "Registration options for a {@link CompletionRequest}." - }, - { - "name": "HoverParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "Parameters for a {@link HoverRequest}." - }, - { - "name": "Hover", - "properties": [ - { - "name": "contents", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "MarkupContent" - }, - { - "kind": "reference", - "name": "MarkedString" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkedString" - } - } - ] - }, - "documentation": "The hover's content" - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "optional": true, - "documentation": "An optional range inside the text document that is used to\nvisualize the hover, e.g. by changing the background color." - } - ], - "documentation": "The result of a hover request." - }, - { - "name": "HoverRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "HoverOptions" - } - ], - "documentation": "Registration options for a {@link HoverRequest}." - }, - { - "name": "SignatureHelpParams", - "properties": [ - { - "name": "context", - "type": { - "kind": "reference", - "name": "SignatureHelpContext" - }, - "optional": true, - "documentation": "The signature help context. This is only available if the client specifies\nto send this using the client capability `textDocument.signatureHelp.contextSupport === true`\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "Parameters for a {@link SignatureHelpRequest}." - }, - { - "name": "SignatureHelp", - "properties": [ - { - "name": "signatures", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SignatureInformation" - } - }, - "documentation": "One or more signatures." - }, - { - "name": "activeSignature", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The active signature. If omitted or the value lies outside the\nrange of `signatures` the value defaults to zero or is ignored if\nthe `SignatureHelp` has no signatures.\n\nWhenever possible implementors should make an active decision about\nthe active signature and shouldn't rely on a default value.\n\nIn future version of the protocol this property might become\nmandatory to better express this." - }, - { - "name": "activeParameter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The active parameter of the active signature. If omitted or the value\nlies outside the range of `signatures[activeSignature].parameters`\ndefaults to 0 if the active signature has parameters. If\nthe active signature has no parameters it is ignored.\nIn future version of the protocol this property might become\nmandatory to better express the active parameter if the\nactive signature does have any." - } - ], - "documentation": "Signature help represents the signature of something\ncallable. There can be multiple signature but only one\nactive and only one active parameter." - }, - { - "name": "SignatureHelpRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "SignatureHelpOptions" - } - ], - "documentation": "Registration options for a {@link SignatureHelpRequest}." - }, - { - "name": "DefinitionParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DefinitionRequest}." - }, - { - "name": "DefinitionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DefinitionOptions" - } - ], - "documentation": "Registration options for a {@link DefinitionRequest}." - }, - { - "name": "ReferenceParams", - "properties": [ - { - "name": "context", - "type": { - "kind": "reference", - "name": "ReferenceContext" - } - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link ReferencesRequest}." - }, - { - "name": "ReferenceRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "ReferenceOptions" - } - ], - "documentation": "Registration options for a {@link ReferencesRequest}." - }, - { - "name": "DocumentHighlightParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DocumentHighlightRequest}." - }, - { - "name": "DocumentHighlight", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range this highlight applies to." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "DocumentHighlightKind" - }, - "optional": true, - "documentation": "The highlight kind, default is {@link DocumentHighlightKind.Text text}." - } - ], - "documentation": "A document highlight is a range inside a text document which deserves\nspecial attention. Usually a document highlight is visualized by changing\nthe background color of its range." - }, - { - "name": "DocumentHighlightRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentHighlightOptions" - } - ], - "documentation": "Registration options for a {@link DocumentHighlightRequest}." - }, - { - "name": "DocumentSymbolParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "Parameters for a {@link DocumentSymbolRequest}." - }, - { - "name": "SymbolInformation", - "properties": [ - { - "name": "deprecated", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates if this symbol is deprecated.\n\n@deprecated Use tags instead", - "deprecated": "Use tags instead" - }, - { - "name": "location", - "type": { - "kind": "reference", - "name": "Location" - }, - "documentation": "The location of this symbol. The location's range is used by a tool\nto reveal the location in the editor. If the symbol is selected in the\ntool the range's start information is used to position the cursor. So\nthe range usually spans more than the actual symbol's name and does\nnormally include things like visibility modifiers.\n\nThe range doesn't have to denote a node range in the sense of an abstract\nsyntax tree. It can therefore not be used to re-construct a hierarchy of\nthe symbols." - } - ], - "extends": [ - { - "kind": "reference", - "name": "BaseSymbolInformation" - } - ], - "documentation": "Represents information about programming constructs like variables, classes,\ninterfaces etc." - }, - { - "name": "DocumentSymbol", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this symbol. Will be displayed in the user interface and therefore must not be\nan empty string or a string only consisting of white spaces." - }, - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "More detail for this symbol, e.g the signature of a function." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this symbol." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this document symbol.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "deprecated", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Indicates if this symbol is deprecated.\n\n@deprecated Use tags instead", - "deprecated": "Use tags instead" - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range enclosing this symbol not including leading/trailing whitespace but everything else\nlike comments. This information is typically used to determine if the clients cursor is\ninside the symbol to reveal in the symbol in the UI." - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.\nMust be contained by the `range`." - }, - { - "name": "children", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentSymbol" - } - }, - "optional": true, - "documentation": "Children of this symbol, e.g. properties of a class." - } - ], - "documentation": "Represents programming constructs like variables, classes, interfaces etc.\nthat appear in a document. Document symbols can be hierarchical and they\nhave two ranges: one that encloses its definition and one that points to\nits most interesting range, e.g. the range of an identifier." - }, - { - "name": "DocumentSymbolRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentSymbolOptions" - } - ], - "documentation": "Registration options for a {@link DocumentSymbolRequest}." - }, - { - "name": "CodeActionParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document in which the command was invoked." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range for which the command was invoked." - }, - { - "name": "context", - "type": { - "kind": "reference", - "name": "CodeActionContext" - }, - "documentation": "Context carrying additional information." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link CodeActionRequest}." - }, - { - "name": "Command", - "properties": [ - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "Title of the command, like `save`." - }, - { - "name": "command", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The identifier of the actual command handler." - }, - { - "name": "arguments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "optional": true, - "documentation": "Arguments that the command handler should be\ninvoked with." - } - ], - "documentation": "Represents a reference to a command. Provides a title which\nwill be used to represent a command in the UI and, optionally,\nan array of arguments which will be passed to the command handler\nfunction when invoked." - }, - { - "name": "CodeAction", - "properties": [ - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A short, human-readable, title for this code action." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "CodeActionKind" - }, - "optional": true, - "documentation": "The kind of the code action.\n\nUsed to filter code actions." - }, - { - "name": "diagnostics", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "optional": true, - "documentation": "The diagnostics that this code action resolves." - }, - { - "name": "isPreferred", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted\nby keybindings.\n\nA quick fix should be marked preferred if it properly addresses the underlying error.\nA refactoring should be marked preferred if it is the most reasonable choice of actions to take.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "disabled", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "reason", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "Human readable description of why the code action is currently disabled.\n\nThis is displayed in the code actions UI." - } - ] - } - }, - "optional": true, - "documentation": "Marks that the code action cannot currently be applied.\n\nClients should follow the following guidelines regarding disabled code actions:\n\n - Disabled code actions are not shown in automatic [lightbulbs](https://code.visualstudio.com/docs/editor/editingevolved#_code-action)\n code action menus.\n\n - Disabled actions are shown as faded out in the code action menu when the user requests a more specific type\n of code action, such as refactorings.\n\n - If the user has a [keybinding](https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions)\n that auto applies a code action and only disabled code actions are returned, the client should show the user an\n error message with `reason` in the editor.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "edit", - "type": { - "kind": "reference", - "name": "WorkspaceEdit" - }, - "optional": true, - "documentation": "The workspace edit this code action performs." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "A command this code action executes. If a code action\nprovides an edit and a command, first the edit is\nexecuted and then the command." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a code action between\na `textDocument/codeAction` and a `codeAction/resolve` request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "A code action represents a change that can be performed in code, e.g. to fix a problem or\nto refactor code.\n\nA CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed." - }, - { - "name": "CodeActionRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CodeActionOptions" - } - ], - "documentation": "Registration options for a {@link CodeActionRequest}." - }, - { - "name": "WorkspaceSymbolParams", - "properties": [ - { - "name": "query", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A query string to filter symbols by. Clients may send an empty\nstring here to request all symbols." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link WorkspaceSymbolRequest}." - }, - { - "name": "WorkspaceSymbol", - "properties": [ - { - "name": "location", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Location" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - } - } - ] - } - } - ] - }, - "documentation": "The location of the symbol. Whether a server is allowed to\nreturn a location without a range depends on the client\ncapability `workspace.symbol.resolveSupport`.\n\nSee SymbolInformation#location for more details." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a workspace symbol between a\nworkspace symbol request and a workspace symbol resolve request." - } - ], - "extends": [ - { - "kind": "reference", - "name": "BaseSymbolInformation" - } - ], - "documentation": "A special workspace symbol that supports locations without a range.\n\nSee also SymbolInformation.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceSymbolRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "WorkspaceSymbolOptions" - } - ], - "documentation": "Registration options for a {@link WorkspaceSymbolRequest}." - }, - { - "name": "CodeLensParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to request code lens for." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link CodeLensRequest}." - }, - { - "name": "CodeLens", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range in which this code lens is valid. Should only span a single line." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "The command this code lens represents." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a code lens item between\na {@link CodeLensRequest} and a [CodeLensResolveRequest]\n(#CodeLensResolveRequest)" - } - ], - "documentation": "A code lens represents a {@link Command command} that should be shown along with\nsource text, like the number of references, a way to run tests, etc.\n\nA code lens is _unresolved_ when no command is associated to it. For performance\nreasons the creation of a code lens and resolving should be done in two stages." - }, - { - "name": "CodeLensRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "CodeLensOptions" - } - ], - "documentation": "Registration options for a {@link CodeLensRequest}." - }, - { - "name": "DocumentLinkParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to provide document links for." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - }, - { - "kind": "reference", - "name": "PartialResultParams" - } - ], - "documentation": "The parameters of a {@link DocumentLinkRequest}." - }, - { - "name": "DocumentLink", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range this link applies to." - }, - { - "name": "target", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The uri this link points to. If missing a resolve request is sent later." - }, - { - "name": "tooltip", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The tooltip text when you hover over this link.\n\nIf a tooltip is provided, is will be displayed in a string that includes instructions on how to\ntrigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,\nuser settings, and localization.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved on a document link between a\nDocumentLinkRequest and a DocumentLinkResolveRequest." - } - ], - "documentation": "A document link is a range in a text document that links to an internal or external resource, like another\ntext document or a web site." - }, - { - "name": "DocumentLinkRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentLinkOptions" - } - ], - "documentation": "Registration options for a {@link DocumentLinkRequest}." - }, - { - "name": "DocumentFormattingParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to format." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FormattingOptions" - }, - "documentation": "The format options." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentFormattingRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentFormattingOptions" - } - ], - "documentation": "Registration options for a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to format." - }, - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range to format" - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FormattingOptions" - }, - "documentation": "The format options" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentRangeFormattingOptions" - } - ], - "documentation": "Registration options for a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to format." - }, - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position around which the on type formatting should happen.\nThis is not necessarily the exact position where the character denoted\nby the property `ch` got typed." - }, - { - "name": "ch", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The character that has been typed that triggered the formatting\non type request. That is not necessarily the last character that\ngot inserted into the document since the client could auto insert\ncharacters as well (e.g. like automatic brace completion)." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FormattingOptions" - }, - "documentation": "The formatting options." - } - ], - "documentation": "The parameters of a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "DocumentOnTypeFormattingOptions" - } - ], - "documentation": "Registration options for a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "RenameParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The document to rename." - }, - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position at which this request was sent." - }, - { - "name": "newName", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The new name of the symbol. If the given name is not valid the\nrequest must return a {@link ResponseError} with an\nappropriate message set." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link RenameRequest}." - }, - { - "name": "RenameRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentRegistrationOptions" - }, - { - "kind": "reference", - "name": "RenameOptions" - } - ], - "documentation": "Registration options for a {@link RenameRequest}." - }, - { - "name": "PrepareRenameParams", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentPositionParams" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ] - }, - { - "name": "ExecuteCommandParams", - "properties": [ - { - "name": "command", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The identifier of the actual command handler." - }, - { - "name": "arguments", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "optional": true, - "documentation": "Arguments that the command should be invoked with." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The parameters of a {@link ExecuteCommandRequest}." - }, - { - "name": "ExecuteCommandRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "ExecuteCommandOptions" - } - ], - "documentation": "Registration options for a {@link ExecuteCommandRequest}." - }, - { - "name": "ApplyWorkspaceEditParams", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional label of the workspace edit. This label is\npresented in the user interface, for example, on an undo\nstack to undo the workspace edit." - }, - { - "name": "edit", - "type": { - "kind": "reference", - "name": "WorkspaceEdit" - }, - "documentation": "The edits to apply." - } - ], - "documentation": "The parameters passed via a apply workspace edit request." - }, - { - "name": "ApplyWorkspaceEditResult", - "properties": [ - { - "name": "applied", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Indicates whether the edit was applied or not." - }, - { - "name": "failureReason", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional textual description for why the edit was not applied.\nThis may be used by the server for diagnostic logging or to provide\na suitable error for a request that triggered the edit." - }, - { - "name": "failedChange", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "Depending on the client's failure handling strategy `failedChange` might\ncontain the index of the change that failed. This property is only available\nif the client signals a `failureHandlingStrategy` in its client capabilities." - } - ], - "documentation": "The result returned from the apply workspace edit request.\n\n@since 3.17 renamed from ApplyWorkspaceEditResponse", - "since": "3.17 renamed from ApplyWorkspaceEditResponse" - }, - { - "name": "WorkDoneProgressBegin", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "begin" - } - }, - { - "name": "title", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "Mandatory title of the progress operation. Used to briefly inform about\nthe kind of operation being performed.\n\nExamples: \"Indexing\" or \"Linking dependencies\"." - }, - { - "name": "cancellable", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Controls if a cancel button should show to allow the user to cancel the\nlong running operation. Clients that don't support cancellation are allowed\nto ignore the setting." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional, more detailed associated progress message. Contains\ncomplementary information to the `title`.\n\nExamples: \"3/25 files\", \"project/src/module2\", \"node_modules/some_dep\".\nIf unset, the previous progress message (if any) is still valid." - }, - { - "name": "percentage", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "Optional progress percentage to display (value 100 is considered 100%).\nIf not provided infinite progress is assumed and clients are allowed\nto ignore the `percentage` value in subsequent in report notifications.\n\nThe value should be steadily rising. Clients are free to ignore values\nthat are not following this rule. The value range is [0, 100]." - } - ] - }, - { - "name": "WorkDoneProgressReport", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "report" - } - }, - { - "name": "cancellable", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Controls enablement state of a cancel button.\n\nClients that don't support cancellation or don't support controlling the button's\nenablement state are allowed to ignore the property." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional, more detailed associated progress message. Contains\ncomplementary information to the `title`.\n\nExamples: \"3/25 files\", \"project/src/module2\", \"node_modules/some_dep\".\nIf unset, the previous progress message (if any) is still valid." - }, - { - "name": "percentage", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "Optional progress percentage to display (value 100 is considered 100%).\nIf not provided infinite progress is assumed and clients are allowed\nto ignore the `percentage` value in subsequent in report notifications.\n\nThe value should be steadily rising. Clients are free to ignore values\nthat are not following this rule. The value range is [0, 100]" - } - ] - }, - { - "name": "WorkDoneProgressEnd", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "end" - } - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Optional, a final message indicating to, for example, indicate the outcome\nof the operation." - } - ] - }, - { - "name": "SetTraceParams", - "properties": [ - { - "name": "value", - "type": { - "kind": "reference", - "name": "TraceValues" - } - } - ] - }, - { - "name": "LogTraceParams", - "properties": [ - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - } - }, - { - "name": "verbose", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true - } - ] - }, - { - "name": "CancelParams", - "properties": [ - { - "name": "id", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "string" - } - ] - }, - "documentation": "The request id to cancel." - } - ] - }, - { - "name": "ProgressParams", - "properties": [ - { - "name": "token", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "documentation": "The progress token provided by the client or server." - }, - { - "name": "value", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "documentation": "The progress data." - } - ] - }, - { - "name": "TextDocumentPositionParams", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentIdentifier" - }, - "documentation": "The text document." - }, - { - "name": "position", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The position inside the text document." - } - ], - "documentation": "A parameter literal used in requests to pass a text document and a position inside that\ndocument." - }, - { - "name": "WorkDoneProgressParams", - "properties": [ - { - "name": "workDoneToken", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "optional": true, - "documentation": "An optional token that a server can use to report work done progress." - } - ] - }, - { - "name": "PartialResultParams", - "properties": [ - { - "name": "partialResultToken", - "type": { - "kind": "reference", - "name": "ProgressToken" - }, - "optional": true, - "documentation": "An optional token that a server can use to report partial results (e.g. streaming) to\nthe client." - } - ] - }, - { - "name": "LocationLink", - "properties": [ - { - "name": "originSelectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "optional": true, - "documentation": "Span of the origin of this link.\n\nUsed as the underlined span for mouse interaction. Defaults to the word range at\nthe definition position." - }, - { - "name": "targetUri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The target resource identifier of this link." - }, - { - "name": "targetRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The full target range of this link. If the target, for example, is a symbol then target range is the\nrange enclosing this symbol not including leading/trailing whitespace but everything else\nlike comments. This information is typically used to highlight the range in the editor." - }, - { - "name": "targetSelectionRange", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range that should be selected and revealed when this link is being followed, e.g the name of a function.\nMust be contained by the `targetRange`. See also `DocumentSymbol#range`" - } - ], - "documentation": "Represents the connection of two locations. Provides additional metadata over normal {@link Location locations},\nincluding an origin range." - }, - { - "name": "Range", - "properties": [ - { - "name": "start", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The range's start position." - }, - { - "name": "end", - "type": { - "kind": "reference", - "name": "Position" - }, - "documentation": "The range's end position." - } - ], - "documentation": "A range in a text document expressed as (zero-based) start and end positions.\n\nIf you want to specify a range that contains a line including the line ending\ncharacter(s) then use an end position denoting the start of the next line.\nFor example:\n```ts\n{\n start: { line: 5, character: 23 }\n end : { line 6, character : 0 }\n}\n```" - }, - { - "name": "ImplementationOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "StaticRegistrationOptions", - "properties": [ - { - "name": "id", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The id used to register the request. The id can be used to deregister\nthe request again. See also Registration#id." - } - ], - "documentation": "Static registration options to be returned in the initialize\nrequest." - }, - { - "name": "TypeDefinitionOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "WorkspaceFoldersChangeEvent", - "properties": [ - { - "name": "added", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - "documentation": "The array of added workspace folders" - }, - { - "name": "removed", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - "documentation": "The array of the removed workspace folders" - } - ], - "documentation": "The workspace folder change event." - }, - { - "name": "ConfigurationItem", - "properties": [ - { - "name": "scopeUri", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The scope to get the configuration section for." - }, - { - "name": "section", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The configuration section asked for." - } - ] - }, - { - "name": "TextDocumentIdentifier", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The text document's uri." - } - ], - "documentation": "A literal to identify a text document in the client." - }, - { - "name": "Color", - "properties": [ - { - "name": "red", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The red component of this color in the range [0-1]." - }, - { - "name": "green", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The green component of this color in the range [0-1]." - }, - { - "name": "blue", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The blue component of this color in the range [0-1]." - }, - { - "name": "alpha", - "type": { - "kind": "base", - "name": "decimal" - }, - "documentation": "The alpha component of this color in the range [0-1]." - } - ], - "documentation": "Represents a color in RGBA space." - }, - { - "name": "DocumentColorOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "FoldingRangeOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "DeclarationOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "Position", - "properties": [ - { - "name": "line", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "Line position in a document (zero-based).\n\nIf a line number is greater than the number of lines in a document, it defaults back to the number of lines in the document.\nIf a line number is negative, it defaults to 0." - }, - { - "name": "character", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "Character offset on a line in a document (zero-based).\n\nThe meaning of this offset is determined by the negotiated\n`PositionEncodingKind`.\n\nIf the character value is greater than the line length it defaults back to the\nline length." - } - ], - "documentation": "Position in a text document expressed as zero-based line and character\noffset. Prior to 3.17 the offsets were always based on a UTF-16 string\nrepresentation. So a string of the form `a𐐀b` the character offset of the\ncharacter `a` is 0, the character offset of `𐐀` is 1 and the character\noffset of b is 3 since `𐐀` is represented using two code units in UTF-16.\nSince 3.17 clients and servers can agree on a different string encoding\nrepresentation (e.g. UTF-8). The client announces it's supported encoding\nvia the client capability [`general.positionEncodings`](#clientCapabilities).\nThe value is an array of position encodings the client supports, with\ndecreasing preference (e.g. the encoding at index `0` is the most preferred\none). To stay backwards compatible the only mandatory encoding is UTF-16\nrepresented via the string `utf-16`. The server can pick one of the\nencodings offered by the client and signals that encoding back to the\nclient via the initialize result's property\n[`capabilities.positionEncoding`](#serverCapabilities). If the string value\n`utf-16` is missing from the client's capability `general.positionEncodings`\nservers can safely assume that the client supports UTF-16. If the server\nomits the position encoding in its initialize result the encoding defaults\nto the string value `utf-16`. Implementation considerations: since the\nconversion from one encoding into another requires the content of the\nfile / line the conversion is best done where the file is read which is\nusually on the server side.\n\nPositions are line end character agnostic. So you can not specify a position\nthat denotes `\\r|\\n` or `\\n|` where `|` represents the character offset.\n\n@since 3.17.0 - support for negotiated position encoding.", - "since": "3.17.0 - support for negotiated position encoding." - }, - { - "name": "SelectionRangeOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "CallHierarchyOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Call hierarchy options used during static registration.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensOptions", - "properties": [ - { - "name": "legend", - "type": { - "kind": "reference", - "name": "SemanticTokensLegend" - }, - "documentation": "The legend used by the server" - }, - { - "name": "range", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [] - } - } - ] - }, - "optional": true, - "documentation": "Server supports providing semantic tokens for a specific range\nof a document." - }, - { - "name": "full", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "delta", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server supports deltas for full documents." - } - ] - } - } - ] - }, - "optional": true, - "documentation": "Server supports providing semantic tokens for a full document." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensEdit", - "properties": [ - { - "name": "start", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The start offset of the edit." - }, - { - "name": "deleteCount", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The count of elements to remove." - }, - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "uinteger" - } - }, - "optional": true, - "documentation": "The elements to insert." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "FileCreate", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the location of the file/folder being created." - } - ], - "documentation": "Represents information on a file/folder create.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "TextDocumentEdit", - "properties": [ - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "OptionalVersionedTextDocumentIdentifier" - }, - "documentation": "The text document to change." - }, - { - "name": "edits", - "type": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextEdit" - }, - { - "kind": "reference", - "name": "AnnotatedTextEdit" - } - ] - } - }, - "documentation": "The edits to be applied.\n\n@since 3.16.0 - support for AnnotatedTextEdit. This is guarded using a\nclient capability.", - "since": "3.16.0 - support for AnnotatedTextEdit. This is guarded using a\nclient capability." - } - ], - "documentation": "Describes textual changes on a text document. A TextDocumentEdit describes all changes\non a document version Si and after they are applied move the document to version Si+1.\nSo the creator of a TextDocumentEdit doesn't need to sort the array of edits or do any\nkind of ordering. However the edits must be non overlapping." - }, - { - "name": "CreateFile", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "create" - }, - "documentation": "A create" - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The resource to create." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "CreateFileOptions" - }, - "optional": true, - "documentation": "Additional options" - } - ], - "extends": [ - { - "kind": "reference", - "name": "ResourceOperation" - } - ], - "documentation": "Create file operation." - }, - { - "name": "RenameFile", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "rename" - }, - "documentation": "A rename" - }, - { - "name": "oldUri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The old (existing) location." - }, - { - "name": "newUri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The new location." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "RenameFileOptions" - }, - "optional": true, - "documentation": "Rename options." - } - ], - "extends": [ - { - "kind": "reference", - "name": "ResourceOperation" - } - ], - "documentation": "Rename file operation" - }, - { - "name": "DeleteFile", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "delete" - }, - "documentation": "A delete" - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The file to delete." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "DeleteFileOptions" - }, - "optional": true, - "documentation": "Delete options." - } - ], - "extends": [ - { - "kind": "reference", - "name": "ResourceOperation" - } - ], - "documentation": "Delete file operation" - }, - { - "name": "ChangeAnnotation", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A human-readable string describing the actual change. The string\nis rendered prominent in the user interface." - }, - { - "name": "needsConfirmation", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "A flag which indicates that user confirmation is needed\nbefore applying the change." - }, - { - "name": "description", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string which is rendered less prominent in\nthe user interface." - } - ], - "documentation": "Additional information that describes document changes.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileOperationFilter", - "properties": [ - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri scheme like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "reference", - "name": "FileOperationPattern" - }, - "documentation": "The actual file operation pattern." - } - ], - "documentation": "A filter to describe in which file operation requests or notifications\nthe server is interested in receiving.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileRename", - "properties": [ - { - "name": "oldUri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the original location of the file/folder being renamed." - }, - { - "name": "newUri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the new location of the file/folder being renamed." - } - ], - "documentation": "Represents information on a file/folder rename.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileDelete", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A file:// URI for the location of the file/folder being deleted." - } - ], - "documentation": "Represents information on a file/folder delete.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ] - }, - { - "name": "TypeHierarchyOptions", - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "properties": [], - "documentation": "Type hierarchy options used during static registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueContext", - "properties": [ - { - "name": "frameId", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The stack frame (as a DAP Id) where the execution has stopped." - }, - { - "name": "stoppedLocation", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range where execution has stopped.\nTypically the end position of the range denotes the line where the inline values are shown." - } - ], - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueText", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which the inline value applies." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The text of the inline value." - } - ], - "documentation": "Provide inline value as text.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueVariableLookup", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which the inline value applies.\nThe range is used to extract the variable name from the underlying document." - }, - { - "name": "variableName", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "If specified the name of the variable to look up." - }, - { - "name": "caseSensitiveLookup", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "How to perform the lookup." - } - ], - "documentation": "Provide inline value through a variable lookup.\nIf only a range is specified, the variable name will be extracted from the underlying document.\nAn optional variable name can be used to override the extracted name.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueEvaluatableExpression", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The document range for which the inline value applies.\nThe range is used to extract the evaluatable expression from the underlying document." - }, - { - "name": "expression", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "If specified the expression overrides the extracted expression." - } - ], - "documentation": "Provide an inline value through an expression evaluation.\nIf only a range is specified, the expression will be extracted from the underlying document.\nAn optional expression can be used to override the extracted expression.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueOptions", - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "properties": [], - "documentation": "Inline value options used during static registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintLabelPart", - "properties": [ - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The value of this label part." - }, - { - "name": "tooltip", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The tooltip text when you hover over this label part. Depending on\nthe client capability `inlayHint.resolveSupport` clients might resolve\nthis property late using the resolve request." - }, - { - "name": "location", - "type": { - "kind": "reference", - "name": "Location" - }, - "optional": true, - "documentation": "An optional source code location that represents this\nlabel part.\n\nThe editor will use this location for the hover and for code navigation\nfeatures: This part will become a clickable link that resolves to the\ndefinition of the symbol at the given location (not necessarily the\nlocation itself), it shows the hover that shows at the given location,\nand it shows a context menu with further code navigation commands.\n\nDepending on the client capability `inlayHint.resolveSupport` clients\nmight resolve this property late using the resolve request." - }, - { - "name": "command", - "type": { - "kind": "reference", - "name": "Command" - }, - "optional": true, - "documentation": "An optional command for this label part.\n\nDepending on the client capability `inlayHint.resolveSupport` clients\nmight resolve this property late using the resolve request." - } - ], - "documentation": "An inlay hint label part allows for interactive and composite labels\nof inlay hints.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "MarkupContent", - "properties": [ - { - "name": "kind", - "type": { - "kind": "reference", - "name": "MarkupKind" - }, - "documentation": "The type of the Markup" - }, - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The content itself" - } - ], - "documentation": "A `MarkupContent` literal represents a string value which content is interpreted base on its\nkind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.\n\nIf the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.\nSee https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting\n\nHere is an example how such a string can be constructed using JavaScript / TypeScript:\n```ts\nlet markdown: MarkdownContent = {\n kind: MarkupKind.Markdown,\n value: [\n '# Header',\n 'Some text',\n '```typescript',\n 'someCode();',\n '```'\n ].join('\\n')\n};\n```\n\n*Please Note* that clients might sanitize the return markdown. A client could decide to\nremove HTML from the markdown to avoid script execution." - }, - { - "name": "InlayHintOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for an inlay hint item." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Inlay hint options used during static registration.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "RelatedFullDocumentDiagnosticReport", - "properties": [ - { - "name": "relatedDocuments", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ] - } - }, - "optional": true, - "documentation": "Diagnostics of related documents. This information is useful\nin programming languages where code in a file A can generate\ndiagnostics in a file B which A depends on. An example of\nsuch a language is C/C++ where marco definitions in a file\na.cpp and result in errors in a header file b.hpp.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "extends": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - } - ], - "documentation": "A full diagnostic report with a set of related documents.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "RelatedUnchangedDocumentDiagnosticReport", - "properties": [ - { - "name": "relatedDocuments", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "DocumentUri" - }, - "value": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ] - } - }, - "optional": true, - "documentation": "Diagnostics of related documents. This information is useful\nin programming languages where code in a file A can generate\ndiagnostics in a file B which A depends on. An example of\nsuch a language is C/C++ where marco definitions in a file\na.cpp and result in errors in a header file b.hpp.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "extends": [ - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ], - "documentation": "An unchanged diagnostic report with a set of related documents.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FullDocumentDiagnosticReport", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "full" - }, - "documentation": "A full document diagnostic report." - }, - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional result id. If provided it will\nbe sent on the next diagnostic request for the\nsame document." - }, - { - "name": "items", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "documentation": "The actual items." - } - ], - "documentation": "A diagnostic report with a full set of problems.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "UnchangedDocumentDiagnosticReport", - "properties": [ - { - "name": "kind", - "type": { - "kind": "stringLiteral", - "value": "unchanged" - }, - "documentation": "A document diagnostic report indicating\nno changes to the last result. A server can\nonly return `unchanged` if result ids are\nprovided." - }, - { - "name": "resultId", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A result id which will be sent on the next\ndiagnostic request for the same document." - } - ], - "documentation": "A diagnostic report indicating that the last returned\nreport is still accurate.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticOptions", - "properties": [ - { - "name": "identifier", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional identifier under which the diagnostics are\nmanaged by the client." - }, - { - "name": "interFileDependencies", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Whether the language has inter file dependencies meaning that\nediting code in one file can result in a different diagnostic\nset in another file. Inter file dependencies are common for\nmost programming languages and typically uncommon for linters." - }, - { - "name": "workspaceDiagnostics", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "The server provides support for workspace diagnostics as well." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Diagnostic options.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "PreviousResultId", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which the client knowns a\nresult id." - }, - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The value of the previous result id." - } - ], - "documentation": "A previous result id in a workspace pull request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocument", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The notebook document's uri." - }, - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The type of the notebook." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this document (it will increase after each\nchange, including undo/redo)." - }, - { - "name": "metadata", - "type": { - "kind": "reference", - "name": "LSPObject" - }, - "optional": true, - "documentation": "Additional metadata stored with the notebook\ndocument.\n\nNote: should always be an object literal (e.g. LSPObject)" - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "NotebookCell" - } - }, - "documentation": "The cells of a notebook." - } - ], - "documentation": "A notebook document.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentItem", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The text document's uri." - }, - { - "name": "languageId", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The text document's language identifier." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this document (it will increase after each\nchange, including undo/redo)." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The content of the opened text document." - } - ], - "documentation": "An item to transfer a text document from the client to the\nserver." - }, - { - "name": "VersionedNotebookDocumentIdentifier", - "properties": [ - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this notebook document." - }, - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The notebook document's uri." - } - ], - "documentation": "A versioned notebook document identifier.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentChangeEvent", - "properties": [ - { - "name": "metadata", - "type": { - "kind": "reference", - "name": "LSPObject" - }, - "optional": true, - "documentation": "The changed meta data if any.\n\nNote: should always be an object literal (e.g. LSPObject)" - }, - { - "name": "cells", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "structure", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "array", - "type": { - "kind": "reference", - "name": "NotebookCellArrayChange" - }, - "documentation": "The change to the cell array." - }, - { - "name": "didOpen", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentItem" - } - }, - "optional": true, - "documentation": "Additional opened cell text documents." - }, - { - "name": "didClose", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - }, - "optional": true, - "documentation": "Additional closed cell text documents." - } - ] - } - }, - "optional": true, - "documentation": "Changes to the cell structure to add or\nremove cells." - }, - { - "name": "data", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "NotebookCell" - } - }, - "optional": true, - "documentation": "Changes to notebook cells properties like its\nkind, execution summary or metadata." - }, - { - "name": "textContent", - "type": { - "kind": "array", - "element": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "document", - "type": { - "kind": "reference", - "name": "VersionedTextDocumentIdentifier" - } - }, - { - "name": "changes", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TextDocumentContentChangeEvent" - } - } - } - ] - } - } - }, - "optional": true, - "documentation": "Changes to the text content of notebook cells." - } - ] - } - }, - "optional": true, - "documentation": "Changes to cells" - } - ], - "documentation": "A change event for a notebook document.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentIdentifier", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "The notebook document's uri." - } - ], - "documentation": "A literal to identify a notebook document in the client.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "Registration", - "properties": [ - { - "name": "id", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The id used to register the request. The id can be used to deregister\nthe request again." - }, - { - "name": "method", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The method / capability to register for." - }, - { - "name": "registerOptions", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "Options necessary for the registration." - } - ], - "documentation": "General parameters to to register for an notification or to register a provider." - }, - { - "name": "Unregistration", - "properties": [ - { - "name": "id", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The id used to unregister the request or notification. Usually an id\nprovided during the register request." - }, - { - "name": "method", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The method to unregister for." - } - ], - "documentation": "General parameters to unregister a request or notification." - }, - { - "name": "_InitializeParams", - "properties": [ - { - "name": "processId", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The process Id of the parent process that started\nthe server.\n\nIs `null` if the process has not been started by another process.\nIf the parent process is not alive then the server should exit." - }, - { - "name": "clientInfo", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the client as defined by the client." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The client's version as defined by the client." - } - ] - } - }, - "optional": true, - "documentation": "Information about the client\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "locale", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The locale the client is currently showing the user interface\nin. This must not necessarily be the locale of the operating\nsystem.\n\nUses IETF language tags as the value's syntax\n(See https://en.wikipedia.org/wiki/IETF_language_tag)\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "rootPath", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "optional": true, - "documentation": "The rootPath of the workspace. Is null\nif no folder is open.\n\n@deprecated in favour of rootUri.", - "deprecated": "in favour of rootUri." - }, - { - "name": "rootUri", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "DocumentUri" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The rootUri of the workspace. Is null if no\nfolder is open. If both `rootPath` and `rootUri` are set\n`rootUri` wins.\n\n@deprecated in favour of workspaceFolders.", - "deprecated": "in favour of workspaceFolders." - }, - { - "name": "capabilities", - "type": { - "kind": "reference", - "name": "ClientCapabilities" - }, - "documentation": "The capabilities provided by the client (editor or tool)" - }, - { - "name": "initializationOptions", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "User provided initialization options." - }, - { - "name": "trace", - "type": { - "kind": "reference", - "name": "TraceValues" - }, - "optional": true, - "documentation": "The initial trace setting. If omitted trace is disabled ('off')." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressParams" - } - ], - "documentation": "The initialize parameters" - }, - { - "name": "WorkspaceFoldersInitializeParams", - "properties": [ - { - "name": "workspaceFolders", - "type": { - "kind": "or", - "items": [ - { - "kind": "array", - "element": { - "kind": "reference", - "name": "WorkspaceFolder" - } - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "optional": true, - "documentation": "The workspace folders configured in the client when the server starts.\n\nThis property is only available if the client supports workspace folders.\nIt can be `null` if the client supports workspace folders but none are\nconfigured.\n\n@since 3.6.0", - "since": "3.6.0" - } - ] - }, - { - "name": "ServerCapabilities", - "properties": [ - { - "name": "positionEncoding", - "type": { - "kind": "reference", - "name": "PositionEncodingKind" - }, - "optional": true, - "documentation": "The position encoding the server picked from the encodings offered\nby the client via the client capability `general.positionEncodings`.\n\nIf the client didn't provide any position encodings the only valid\nvalue that a server can return is 'utf-16'.\n\nIf omitted it defaults to 'utf-16'.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "textDocumentSync", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextDocumentSyncOptions" - }, - { - "kind": "reference", - "name": "TextDocumentSyncKind" - } - ] - }, - "optional": true, - "documentation": "Defines how text documents are synced. Is either a detailed structure\ndefining each notification or for backwards compatibility the\nTextDocumentSyncKind number." - }, - { - "name": "notebookDocumentSync", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "NotebookDocumentSyncOptions" - }, - { - "kind": "reference", - "name": "NotebookDocumentSyncRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "Defines how notebook documents are synced.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "completionProvider", - "type": { - "kind": "reference", - "name": "CompletionOptions" - }, - "optional": true, - "documentation": "The server provides completion support." - }, - { - "name": "hoverProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "HoverOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides hover support." - }, - { - "name": "signatureHelpProvider", - "type": { - "kind": "reference", - "name": "SignatureHelpOptions" - }, - "optional": true, - "documentation": "The server provides signature help support." - }, - { - "name": "declarationProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DeclarationOptions" - }, - { - "kind": "reference", - "name": "DeclarationRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides Goto Declaration support." - }, - { - "name": "definitionProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DefinitionOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides goto definition support." - }, - { - "name": "typeDefinitionProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "TypeDefinitionOptions" - }, - { - "kind": "reference", - "name": "TypeDefinitionRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides Goto Type Definition support." - }, - { - "name": "implementationProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "ImplementationOptions" - }, - { - "kind": "reference", - "name": "ImplementationRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides Goto Implementation support." - }, - { - "name": "referencesProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "ReferenceOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides find references support." - }, - { - "name": "documentHighlightProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentHighlightOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document highlight support." - }, - { - "name": "documentSymbolProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentSymbolOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document symbol support." - }, - { - "name": "codeActionProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "CodeActionOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides code actions. CodeActionOptions may only be\nspecified if the client states that it supports\n`codeActionLiteralSupport` in its initial `initialize` request." - }, - { - "name": "codeLensProvider", - "type": { - "kind": "reference", - "name": "CodeLensOptions" - }, - "optional": true, - "documentation": "The server provides code lens." - }, - { - "name": "documentLinkProvider", - "type": { - "kind": "reference", - "name": "DocumentLinkOptions" - }, - "optional": true, - "documentation": "The server provides document link support." - }, - { - "name": "colorProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentColorOptions" - }, - { - "kind": "reference", - "name": "DocumentColorRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides color provider support." - }, - { - "name": "workspaceSymbolProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "WorkspaceSymbolOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides workspace symbol support." - }, - { - "name": "documentFormattingProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentFormattingOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document formatting." - }, - { - "name": "documentRangeFormattingProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "DocumentRangeFormattingOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides document range formatting." - }, - { - "name": "documentOnTypeFormattingProvider", - "type": { - "kind": "reference", - "name": "DocumentOnTypeFormattingOptions" - }, - "optional": true, - "documentation": "The server provides document formatting on typing." - }, - { - "name": "renameProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "RenameOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides rename support. RenameOptions may only be\nspecified if the client states that it supports\n`prepareSupport` in its initial `initialize` request." - }, - { - "name": "foldingRangeProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "FoldingRangeOptions" - }, - { - "kind": "reference", - "name": "FoldingRangeRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides folding provider support." - }, - { - "name": "selectionRangeProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "SelectionRangeOptions" - }, - { - "kind": "reference", - "name": "SelectionRangeRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides selection range support." - }, - { - "name": "executeCommandProvider", - "type": { - "kind": "reference", - "name": "ExecuteCommandOptions" - }, - "optional": true, - "documentation": "The server provides execute command support." - }, - { - "name": "callHierarchyProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "CallHierarchyOptions" - }, - { - "kind": "reference", - "name": "CallHierarchyRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides call hierarchy support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "linkedEditingRangeProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "LinkedEditingRangeOptions" - }, - { - "kind": "reference", - "name": "LinkedEditingRangeRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides linked editing range support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "semanticTokensProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "SemanticTokensOptions" - }, - { - "kind": "reference", - "name": "SemanticTokensRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides semantic tokens support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "monikerProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "MonikerOptions" - }, - { - "kind": "reference", - "name": "MonikerRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides moniker support.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "typeHierarchyProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "TypeHierarchyOptions" - }, - { - "kind": "reference", - "name": "TypeHierarchyRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides type hierarchy support.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlineValueProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "InlineValueOptions" - }, - { - "kind": "reference", - "name": "InlineValueRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides inline values.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlayHintProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "InlayHintOptions" - }, - { - "kind": "reference", - "name": "InlayHintRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server provides inlay hints.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "diagnosticProvider", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "DiagnosticOptions" - }, - { - "kind": "reference", - "name": "DiagnosticRegistrationOptions" - } - ] - }, - "optional": true, - "documentation": "The server has support for pull model diagnostics.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "workspace", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "workspaceFolders", - "type": { - "kind": "reference", - "name": "WorkspaceFoldersServerCapabilities" - }, - "optional": true, - "documentation": "The server supports workspace folder.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "fileOperations", - "type": { - "kind": "reference", - "name": "FileOperationOptions" - }, - "optional": true, - "documentation": "The server is interested in notifications/requests for operations on files.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - } - }, - "optional": true, - "documentation": "Workspace specific server capabilities." - }, - { - "name": "experimental", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "Experimental server capabilities." - } - ], - "documentation": "Defines the capabilities provided by a language\nserver." - }, - { - "name": "VersionedTextDocumentIdentifier", - "properties": [ - { - "name": "version", - "type": { - "kind": "base", - "name": "integer" - }, - "documentation": "The version number of this document." - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - ], - "documentation": "A text document identifier to denote a specific version of a text document." - }, - { - "name": "SaveOptions", - "properties": [ - { - "name": "includeText", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client is supposed to include the content on save." - } - ], - "documentation": "Save options." - }, - { - "name": "FileEvent", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The file's uri." - }, - { - "name": "type", - "type": { - "kind": "reference", - "name": "FileChangeType" - }, - "documentation": "The change type." - } - ], - "documentation": "An event describing a file change." - }, - { - "name": "FileSystemWatcher", - "properties": [ - { - "name": "globPattern", - "type": { - "kind": "reference", - "name": "GlobPattern" - }, - "documentation": "The glob pattern to watch. See {@link GlobPattern glob pattern} for more detail.\n\n@since 3.17.0 support for relative patterns.", - "since": "3.17.0 support for relative patterns." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "WatchKind" - }, - "optional": true, - "documentation": "The kind of events of interest. If omitted it defaults\nto WatchKind.Create | WatchKind.Change | WatchKind.Delete\nwhich is 7." - } - ] - }, - { - "name": "Diagnostic", - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range at which the message applies" - }, - { - "name": "severity", - "type": { - "kind": "reference", - "name": "DiagnosticSeverity" - }, - "optional": true, - "documentation": "The diagnostic's severity. Can be omitted. If omitted it is up to the\nclient to interpret diagnostics as error, warning, info or hint." - }, - { - "name": "code", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "string" - } - ] - }, - "optional": true, - "documentation": "The diagnostic's code, which usually appear in the user interface." - }, - { - "name": "codeDescription", - "type": { - "kind": "reference", - "name": "CodeDescription" - }, - "optional": true, - "documentation": "An optional property to describe the error code.\nRequires the code field (above) to be present/not null.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "source", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string describing the source of this\ndiagnostic, e.g. 'typescript' or 'super lint'. It usually\nappears in the user interface." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The diagnostic's message. It usually appears in the user interface" - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DiagnosticTag" - } - }, - "optional": true, - "documentation": "Additional metadata about the diagnostic.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "relatedInformation", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DiagnosticRelatedInformation" - } - }, - "optional": true, - "documentation": "An array of related diagnostic information, e.g. when symbol-names within\na scope collide all definitions can be marked via this property." - }, - { - "name": "data", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "A data entry field that is preserved between a `textDocument/publishDiagnostics`\nnotification and `textDocument/codeAction` request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "Represents a diagnostic, such as a compiler error or warning. Diagnostic objects\nare only valid in the scope of a resource." - }, - { - "name": "CompletionContext", - "properties": [ - { - "name": "triggerKind", - "type": { - "kind": "reference", - "name": "CompletionTriggerKind" - }, - "documentation": "How the completion was triggered." - }, - { - "name": "triggerCharacter", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The trigger character (a single character) that has trigger code complete.\nIs undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`" - } - ], - "documentation": "Contains additional information about the context in which a completion request is triggered." - }, - { - "name": "CompletionItemLabelDetails", - "properties": [ - { - "name": "detail", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional string which is rendered less prominently directly after {@link CompletionItem.label label},\nwithout any spacing. Should be used for function signatures and type annotations." - }, - { - "name": "description", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "An optional string which is rendered less prominently after {@link CompletionItem.detail}. Should be used\nfor fully qualified names and file paths." - } - ], - "documentation": "Additional details for a completion item label.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InsertReplaceEdit", - "properties": [ - { - "name": "newText", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The string to be inserted." - }, - { - "name": "insert", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range if the insert is requested" - }, - { - "name": "replace", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range if the replace is requested." - } - ], - "documentation": "A special text edit to provide an insert and a replace operation.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CompletionOptions", - "properties": [ - { - "name": "triggerCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "Most tools trigger completion request automatically without explicitly requesting\nit using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user\nstarts to type an identifier. For example, if the user types `c` in a JavaScript file\ncode complete will automatically pop up present `console` besides others as a\ncompletion item. Characters that make up identifiers don't need to be listed here.\n\nIf code complete should automatically be trigger on characters not being valid inside\nan identifier (for example, `.` in JavaScript) list them in `triggerCharacters`." - }, - { - "name": "allCommitCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "The list of all possible characters that commit a completion. This field can be used\nif clients don't support individual commit characters per completion item. See\n`ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`\n\nIf a server provides both `allCommitCharacters` and commit characters on an individual\ncompletion item the ones on the completion item win.\n\n@since 3.2.0", - "since": "3.2.0" - }, - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for a completion item." - }, - { - "name": "completionItem", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "labelDetailsSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server has support for completion item label\ndetails (see also `CompletionItemLabelDetails`) when\nreceiving a completion item in a resolve call.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "The server supports the following `CompletionItem` specific\ncapabilities.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Completion options." - }, - { - "name": "HoverOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Hover options." - }, - { - "name": "SignatureHelpContext", - "properties": [ - { - "name": "triggerKind", - "type": { - "kind": "reference", - "name": "SignatureHelpTriggerKind" - }, - "documentation": "Action that caused signature help to be triggered." - }, - { - "name": "triggerCharacter", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "Character that caused signature help to be triggered.\n\nThis is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`" - }, - { - "name": "isRetrigger", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "`true` if signature help was already showing when it was triggered.\n\nRetriggers occurs when the signature help is already active and can be caused by actions such as\ntyping a trigger character, a cursor move, or document content changes." - }, - { - "name": "activeSignatureHelp", - "type": { - "kind": "reference", - "name": "SignatureHelp" - }, - "optional": true, - "documentation": "The currently active `SignatureHelp`.\n\nThe `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on\nthe user navigating through available signatures." - } - ], - "documentation": "Additional information about the context in which a signature help request was triggered.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "SignatureInformation", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The label of this signature. Will be shown in\nthe UI." - }, - { - "name": "documentation", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The human-readable doc-comment of this signature. Will be shown\nin the UI but can be omitted." - }, - { - "name": "parameters", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ParameterInformation" - } - }, - "optional": true, - "documentation": "The parameters of this signature." - }, - { - "name": "activeParameter", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The index of the active parameter.\n\nIf provided, this is used in place of `SignatureHelp.activeParameter`.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "Represents the signature of something callable. A signature\ncan have a label, like a function-name, a doc-comment, and\na set of parameters." - }, - { - "name": "SignatureHelpOptions", - "properties": [ - { - "name": "triggerCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "List of characters that trigger signature help automatically." - }, - { - "name": "retriggerCharacters", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "List of characters that re-trigger signature help.\n\nThese trigger characters are only active when signature help is already showing. All trigger characters\nare also counted as re-trigger characters.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Server Capabilities for a {@link SignatureHelpRequest}." - }, - { - "name": "DefinitionOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Server Capabilities for a {@link DefinitionRequest}." - }, - { - "name": "ReferenceContext", - "properties": [ - { - "name": "includeDeclaration", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Include the declaration of the current symbol." - } - ], - "documentation": "Value-object that contains additional information when\nrequesting references." - }, - { - "name": "ReferenceOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Reference options." - }, - { - "name": "DocumentHighlightOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentHighlightRequest}." - }, - { - "name": "BaseSymbolInformation", - "properties": [ - { - "name": "name", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of this symbol." - }, - { - "name": "kind", - "type": { - "kind": "reference", - "name": "SymbolKind" - }, - "documentation": "The kind of this symbol." - }, - { - "name": "tags", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "optional": true, - "documentation": "Tags for this symbol.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "containerName", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The name of the symbol containing this symbol. This information is for\nuser interface purposes (e.g. to render a qualifier in the user interface\nif necessary). It can't be used to re-infer a hierarchy for the document\nsymbols." - } - ], - "documentation": "A base for all symbol information." - }, - { - "name": "DocumentSymbolOptions", - "properties": [ - { - "name": "label", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A human-readable string that is shown when multiple outlines trees\nare shown for the same document.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentSymbolRequest}." - }, - { - "name": "CodeActionContext", - "properties": [ - { - "name": "diagnostics", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "Diagnostic" - } - }, - "documentation": "An array of diagnostics known on the client side overlapping the range provided to the\n`textDocument/codeAction` request. They are provided so that the server knows which\nerrors are currently presented to the user for the given range. There is no guarantee\nthat these accurately reflect the error state of the resource. The primary parameter\nto compute code actions is the provided range." - }, - { - "name": "only", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeActionKind" - } - }, - "optional": true, - "documentation": "Requested kind of actions to return.\n\nActions not of this kind are filtered out by the client before being shown. So servers\ncan omit computing them." - }, - { - "name": "triggerKind", - "type": { - "kind": "reference", - "name": "CodeActionTriggerKind" - }, - "optional": true, - "documentation": "The reason why code actions were requested.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Contains additional diagnostic information about the context in which\na {@link CodeActionProvider.provideCodeActions code action} is run." - }, - { - "name": "CodeActionOptions", - "properties": [ - { - "name": "codeActionKinds", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeActionKind" - } - }, - "optional": true, - "documentation": "CodeActionKinds that this server may return.\n\nThe list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server\nmay list out every specific kind they provide." - }, - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for a code action.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link CodeActionRequest}." - }, - { - "name": "WorkspaceSymbolOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server provides support to resolve additional\ninformation for a workspace symbol.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Server capabilities for a {@link WorkspaceSymbolRequest}." - }, - { - "name": "CodeLensOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Code lens has a resolve provider as well." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Code Lens provider options of a {@link CodeLensRequest}." - }, - { - "name": "DocumentLinkOptions", - "properties": [ - { - "name": "resolveProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Document links have a resolve provider as well." - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentLinkRequest}." - }, - { - "name": "FormattingOptions", - "properties": [ - { - "name": "tabSize", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "Size of a tab in spaces." - }, - { - "name": "insertSpaces", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "Prefer spaces over tabs." - }, - { - "name": "trimTrailingWhitespace", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Trim trailing whitespace on a line.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "insertFinalNewline", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Insert a newline character at the end of the file if one does not exist.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "trimFinalNewlines", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Trim all newlines after the final newline at the end of the file.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "Value-object describing what options formatting should use." - }, - { - "name": "DocumentFormattingOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingOptions", - "properties": [], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingOptions", - "properties": [ - { - "name": "firstTriggerCharacter", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A character on which formatting should be triggered, like `{`." - }, - { - "name": "moreTriggerCharacter", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "More trigger characters." - } - ], - "documentation": "Provider options for a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "RenameOptions", - "properties": [ - { - "name": "prepareProvider", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Renames should be checked and tested before being executed.\n\n@since version 3.12.0", - "since": "version 3.12.0" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "Provider options for a {@link RenameRequest}." - }, - { - "name": "ExecuteCommandOptions", - "properties": [ - { - "name": "commands", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The commands to be executed on the server" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "WorkDoneProgressOptions" - } - ], - "documentation": "The server capabilities of a {@link ExecuteCommandRequest}." - }, - { - "name": "SemanticTokensLegend", - "properties": [ - { - "name": "tokenTypes", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token types a server uses." - }, - { - "name": "tokenModifiers", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token modifiers a server uses." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "OptionalVersionedTextDocumentIdentifier", - "properties": [ - { - "name": "version", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The version number of this document. If a versioned text document identifier\nis sent from the server to the client and the file is not open in the editor\n(the server has not received an open notification before) the server can send\n`null` to indicate that the version is unknown and the content on disk is the\ntruth (as specified with document content ownership)." - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextDocumentIdentifier" - } - ], - "documentation": "A text document identifier to optionally denote a specific version of a text document." - }, - { - "name": "AnnotatedTextEdit", - "properties": [ - { - "name": "annotationId", - "type": { - "kind": "reference", - "name": "ChangeAnnotationIdentifier" - }, - "documentation": "The actual identifier of the change annotation" - } - ], - "extends": [ - { - "kind": "reference", - "name": "TextEdit" - } - ], - "documentation": "A special text edit with an additional change annotation.\n\n@since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "ResourceOperation", - "properties": [ - { - "name": "kind", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The resource operation kind." - }, - { - "name": "annotationId", - "type": { - "kind": "reference", - "name": "ChangeAnnotationIdentifier" - }, - "optional": true, - "documentation": "An optional annotation identifier describing the operation.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "A generic resource operation." - }, - { - "name": "CreateFileOptions", - "properties": [ - { - "name": "overwrite", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Overwrite existing file. Overwrite wins over `ignoreIfExists`" - }, - { - "name": "ignoreIfExists", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Ignore if exists." - } - ], - "documentation": "Options to create a file." - }, - { - "name": "RenameFileOptions", - "properties": [ - { - "name": "overwrite", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Overwrite target if existing. Overwrite wins over `ignoreIfExists`" - }, - { - "name": "ignoreIfExists", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Ignores if target exists." - } - ], - "documentation": "Rename file options" - }, - { - "name": "DeleteFileOptions", - "properties": [ - { - "name": "recursive", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Delete the content recursively if a folder is denoted." - }, - { - "name": "ignoreIfNotExists", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Ignore the operation if the file doesn't exist." - } - ], - "documentation": "Delete file options" - }, - { - "name": "FileOperationPattern", - "properties": [ - { - "name": "glob", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The glob pattern to match. Glob patterns can have the following syntax:\n- `*` to match one or more characters in a path segment\n- `?` to match on one character in a path segment\n- `**` to match any number of path segments, including none\n- `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)\n- `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)\n- `[!...]` 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`)" - }, - { - "name": "matches", - "type": { - "kind": "reference", - "name": "FileOperationPatternKind" - }, - "optional": true, - "documentation": "Whether to match files or folders with this pattern.\n\nMatches both if undefined." - }, - { - "name": "options", - "type": { - "kind": "reference", - "name": "FileOperationPatternOptions" - }, - "optional": true, - "documentation": "Additional options used during matching." - } - ], - "documentation": "A pattern to describe in which file operation requests or notifications\nthe server is interested in receiving.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "WorkspaceFullDocumentDiagnosticReport", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which diagnostic information is reported." - }, - { - "name": "version", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The version number for which the diagnostics are reported.\nIf the document is not marked as open `null` can be provided." - } - ], - "extends": [ - { - "kind": "reference", - "name": "FullDocumentDiagnosticReport" - } - ], - "documentation": "A full document diagnostic report for a workspace diagnostic result.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceUnchangedDocumentDiagnosticReport", - "properties": [ - { - "name": "uri", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI for which diagnostic information is reported." - }, - { - "name": "version", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The version number for which the diagnostics are reported.\nIf the document is not marked as open `null` can be provided." - } - ], - "extends": [ - { - "kind": "reference", - "name": "UnchangedDocumentDiagnosticReport" - } - ], - "documentation": "An unchanged document diagnostic report for a workspace diagnostic result.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookCell", - "properties": [ - { - "name": "kind", - "type": { - "kind": "reference", - "name": "NotebookCellKind" - }, - "documentation": "The cell's kind" - }, - { - "name": "document", - "type": { - "kind": "base", - "name": "DocumentUri" - }, - "documentation": "The URI of the cell's text document\ncontent." - }, - { - "name": "metadata", - "type": { - "kind": "reference", - "name": "LSPObject" - }, - "optional": true, - "documentation": "Additional metadata stored with the cell.\n\nNote: should always be an object literal (e.g. LSPObject)" - }, - { - "name": "executionSummary", - "type": { - "kind": "reference", - "name": "ExecutionSummary" - }, - "optional": true, - "documentation": "Additional execution summary information\nif supported by the client." - } - ], - "documentation": "A notebook cell.\n\nA cell's document URI must be unique across ALL notebook\ncells and can therefore be used to uniquely identify a\nnotebook cell or the cell's text document.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookCellArrayChange", - "properties": [ - { - "name": "start", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The start oftest of the cell that changed." - }, - { - "name": "deleteCount", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "The deleted cells" - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "NotebookCell" - } - }, - "optional": true, - "documentation": "The new cells, if any" - } - ], - "documentation": "A change describing how to move a `NotebookCell`\narray from state S to S'.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ClientCapabilities", - "properties": [ - { - "name": "workspace", - "type": { - "kind": "reference", - "name": "WorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Workspace specific client capabilities." - }, - { - "name": "textDocument", - "type": { - "kind": "reference", - "name": "TextDocumentClientCapabilities" - }, - "optional": true, - "documentation": "Text document specific client capabilities." - }, - { - "name": "notebookDocument", - "type": { - "kind": "reference", - "name": "NotebookDocumentClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the notebook document support.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "window", - "type": { - "kind": "reference", - "name": "WindowClientCapabilities" - }, - "optional": true, - "documentation": "Window specific client capabilities." - }, - { - "name": "general", - "type": { - "kind": "reference", - "name": "GeneralClientCapabilities" - }, - "optional": true, - "documentation": "General client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "experimental", - "type": { - "kind": "reference", - "name": "LSPAny" - }, - "optional": true, - "documentation": "Experimental client capabilities." - } - ], - "documentation": "Defines the capabilities provided by the client." - }, - { - "name": "TextDocumentSyncOptions", - "properties": [ - { - "name": "openClose", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Open and close notifications are sent to the server. If omitted open close notification should not\nbe sent." - }, - { - "name": "change", - "type": { - "kind": "reference", - "name": "TextDocumentSyncKind" - }, - "optional": true, - "documentation": "Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full\nand TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None." - }, - { - "name": "willSave", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If present will save notifications are sent to the server. If omitted the notification should not be\nsent." - }, - { - "name": "willSaveWaitUntil", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If present will save wait until requests are sent to the server. If omitted the request should not be\nsent." - }, - { - "name": "save", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "reference", - "name": "SaveOptions" - } - ] - }, - "optional": true, - "documentation": "If present save notifications are sent to the server. If omitted the notification should not be\nsent." - } - ] - }, - { - "name": "NotebookDocumentSyncOptions", - "properties": [ - { - "name": "notebookSelector", - "type": { - "kind": "array", - "element": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebook", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "NotebookDocumentFilter" - } - ] - }, - "documentation": "The notebook to be synced If a string\nvalue is provided it matches against the\nnotebook type. '*' matches every notebook." - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - } - }, - "optional": true, - "documentation": "The cells of the matching notebook to be synced." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebook", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "NotebookDocumentFilter" - } - ] - }, - "optional": true, - "documentation": "The notebook to be synced If a string\nvalue is provided it matches against the\nnotebook type. '*' matches every notebook." - }, - { - "name": "cells", - "type": { - "kind": "array", - "element": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - } - }, - "documentation": "The cells of the matching notebook to be synced." - } - ] - } - } - ] - } - }, - "documentation": "The notebooks to be synced" - }, - { - "name": "save", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether save notification should be forwarded to\nthe server. Will only be honored if mode === `notebook`." - } - ], - "documentation": "Options specific to a notebook plus its cells\nto be synced to the server.\n\nIf a selector provides a notebook document\nfilter but no cell selector all cells of a\nmatching notebook document will be synced.\n\nIf a selector provides no notebook document\nfilter but only a cell selector all notebook\ndocument that contain at least one matching\ncell will be synced.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentSyncRegistrationOptions", - "properties": [], - "extends": [ - { - "kind": "reference", - "name": "NotebookDocumentSyncOptions" - } - ], - "mixins": [ - { - "kind": "reference", - "name": "StaticRegistrationOptions" - } - ], - "documentation": "Registration options specific to a notebook.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceFoldersServerCapabilities", - "properties": [ - { - "name": "supported", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The server has support for workspace folders" - }, - { - "name": "changeNotifications", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "base", - "name": "boolean" - } - ] - }, - "optional": true, - "documentation": "Whether the server wants to receive workspace folder\nchange notifications.\n\nIf a string is provided the string is treated as an ID\nunder which the notification is registered on the client\nside. The ID can be used to unregister for these events\nusing the `client/unregisterCapability` request." - } - ] - }, - { - "name": "FileOperationOptions", - "properties": [ - { - "name": "didCreate", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving didCreateFiles notifications." - }, - { - "name": "willCreate", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving willCreateFiles requests." - }, - { - "name": "didRename", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving didRenameFiles notifications." - }, - { - "name": "willRename", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving willRenameFiles requests." - }, - { - "name": "didDelete", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving didDeleteFiles file notifications." - }, - { - "name": "willDelete", - "type": { - "kind": "reference", - "name": "FileOperationRegistrationOptions" - }, - "optional": true, - "documentation": "The server is interested in receiving willDeleteFiles file requests." - } - ], - "documentation": "Options for notifications/requests for user operations on files.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CodeDescription", - "properties": [ - { - "name": "href", - "type": { - "kind": "base", - "name": "URI" - }, - "documentation": "An URI to open with more information about the diagnostic error." - } - ], - "documentation": "Structure to capture a description for an error code.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DiagnosticRelatedInformation", - "properties": [ - { - "name": "location", - "type": { - "kind": "reference", - "name": "Location" - }, - "documentation": "The location of this related diagnostic information." - }, - { - "name": "message", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The message of this related diagnostic information." - } - ], - "documentation": "Represents a related message and source code location for a diagnostic. This should be\nused to point to code locations that cause or related to a diagnostics, e.g when duplicating\na symbol in a scope." - }, - { - "name": "ParameterInformation", - "properties": [ - { - "name": "label", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "tuple", - "items": [ - { - "kind": "base", - "name": "uinteger" - }, - { - "kind": "base", - "name": "uinteger" - } - ] - } - ] - }, - "documentation": "The label of this parameter information.\n\nEither a string or an inclusive start and exclusive end offsets within its containing\nsignature label. (see SignatureInformation.label). The offsets are based on a UTF-16\nstring representation as `Position` and `Range` does.\n\n*Note*: a label of type string should be a substring of its containing signature label.\nIts intended use case is to highlight the parameter label part in the `SignatureInformation.label`." - }, - { - "name": "documentation", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "MarkupContent" - } - ] - }, - "optional": true, - "documentation": "The human-readable doc-comment of this parameter. Will be shown\nin the UI but can be omitted." - } - ], - "documentation": "Represents a parameter of a callable-signature. A parameter can\nhave a label and a doc-comment." - }, - { - "name": "NotebookCellTextDocumentFilter", - "properties": [ - { - "name": "notebook", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "reference", - "name": "NotebookDocumentFilter" - } - ] - }, - "documentation": "A filter that matches against the notebook\ncontaining the notebook cell. If a string\nvalue is provided it matches against the\nnotebook type. '*' matches every notebook." - }, - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A language id like `python`.\n\nWill be matched against the language id of the\nnotebook cell document. '*' matches every language." - } - ], - "documentation": "A notebook cell text document filter denotes a cell text\ndocument by different properties.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FileOperationPatternOptions", - "properties": [ - { - "name": "ignoreCase", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The pattern should be matched ignoring casing." - } - ], - "documentation": "Matching options for the file operation pattern.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "ExecutionSummary", - "properties": [ - { - "name": "executionOrder", - "type": { - "kind": "base", - "name": "uinteger" - }, - "documentation": "A strict monotonically increasing value\nindicating the execution order of a cell\ninside a notebook." - }, - { - "name": "success", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the execution was successful or\nnot if known by the client." - } - ] - }, - { - "name": "WorkspaceClientCapabilities", - "properties": [ - { - "name": "applyEdit", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports applying batch edits\nto the workspace by supporting the request\n'workspace/applyEdit'" - }, - { - "name": "workspaceEdit", - "type": { - "kind": "reference", - "name": "WorkspaceEditClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to `WorkspaceEdit`s." - }, - { - "name": "didChangeConfiguration", - "type": { - "kind": "reference", - "name": "DidChangeConfigurationClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/didChangeConfiguration` notification." - }, - { - "name": "didChangeWatchedFiles", - "type": { - "kind": "reference", - "name": "DidChangeWatchedFilesClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/didChangeWatchedFiles` notification." - }, - { - "name": "symbol", - "type": { - "kind": "reference", - "name": "WorkspaceSymbolClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/symbol` request." - }, - { - "name": "executeCommand", - "type": { - "kind": "reference", - "name": "ExecuteCommandClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `workspace/executeCommand` request." - }, - { - "name": "workspaceFolders", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for workspace folders.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "configuration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports `workspace/configuration` requests.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "semanticTokens", - "type": { - "kind": "reference", - "name": "SemanticTokensWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the semantic token requests scoped to the\nworkspace.\n\n@since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "codeLens", - "type": { - "kind": "reference", - "name": "CodeLensWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the code lens requests scoped to the\nworkspace.\n\n@since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "fileOperations", - "type": { - "kind": "reference", - "name": "FileOperationClientCapabilities" - }, - "optional": true, - "documentation": "The client has support for file notifications/requests for user operations on files.\n\nSince 3.16.0" - }, - { - "name": "inlineValue", - "type": { - "kind": "reference", - "name": "InlineValueWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the inline values requests scoped to the\nworkspace.\n\n@since 3.17.0.", - "since": "3.17.0." - }, - { - "name": "inlayHint", - "type": { - "kind": "reference", - "name": "InlayHintWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the inlay hint requests scoped to the\nworkspace.\n\n@since 3.17.0.", - "since": "3.17.0." - }, - { - "name": "diagnostics", - "type": { - "kind": "reference", - "name": "DiagnosticWorkspaceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the diagnostic requests scoped to the\nworkspace.\n\n@since 3.17.0.", - "since": "3.17.0." - } - ], - "documentation": "Workspace specific client capabilities." - }, - { - "name": "TextDocumentClientCapabilities", - "properties": [ - { - "name": "synchronization", - "type": { - "kind": "reference", - "name": "TextDocumentSyncClientCapabilities" - }, - "optional": true, - "documentation": "Defines which synchronization capabilities the client supports." - }, - { - "name": "completion", - "type": { - "kind": "reference", - "name": "CompletionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/completion` request." - }, - { - "name": "hover", - "type": { - "kind": "reference", - "name": "HoverClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/hover` request." - }, - { - "name": "signatureHelp", - "type": { - "kind": "reference", - "name": "SignatureHelpClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/signatureHelp` request." - }, - { - "name": "declaration", - "type": { - "kind": "reference", - "name": "DeclarationClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/declaration` request.\n\n@since 3.14.0", - "since": "3.14.0" - }, - { - "name": "definition", - "type": { - "kind": "reference", - "name": "DefinitionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/definition` request." - }, - { - "name": "typeDefinition", - "type": { - "kind": "reference", - "name": "TypeDefinitionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/typeDefinition` request.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "implementation", - "type": { - "kind": "reference", - "name": "ImplementationClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/implementation` request.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "references", - "type": { - "kind": "reference", - "name": "ReferenceClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/references` request." - }, - { - "name": "documentHighlight", - "type": { - "kind": "reference", - "name": "DocumentHighlightClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentHighlight` request." - }, - { - "name": "documentSymbol", - "type": { - "kind": "reference", - "name": "DocumentSymbolClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentSymbol` request." - }, - { - "name": "codeAction", - "type": { - "kind": "reference", - "name": "CodeActionClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/codeAction` request." - }, - { - "name": "codeLens", - "type": { - "kind": "reference", - "name": "CodeLensClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/codeLens` request." - }, - { - "name": "documentLink", - "type": { - "kind": "reference", - "name": "DocumentLinkClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentLink` request." - }, - { - "name": "colorProvider", - "type": { - "kind": "reference", - "name": "DocumentColorClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/documentColor` and the\n`textDocument/colorPresentation` request.\n\n@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "formatting", - "type": { - "kind": "reference", - "name": "DocumentFormattingClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/formatting` request." - }, - { - "name": "rangeFormatting", - "type": { - "kind": "reference", - "name": "DocumentRangeFormattingClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/rangeFormatting` request." - }, - { - "name": "onTypeFormatting", - "type": { - "kind": "reference", - "name": "DocumentOnTypeFormattingClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/onTypeFormatting` request." - }, - { - "name": "rename", - "type": { - "kind": "reference", - "name": "RenameClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/rename` request." - }, - { - "name": "foldingRange", - "type": { - "kind": "reference", - "name": "FoldingRangeClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/foldingRange` request.\n\n@since 3.10.0", - "since": "3.10.0" - }, - { - "name": "selectionRange", - "type": { - "kind": "reference", - "name": "SelectionRangeClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/selectionRange` request.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "publishDiagnostics", - "type": { - "kind": "reference", - "name": "PublishDiagnosticsClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/publishDiagnostics` notification." - }, - { - "name": "callHierarchy", - "type": { - "kind": "reference", - "name": "CallHierarchyClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the various call hierarchy requests.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "semanticTokens", - "type": { - "kind": "reference", - "name": "SemanticTokensClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the various semantic token request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "linkedEditingRange", - "type": { - "kind": "reference", - "name": "LinkedEditingRangeClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/linkedEditingRange` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "moniker", - "type": { - "kind": "reference", - "name": "MonikerClientCapabilities" - }, - "optional": true, - "documentation": "Client capabilities specific to the `textDocument/moniker` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "typeHierarchy", - "type": { - "kind": "reference", - "name": "TypeHierarchyClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the various type hierarchy requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlineValue", - "type": { - "kind": "reference", - "name": "InlineValueClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/inlineValue` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "inlayHint", - "type": { - "kind": "reference", - "name": "InlayHintClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the `textDocument/inlayHint` request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "diagnostic", - "type": { - "kind": "reference", - "name": "DiagnosticClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the diagnostic pull model.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Text document specific client capabilities." - }, - { - "name": "NotebookDocumentClientCapabilities", - "properties": [ - { - "name": "synchronization", - "type": { - "kind": "reference", - "name": "NotebookDocumentSyncClientCapabilities" - }, - "documentation": "Capabilities specific to notebook document synchronization\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Capabilities specific to the notebook document support.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WindowClientCapabilities", - "properties": [ - { - "name": "workDoneProgress", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "It indicates whether the client supports server initiated\nprogress using the `window/workDoneProgress/create` request.\n\nThe capability also controls Whether client supports handling\nof progress notifications. If set servers are allowed to report a\n`workDoneProgress` property in the request specific server\ncapabilities.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "showMessage", - "type": { - "kind": "reference", - "name": "ShowMessageRequestClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the showMessage request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "showDocument", - "type": { - "kind": "reference", - "name": "ShowDocumentClientCapabilities" - }, - "optional": true, - "documentation": "Capabilities specific to the showDocument request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - }, - { - "name": "GeneralClientCapabilities", - "properties": [ - { - "name": "staleRequestSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "cancel", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "The client will actively cancel the request." - }, - { - "name": "retryOnContentModified", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The list of requests for which the client\nwill retry the request if it receives a\nresponse with error code `ContentModified`" - } - ] - } - }, - "optional": true, - "documentation": "Client capability that signals how the client\nhandles stale requests (e.g. a request\nfor which the client will not process the response\nanymore since the information is outdated).\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "regularExpressions", - "type": { - "kind": "reference", - "name": "RegularExpressionsClientCapabilities" - }, - "optional": true, - "documentation": "Client capabilities specific to regular expressions.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "markdown", - "type": { - "kind": "reference", - "name": "MarkdownClientCapabilities" - }, - "optional": true, - "documentation": "Client capabilities specific to the client's markdown parser.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "positionEncodings", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "PositionEncodingKind" - } - }, - "optional": true, - "documentation": "The position encodings supported by the client. Client and server\nhave to agree on the same position encoding to ensure that offsets\n(e.g. character position in a line) are interpreted the same on both\nsides.\n\nTo keep the protocol backwards compatible the following applies: if\nthe value 'utf-16' is missing from the array of position encodings\nservers can assume that the client supports UTF-16. UTF-16 is\ntherefore a mandatory encoding.\n\nIf omitted it defaults to ['utf-16'].\n\nImplementation considerations: since the conversion from one encoding\ninto another requires the content of the file / line the conversion\nis best done where the file is read which is usually on the server\nside.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "General client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "RelativePattern", - "properties": [ - { - "name": "baseUri", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceFolder" - }, - { - "kind": "base", - "name": "URI" - } - ] - }, - "documentation": "A workspace folder or a base URI to which this pattern will be matched\nagainst relatively." - }, - { - "name": "pattern", - "type": { - "kind": "reference", - "name": "Pattern" - }, - "documentation": "The actual glob pattern;" - } - ], - "documentation": "A relative pattern is a helper to construct glob patterns that are matched\nrelatively to a base URI. The common value for a `baseUri` is a workspace\nfolder root, but it can be another absolute URI as well.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "WorkspaceEditClientCapabilities", - "properties": [ - { - "name": "documentChanges", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports versioned document changes in `WorkspaceEdit`s" - }, - { - "name": "resourceOperations", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "ResourceOperationKind" - } - }, - "optional": true, - "documentation": "The resource operations the client supports. Clients should at least\nsupport 'create', 'rename' and 'delete' files and folders.\n\n@since 3.13.0", - "since": "3.13.0" - }, - { - "name": "failureHandling", - "type": { - "kind": "reference", - "name": "FailureHandlingKind" - }, - "optional": true, - "documentation": "The failure handling strategy of a client if applying the workspace edit\nfails.\n\n@since 3.13.0", - "since": "3.13.0" - }, - { - "name": "normalizesLineEndings", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client normalizes line endings to the client specific\nsetting.\nIf set to `true` the client will normalize line ending characters\nin a workspace edit to the client-specified new line\ncharacter.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "changeAnnotationSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "groupsOnLabel", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client groups edits with equal labels into tree nodes,\nfor instance all edits labelled with \"Changes in Strings\" would\nbe a tree node." - } - ] - } - }, - "optional": true, - "documentation": "Whether the client in general supports change annotations on text edits,\ncreate file, rename file and delete file changes.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - }, - { - "name": "DidChangeConfigurationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Did change configuration notification supports dynamic registration." - } - ] - }, - { - "name": "DidChangeWatchedFilesClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Did change watched files notification supports dynamic registration. Please note\nthat the current protocol doesn't support static configuration for file changes\nfrom the server side." - }, - { - "name": "relativePatternSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client has support for {@link RelativePattern relative pattern}\nor not.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - }, - { - "name": "WorkspaceSymbolClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Symbol request supports dynamic registration." - }, - { - "name": "symbolKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolKind" - } - }, - "optional": true, - "documentation": "The symbol kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown.\n\nIf this property is not present the client only supports\nthe symbol kinds from `File` to `Array` as defined in\nthe initial version of the protocol." - } - ] - } - }, - "optional": true, - "documentation": "Specific capabilities for the `SymbolKind` in the `workspace/symbol` request." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "The client supports tags on `SymbolInformation`.\nClients supporting tags have to handle unknown tags gracefully.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily. Usually\n`location.range`" - } - ] - } - }, - "optional": true, - "documentation": "The client support partial workspace symbols. The client will send the\nrequest `workspaceSymbol/resolve` to the server to resolve additional\nproperties.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Client capabilities for a {@link WorkspaceSymbolRequest}." - }, - { - "name": "ExecuteCommandClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Execute command supports dynamic registration." - } - ], - "documentation": "The client capabilities of a {@link ExecuteCommandRequest}." - }, - { - "name": "SemanticTokensWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from\nthe server to the client.\n\nNote that this event is global and will force the client to refresh all\nsemantic tokens currently shown. It should be used with absolute care\nand is useful for situation where a server, for example, detects a project\nwide change that requires such a calculation." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "CodeLensWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from the\nserver to the client.\n\nNote that this event is global and will force the client to refresh all\ncode lenses currently shown. It should be used with absolute care and is\nuseful for situation where a server, for example, detect a project wide\nchange that requires such a calculation." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "FileOperationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports dynamic registration for file requests/notifications." - }, - { - "name": "didCreate", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending didCreateFiles notifications." - }, - { - "name": "willCreate", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending willCreateFiles requests." - }, - { - "name": "didRename", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending didRenameFiles notifications." - }, - { - "name": "willRename", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending willRenameFiles requests." - }, - { - "name": "didDelete", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending didDeleteFiles notifications." - }, - { - "name": "willDelete", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for sending willDeleteFiles requests." - } - ], - "documentation": "Capabilities relating to events from file operations by the user in the client.\n\nThese events do not come from the file system, they come from user operations\nlike renaming a file in the UI.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "InlineValueWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from the\nserver to the client.\n\nNote that this event is global and will force the client to refresh all\ninline values currently shown. It should be used with absolute care and is\nuseful for situation where a server, for example, detects a project wide\nchange that requires such a calculation." - } - ], - "documentation": "Client workspace capabilities specific to inline values.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from\nthe server to the client.\n\nNote that this event is global and will force the client to refresh all\ninlay hints currently shown. It should be used with absolute care and\nis useful for situation where a server, for example, detects a project wide\nchange that requires such a calculation." - } - ], - "documentation": "Client workspace capabilities specific to inlay hints.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticWorkspaceClientCapabilities", - "properties": [ - { - "name": "refreshSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client implementation supports a refresh request sent from\nthe server to the client.\n\nNote that this event is global and will force the client to refresh all\npulled diagnostics currently shown. It should be used with absolute care and\nis useful for situation where a server, for example, detects a project wide\nchange that requires such a calculation." - } - ], - "documentation": "Workspace client capabilities specific to diagnostic pull requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentSyncClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether text document synchronization supports dynamic registration." - }, - { - "name": "willSave", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports sending will save notifications." - }, - { - "name": "willSaveWaitUntil", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports sending a will save request and\nwaits for a response providing text edits which will\nbe applied to the document before it is saved." - }, - { - "name": "didSave", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports did save notifications." - } - ] - }, - { - "name": "CompletionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether completion supports dynamic registration." - }, - { - "name": "completionItem", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "snippetSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports snippets as insert text.\n\nA snippet can define tab stops and placeholders with `$1`, `$2`\nand `${3:foo}`. `$0` defines the final tab stop, it defaults to\nthe end of the snippet. Placeholders with equal identifiers are linked,\nthat is typing in one will update others too." - }, - { - "name": "commitCharactersSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports commit characters on a completion item." - }, - { - "name": "documentationFormat", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkupKind" - } - }, - "optional": true, - "documentation": "Client supports the following content formats for the documentation\nproperty. The order describes the preferred format of the client." - }, - { - "name": "deprecatedSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports the deprecated property on a completion item." - }, - { - "name": "preselectSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports the preselect property on a completion item." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItemTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "Client supports the tag property on a completion item. Clients supporting\ntags have to handle unknown tags gracefully. Clients especially need to\npreserve unknown tags when sending a completion item back to the server in\na resolve call.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "insertReplaceSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client support insert replace edit to control different behavior if a\ncompletion item is inserted in the text or should replace text.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily." - } - ] - } - }, - "optional": true, - "documentation": "Indicates which properties a client can resolve lazily on a completion\nitem. Before version 3.16.0 only the predefined properties `documentation`\nand `details` could be resolved lazily.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "insertTextModeSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "InsertTextMode" - } - } - } - ] - } - }, - "optional": true, - "documentation": "The client supports the `insertTextMode` property on\na completion item to override the whitespace handling mode\nas defined by the client (see `insertTextMode`).\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "labelDetailsSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client has support for completion item label\ndetails (see also `CompletionItemLabelDetails`).\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "The client supports the following `CompletionItem` specific\ncapabilities." - }, - { - "name": "completionItemKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CompletionItemKind" - } - }, - "optional": true, - "documentation": "The completion item kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown.\n\nIf this property is not present the client only supports\nthe completion items kinds from `Text` to `Reference` as defined in\nthe initial version of the protocol." - } - ] - } - }, - "optional": true - }, - { - "name": "insertTextMode", - "type": { - "kind": "reference", - "name": "InsertTextMode" - }, - "optional": true, - "documentation": "Defines how the client handles whitespace and indentation\nwhen accepting a completion item that uses multi line\ntext in either `insertText` or `textEdit`.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "contextSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports to send additional context information for a\n`textDocument/completion` request." - }, - { - "name": "completionList", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "itemDefaults", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "The client supports the following itemDefaults on\na completion list.\n\nThe value lists the supported property names of the\n`CompletionList.itemDefaults` object. If omitted\nno properties are supported.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "The client supports the following `CompletionList` specific\ncapabilities.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Completion client capabilities" - }, - { - "name": "HoverClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether hover supports dynamic registration." - }, - { - "name": "contentFormat", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkupKind" - } - }, - "optional": true, - "documentation": "Client supports the following content formats for the content\nproperty. The order describes the preferred format of the client." - } - ] - }, - { - "name": "SignatureHelpClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether signature help supports dynamic registration." - }, - { - "name": "signatureInformation", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "documentationFormat", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "MarkupKind" - } - }, - "optional": true, - "documentation": "Client supports the following content formats for the documentation\nproperty. The order describes the preferred format of the client." - }, - { - "name": "parameterInformation", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "labelOffsetSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports processing label offsets instead of a\nsimple label string.\n\n@since 3.14.0", - "since": "3.14.0" - } - ] - } - }, - "optional": true, - "documentation": "Client capabilities specific to parameter information." - }, - { - "name": "activeParameterSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports the `activeParameter` property on `SignatureInformation`\nliteral.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - } - }, - "optional": true, - "documentation": "The client supports the following `SignatureInformation`\nspecific properties." - }, - { - "name": "contextSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports to send additional context information for a\n`textDocument/signatureHelp` request. A client that opts into\ncontextSupport will also support the `retriggerCharacters` on\n`SignatureHelpOptions`.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "Client Capabilities for a {@link SignatureHelpRequest}." - }, - { - "name": "DeclarationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether declaration supports dynamic registration. If this is set to `true`\nthe client supports the new `DeclarationRegistrationOptions` return value\nfor the corresponding server capability as well." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of declaration links." - } - ], - "documentation": "@since 3.14.0", - "since": "3.14.0" - }, - { - "name": "DefinitionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether definition supports dynamic registration." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of definition links.\n\n@since 3.14.0", - "since": "3.14.0" - } - ], - "documentation": "Client Capabilities for a {@link DefinitionRequest}." - }, - { - "name": "TypeDefinitionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `TypeDefinitionRegistrationOptions` return value\nfor the corresponding server capability as well." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of definition links.\n\nSince 3.14.0" - } - ], - "documentation": "Since 3.6.0" - }, - { - "name": "ImplementationClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `ImplementationRegistrationOptions` return value\nfor the corresponding server capability as well." - }, - { - "name": "linkSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports additional metadata in the form of definition links.\n\n@since 3.14.0", - "since": "3.14.0" - } - ], - "documentation": "@since 3.6.0", - "since": "3.6.0" - }, - { - "name": "ReferenceClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether references supports dynamic registration." - } - ], - "documentation": "Client Capabilities for a {@link ReferencesRequest}." - }, - { - "name": "DocumentHighlightClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether document highlight supports dynamic registration." - } - ], - "documentation": "Client Capabilities for a {@link DocumentHighlightRequest}." - }, - { - "name": "DocumentSymbolClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether document symbol supports dynamic registration." - }, - { - "name": "symbolKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolKind" - } - }, - "optional": true, - "documentation": "The symbol kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown.\n\nIf this property is not present the client only supports\nthe symbol kinds from `File` to `Array` as defined in\nthe initial version of the protocol." - } - ] - } - }, - "optional": true, - "documentation": "Specific capabilities for the `SymbolKind` in the\n`textDocument/documentSymbol` request." - }, - { - "name": "hierarchicalDocumentSymbolSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports hierarchical document symbols." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "SymbolTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "The client supports tags on `SymbolInformation`. Tags are supported on\n`DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true.\nClients supporting tags have to handle unknown tags gracefully.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "labelSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports an additional label presented in the UI when\nregistering a document symbol provider.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "Client Capabilities for a {@link DocumentSymbolRequest}." - }, - { - "name": "CodeActionClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports dynamic registration." - }, - { - "name": "codeActionLiteralSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "codeActionKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "CodeActionKind" - } - }, - "documentation": "The code action kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown." - } - ] - } - }, - "documentation": "The code action kind is support with the following value\nset." - } - ] - } - }, - "optional": true, - "documentation": "The client support code action literals of type `CodeAction` as a valid\nresponse of the `textDocument/codeAction` request. If the property is not\nset the request can only return `Command` literals.\n\n@since 3.8.0", - "since": "3.8.0" - }, - { - "name": "isPreferredSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `isPreferred` property.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "disabledSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `disabled` property.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "dataSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `data` property which is\npreserved between a `textDocument/codeAction` and a\n`codeAction/resolve` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily." - } - ] - } - }, - "optional": true, - "documentation": "Whether the client supports resolving additional code action\nproperties via a separate `codeAction/resolve` request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "honorsChangeAnnotations", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client honors the change annotations in\ntext edits and resource operations returned via the\n`CodeAction#edit` property by, for example, presenting\nthe workspace edit in the user interface and asking\nfor confirmation.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "The Client Capabilities of a {@link CodeActionRequest}." - }, - { - "name": "CodeLensClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code lens supports dynamic registration." - } - ], - "documentation": "The client capabilities of a {@link CodeLensRequest}." - }, - { - "name": "DocumentLinkClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether document link supports dynamic registration." - }, - { - "name": "tooltipSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports the `tooltip` property on `DocumentLink`.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "documentation": "The client capabilities of a {@link DocumentLinkRequest}." - }, - { - "name": "DocumentColorClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `DocumentColorRegistrationOptions` return value\nfor the corresponding server capability as well." - } - ] - }, - { - "name": "DocumentFormattingClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether formatting supports dynamic registration." - } - ], - "documentation": "Client capabilities of a {@link DocumentFormattingRequest}." - }, - { - "name": "DocumentRangeFormattingClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether range formatting supports dynamic registration." - } - ], - "documentation": "Client capabilities of a {@link DocumentRangeFormattingRequest}." - }, - { - "name": "DocumentOnTypeFormattingClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether on type formatting supports dynamic registration." - } - ], - "documentation": "Client capabilities of a {@link DocumentOnTypeFormattingRequest}." - }, - { - "name": "RenameClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether rename supports dynamic registration." - }, - { - "name": "prepareSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports testing for validity of rename operations\nbefore execution.\n\n@since 3.12.0", - "since": "3.12.0" - }, - { - "name": "prepareSupportDefaultBehavior", - "type": { - "kind": "reference", - "name": "PrepareSupportDefaultBehavior" - }, - "optional": true, - "documentation": "Client supports the default behavior result.\n\nThe value indicates the default behavior used by the\nclient.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "honorsChangeAnnotations", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client honors the change annotations in\ntext edits and resource operations returned via the\nrename request's workspace edit by, for example, presenting\nthe workspace edit in the user interface and asking\nfor confirmation.\n\n@since 3.16.0", - "since": "3.16.0" - } - ] - }, - { - "name": "FoldingRangeClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration for folding range\nproviders. If this is set to `true` the client supports the new\n`FoldingRangeRegistrationOptions` return value for the corresponding\nserver capability as well." - }, - { - "name": "rangeLimit", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The maximum number of folding ranges that the client prefers to receive\nper document. The value serves as a hint, servers are free to follow the\nlimit." - }, - { - "name": "lineFoldingOnly", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If set, the client signals that it only supports folding complete lines.\nIf set, client will ignore specified `startCharacter` and `endCharacter`\nproperties in a FoldingRange." - }, - { - "name": "foldingRangeKind", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "FoldingRangeKind" - } - }, - "optional": true, - "documentation": "The folding range kind values the client supports. When this\nproperty exists the client also guarantees that it will\nhandle values outside its set gracefully and falls back\nto a default value when unknown." - } - ] - } - }, - "optional": true, - "documentation": "Specific options for the folding range kind.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "foldingRange", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "collapsedText", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "If set, the client signals that it supports setting collapsedText on\nfolding ranges to display custom labels instead of the default text.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - } - }, - "optional": true, - "documentation": "Specific options for the folding range.\n\n@since 3.17.0", - "since": "3.17.0" - } - ] - }, - { - "name": "SelectionRangeClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration for selection range providers. If this is set to `true`\nthe client supports the new `SelectionRangeRegistrationOptions` return value for the corresponding server\ncapability as well." - } - ] - }, - { - "name": "PublishDiagnosticsClientCapabilities", - "properties": [ - { - "name": "relatedInformation", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the clients accepts diagnostics with related information." - }, - { - "name": "tagSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "valueSet", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DiagnosticTag" - } - }, - "documentation": "The tags supported by the client." - } - ] - } - }, - "optional": true, - "documentation": "Client supports the tag property to provide meta data about a diagnostic.\nClients supporting tags have to handle unknown tags gracefully.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "versionSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client interprets the version property of the\n`textDocument/publishDiagnostics` notification's parameter.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "codeDescriptionSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Client supports a codeDescription property\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "dataSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether code action supports the `data` property which is\npreserved between a `textDocument/publishDiagnostics` and\n`textDocument/codeAction` request.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "documentation": "The publish diagnostic client capabilities." - }, - { - "name": "CallHierarchyClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokensClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - }, - { - "name": "requests", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "range", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [] - } - } - ] - }, - "optional": true, - "documentation": "The client will send the `textDocument/semanticTokens/range` request if\nthe server provides a corresponding handler." - }, - { - "name": "full", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "delta", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client will send the `textDocument/semanticTokens/full/delta` request if\nthe server provides a corresponding handler." - } - ] - } - } - ] - }, - "optional": true, - "documentation": "The client will send the `textDocument/semanticTokens/full` request if\nthe server provides a corresponding handler." - } - ] - } - }, - "documentation": "Which requests the client supports and might send to the server\ndepending on the server's capability. Please note that clients might not\nshow semantic tokens or degrade some of the user experience if a range\nor full request is advertised by the client but not provided by the\nserver. If, for example, the client capability `requests.full` and\n`request.range` are both set to true but the server only provides a\nrange provider the client might not render a minimap correctly or might\neven decide to not show any semantic tokens at all." - }, - { - "name": "tokenTypes", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token types that the client supports." - }, - { - "name": "tokenModifiers", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The token modifiers that the client supports." - }, - { - "name": "formats", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "TokenFormat" - } - }, - "documentation": "The token formats the clients supports." - }, - { - "name": "overlappingTokenSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports tokens that can overlap each other." - }, - { - "name": "multilineTokenSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports tokens that can span multiple lines." - }, - { - "name": "serverCancelSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client allows the server to actively cancel a\nsemantic token request, e.g. supports returning\nLSPErrorCodes.ServerCancelled. If a server does the client\nneeds to retrigger the request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "augmentsSyntaxTokens", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client uses semantic tokens to augment existing\nsyntax tokens. If set to `true` client side created syntax\ntokens and semantic tokens are both used for colorization. If\nset to `false` the client only uses the returned semantic tokens\nfor colorization.\n\nIf the value is `undefined` then the client behavior is not\nspecified.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "LinkedEditingRangeClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - } - ], - "documentation": "Client capabilities for the linked editing range request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether moniker supports dynamic registration. If this is set to `true`\nthe client supports the new `MonikerRegistrationOptions` return value\nfor the corresponding server capability as well." - } - ], - "documentation": "Client capabilities specific to the moniker request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "TypeHierarchyClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - } - ], - "documentation": "@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlineValueClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration for inline value providers." - } - ], - "documentation": "Client capabilities specific to inline values.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "InlayHintClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether inlay hints support dynamic registration." - }, - { - "name": "resolveSupport", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "properties", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "documentation": "The properties that a client can resolve lazily." - } - ] - } - }, - "optional": true, - "documentation": "Indicates which properties a client can resolve lazily on an inlay\nhint." - } - ], - "documentation": "Inlay hint client capabilities.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DiagnosticClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is set to `true`\nthe client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - }, - { - "name": "relatedDocumentSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the clients supports related documents for document diagnostic pulls." - } - ], - "documentation": "Client capabilities specific to diagnostic pull requests.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentSyncClientCapabilities", - "properties": [ - { - "name": "dynamicRegistration", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether implementation supports dynamic registration. If this is\nset to `true` the client supports the new\n`(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\nreturn value for the corresponding server capability as well." - }, - { - "name": "executionSummarySupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "The client supports sending execution summary data per cell." - } - ], - "documentation": "Notebook specific client capabilities.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ShowMessageRequestClientCapabilities", - "properties": [ - { - "name": "messageActionItem", - "type": { - "kind": "literal", - "value": { - "properties": [ - { - "name": "additionalPropertiesSupport", - "type": { - "kind": "base", - "name": "boolean" - }, - "optional": true, - "documentation": "Whether the client supports additional attributes which\nare preserved and send back to the server in the\nrequest's response." - } - ] - } - }, - "optional": true, - "documentation": "Capabilities specific to the `MessageActionItem` type." - } - ], - "documentation": "Show message request client capabilities" - }, - { - "name": "ShowDocumentClientCapabilities", - "properties": [ - { - "name": "support", - "type": { - "kind": "base", - "name": "boolean" - }, - "documentation": "The client has support for the showDocument\nrequest." - } - ], - "documentation": "Client capabilities for the showDocument request.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "RegularExpressionsClientCapabilities", - "properties": [ - { - "name": "engine", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The engine's name." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The engine's version." - } - ], - "documentation": "Client capabilities specific to regular expressions.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MarkdownClientCapabilities", - "properties": [ - { - "name": "parser", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The name of the parser." - }, - { - "name": "version", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The version of the parser." - }, - { - "name": "allowedTags", - "type": { - "kind": "array", - "element": { - "kind": "base", - "name": "string" - } - }, - "optional": true, - "documentation": "A list of HTML tags that the client allows / supports in\nMarkdown.\n\n@since 3.17.0", - "since": "3.17.0" - } - ], - "documentation": "Client capabilities specific to the used markdown parser.\n\n@since 3.16.0", - "since": "3.16.0" - } - ], - "enumerations": [ - { - "name": "SemanticTokenTypes", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "namespace", - "value": "namespace" - }, - { - "name": "type", - "value": "type", - "documentation": "Represents a generic type. Acts as a fallback for types which can't be mapped to\na specific type like class or enum." - }, - { - "name": "class", - "value": "class" - }, - { - "name": "enum", - "value": "enum" - }, - { - "name": "interface", - "value": "interface" - }, - { - "name": "struct", - "value": "struct" - }, - { - "name": "typeParameter", - "value": "typeParameter" - }, - { - "name": "parameter", - "value": "parameter" - }, - { - "name": "variable", - "value": "variable" - }, - { - "name": "property", - "value": "property" - }, - { - "name": "enumMember", - "value": "enumMember" - }, - { - "name": "event", - "value": "event" - }, - { - "name": "function", - "value": "function" - }, - { - "name": "method", - "value": "method" - }, - { - "name": "macro", - "value": "macro" - }, - { - "name": "keyword", - "value": "keyword" - }, - { - "name": "modifier", - "value": "modifier" - }, - { - "name": "comment", - "value": "comment" - }, - { - "name": "string", - "value": "string" - }, - { - "name": "number", - "value": "number" - }, - { - "name": "regexp", - "value": "regexp" - }, - { - "name": "operator", - "value": "operator" - }, - { - "name": "decorator", - "value": "decorator", - "documentation": "@since 3.17.0", - "since": "3.17.0" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined token types. This set is not fixed\nan clients can specify additional token types via the\ncorresponding client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "SemanticTokenModifiers", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "declaration", - "value": "declaration" - }, - { - "name": "definition", - "value": "definition" - }, - { - "name": "readonly", - "value": "readonly" - }, - { - "name": "static", - "value": "static" - }, - { - "name": "deprecated", - "value": "deprecated" - }, - { - "name": "abstract", - "value": "abstract" - }, - { - "name": "async", - "value": "async" - }, - { - "name": "modification", - "value": "modification" - }, - { - "name": "documentation", - "value": "documentation" - }, - { - "name": "defaultLibrary", - "value": "defaultLibrary" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined token modifiers. This set is not fixed\nan clients can specify additional token types via the\ncorresponding client capabilities.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DocumentDiagnosticReportKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Full", - "value": "full", - "documentation": "A diagnostic report with a full\nset of problems." - }, - { - "name": "Unchanged", - "value": "unchanged", - "documentation": "A report indicating that the last\nreturned report is still accurate." - } - ], - "documentation": "The document diagnostic report kinds.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ErrorCodes", - "type": { - "kind": "base", - "name": "integer" - }, - "values": [ - { - "name": "ParseError", - "value": -32700 - }, - { - "name": "InvalidRequest", - "value": -32600 - }, - { - "name": "MethodNotFound", - "value": -32601 - }, - { - "name": "InvalidParams", - "value": -32602 - }, - { - "name": "InternalError", - "value": -32603 - }, - { - "name": "ServerNotInitialized", - "value": -32002, - "documentation": "Error code indicating that a server received a notification or\nrequest before the server has received the `initialize` request." - }, - { - "name": "UnknownErrorCode", - "value": -32001 - } - ], - "supportsCustomValues": true, - "documentation": "Predefined error codes." - }, - { - "name": "LSPErrorCodes", - "type": { - "kind": "base", - "name": "integer" - }, - "values": [ - { - "name": "RequestFailed", - "value": -32803, - "documentation": "A request failed but it was syntactically correct, e.g the\nmethod name was known and the parameters were valid. The error\nmessage should contain human readable information about why\nthe request failed.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ServerCancelled", - "value": -32802, - "documentation": "The server cancelled the request. This error code should\nonly be used for requests that explicitly support being\nserver cancellable.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ContentModified", - "value": -32801, - "documentation": "The server detected that the content of a document got\nmodified outside normal conditions. A server should\nNOT send this error code if it detects a content change\nin it unprocessed messages. The result even computed\non an older state might still be useful for the client.\n\nIf a client decides that a result is not of any use anymore\nthe client should cancel the request." - }, - { - "name": "RequestCancelled", - "value": -32800, - "documentation": "The client has canceled a request and a server as detected\nthe cancel." - } - ], - "supportsCustomValues": true - }, - { - "name": "FoldingRangeKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Comment", - "value": "comment", - "documentation": "Folding range for a comment" - }, - { - "name": "Imports", - "value": "imports", - "documentation": "Folding range for an import or include" - }, - { - "name": "Region", - "value": "region", - "documentation": "Folding range for a region (e.g. `#region`)" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined range kinds." - }, - { - "name": "SymbolKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "File", - "value": 1 - }, - { - "name": "Module", - "value": 2 - }, - { - "name": "Namespace", - "value": 3 - }, - { - "name": "Package", - "value": 4 - }, - { - "name": "Class", - "value": 5 - }, - { - "name": "Method", - "value": 6 - }, - { - "name": "Property", - "value": 7 - }, - { - "name": "Field", - "value": 8 - }, - { - "name": "Constructor", - "value": 9 - }, - { - "name": "Enum", - "value": 10 - }, - { - "name": "Interface", - "value": 11 - }, - { - "name": "Function", - "value": 12 - }, - { - "name": "Variable", - "value": 13 - }, - { - "name": "Constant", - "value": 14 - }, - { - "name": "String", - "value": 15 - }, - { - "name": "Number", - "value": 16 - }, - { - "name": "Boolean", - "value": 17 - }, - { - "name": "Array", - "value": 18 - }, - { - "name": "Object", - "value": 19 - }, - { - "name": "Key", - "value": 20 - }, - { - "name": "Null", - "value": 21 - }, - { - "name": "EnumMember", - "value": 22 - }, - { - "name": "Struct", - "value": 23 - }, - { - "name": "Event", - "value": 24 - }, - { - "name": "Operator", - "value": 25 - }, - { - "name": "TypeParameter", - "value": 26 - } - ], - "documentation": "A symbol kind." - }, - { - "name": "SymbolTag", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Deprecated", - "value": 1, - "documentation": "Render a symbol as obsolete, usually using a strike-out." - } - ], - "documentation": "Symbol tags are extra annotations that tweak the rendering of a symbol.\n\n@since 3.16", - "since": "3.16" - }, - { - "name": "UniquenessLevel", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "document", - "value": "document", - "documentation": "The moniker is only unique inside a document" - }, - { - "name": "project", - "value": "project", - "documentation": "The moniker is unique inside a project for which a dump got created" - }, - { - "name": "group", - "value": "group", - "documentation": "The moniker is unique inside the group to which a project belongs" - }, - { - "name": "scheme", - "value": "scheme", - "documentation": "The moniker is unique inside the moniker scheme." - }, - { - "name": "global", - "value": "global", - "documentation": "The moniker is globally unique" - } - ], - "documentation": "Moniker uniqueness level to define scope of the moniker.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "MonikerKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "import", - "value": "import", - "documentation": "The moniker represent a symbol that is imported into a project" - }, - { - "name": "export", - "value": "export", - "documentation": "The moniker represents a symbol that is exported from a project" - }, - { - "name": "local", - "value": "local", - "documentation": "The moniker represents a symbol that is local to a project (e.g. a local\nvariable of a function, a class not visible outside the project, ...)" - } - ], - "documentation": "The moniker kind.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "InlayHintKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Type", - "value": 1, - "documentation": "An inlay hint that for a type annotation." - }, - { - "name": "Parameter", - "value": 2, - "documentation": "An inlay hint that is for a parameter." - } - ], - "documentation": "Inlay hint kinds.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "MessageType", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Error", - "value": 1, - "documentation": "An error message." - }, - { - "name": "Warning", - "value": 2, - "documentation": "A warning message." - }, - { - "name": "Info", - "value": 3, - "documentation": "An information message." - }, - { - "name": "Log", - "value": 4, - "documentation": "A log message." - } - ], - "documentation": "The message type" - }, - { - "name": "TextDocumentSyncKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "None", - "value": 0, - "documentation": "Documents should not be synced at all." - }, - { - "name": "Full", - "value": 1, - "documentation": "Documents are synced by always sending the full content\nof the document." - }, - { - "name": "Incremental", - "value": 2, - "documentation": "Documents are synced by sending the full content on open.\nAfter that only incremental updates to the document are\nsend." - } - ], - "documentation": "Defines how the host (editor) should sync\ndocument changes to the language server." - }, - { - "name": "TextDocumentSaveReason", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Manual", - "value": 1, - "documentation": "Manually triggered, e.g. by the user pressing save, by starting debugging,\nor by an API call." - }, - { - "name": "AfterDelay", - "value": 2, - "documentation": "Automatic after a delay." - }, - { - "name": "FocusOut", - "value": 3, - "documentation": "When the editor lost focus." - } - ], - "documentation": "Represents reasons why a text document is saved." - }, - { - "name": "CompletionItemKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Text", - "value": 1 - }, - { - "name": "Method", - "value": 2 - }, - { - "name": "Function", - "value": 3 - }, - { - "name": "Constructor", - "value": 4 - }, - { - "name": "Field", - "value": 5 - }, - { - "name": "Variable", - "value": 6 - }, - { - "name": "Class", - "value": 7 - }, - { - "name": "Interface", - "value": 8 - }, - { - "name": "Module", - "value": 9 - }, - { - "name": "Property", - "value": 10 - }, - { - "name": "Unit", - "value": 11 - }, - { - "name": "Value", - "value": 12 - }, - { - "name": "Enum", - "value": 13 - }, - { - "name": "Keyword", - "value": 14 - }, - { - "name": "Snippet", - "value": 15 - }, - { - "name": "Color", - "value": 16 - }, - { - "name": "File", - "value": 17 - }, - { - "name": "Reference", - "value": 18 - }, - { - "name": "Folder", - "value": 19 - }, - { - "name": "EnumMember", - "value": 20 - }, - { - "name": "Constant", - "value": 21 - }, - { - "name": "Struct", - "value": 22 - }, - { - "name": "Event", - "value": 23 - }, - { - "name": "Operator", - "value": 24 - }, - { - "name": "TypeParameter", - "value": 25 - } - ], - "documentation": "The kind of a completion entry." - }, - { - "name": "CompletionItemTag", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Deprecated", - "value": 1, - "documentation": "Render a completion as obsolete, usually using a strike-out." - } - ], - "documentation": "Completion item tags are extra annotations that tweak the rendering of a completion\nitem.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "InsertTextFormat", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "PlainText", - "value": 1, - "documentation": "The primary text to be inserted is treated as a plain string." - }, - { - "name": "Snippet", - "value": 2, - "documentation": "The primary text to be inserted is treated as a snippet.\n\nA snippet can define tab stops and placeholders with `$1`, `$2`\nand `${3:foo}`. `$0` defines the final tab stop, it defaults to\nthe end of the snippet. Placeholders with equal identifiers are linked,\nthat is typing in one will update others too.\n\nSee also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax" - } - ], - "documentation": "Defines whether the insert text in a completion item should be interpreted as\nplain text or a snippet." - }, - { - "name": "InsertTextMode", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "asIs", - "value": 1, - "documentation": "The insertion or replace strings is taken as it is. If the\nvalue is multi line the lines below the cursor will be\ninserted using the indentation defined in the string value.\nThe client will not apply any kind of adjustments to the\nstring." - }, - { - "name": "adjustIndentation", - "value": 2, - "documentation": "The editor adjusts leading whitespace of new lines so that\nthey match the indentation up to the cursor of the line for\nwhich the item is accepted.\n\nConsider a line like this: <2tabs><3tabs>foo. Accepting a\nmulti line completion item is indented using 2 tabs and all\nfollowing lines inserted will be indented using 2 tabs as well." - } - ], - "documentation": "How whitespace and indentation is handled during completion\nitem insertion.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "DocumentHighlightKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Text", - "value": 1, - "documentation": "A textual occurrence." - }, - { - "name": "Read", - "value": 2, - "documentation": "Read-access of a symbol, like reading a variable." - }, - { - "name": "Write", - "value": 3, - "documentation": "Write-access of a symbol, like writing to a variable." - } - ], - "documentation": "A document highlight kind." - }, - { - "name": "CodeActionKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Empty", - "value": "", - "documentation": "Empty kind." - }, - { - "name": "QuickFix", - "value": "quickfix", - "documentation": "Base kind for quickfix actions: 'quickfix'" - }, - { - "name": "Refactor", - "value": "refactor", - "documentation": "Base kind for refactoring actions: 'refactor'" - }, - { - "name": "RefactorExtract", - "value": "refactor.extract", - "documentation": "Base kind for refactoring extraction actions: 'refactor.extract'\n\nExample extract actions:\n\n- Extract method\n- Extract function\n- Extract variable\n- Extract interface from class\n- ..." - }, - { - "name": "RefactorInline", - "value": "refactor.inline", - "documentation": "Base kind for refactoring inline actions: 'refactor.inline'\n\nExample inline actions:\n\n- Inline function\n- Inline variable\n- Inline constant\n- ..." - }, - { - "name": "RefactorRewrite", - "value": "refactor.rewrite", - "documentation": "Base kind for refactoring rewrite actions: 'refactor.rewrite'\n\nExample rewrite actions:\n\n- Convert JavaScript function to class\n- Add or remove parameter\n- Encapsulate field\n- Make method static\n- Move method to base class\n- ..." - }, - { - "name": "Source", - "value": "source", - "documentation": "Base kind for source actions: `source`\n\nSource code actions apply to the entire file." - }, - { - "name": "SourceOrganizeImports", - "value": "source.organizeImports", - "documentation": "Base kind for an organize imports source action: `source.organizeImports`" - }, - { - "name": "SourceFixAll", - "value": "source.fixAll", - "documentation": "Base kind for auto-fix source actions: `source.fixAll`.\n\nFix all actions automatically fix errors that have a clear fix that do not require user input.\nThey should not suppress errors or perform unsafe fixes such as generating new types or classes.\n\n@since 3.15.0", - "since": "3.15.0" - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined code action kinds" - }, - { - "name": "TraceValues", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Off", - "value": "off", - "documentation": "Turn tracing off." - }, - { - "name": "Messages", - "value": "messages", - "documentation": "Trace messages only." - }, - { - "name": "Verbose", - "value": "verbose", - "documentation": "Verbose message tracing." - } - ] - }, - { - "name": "MarkupKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "PlainText", - "value": "plaintext", - "documentation": "Plain text is supported as a content format" - }, - { - "name": "Markdown", - "value": "markdown", - "documentation": "Markdown is supported as a content format" - } - ], - "documentation": "Describes the content type that a client supports in various\nresult literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n\nPlease note that `MarkupKinds` must not start with a `$`. This kinds\nare reserved for internal usage." - }, - { - "name": "PositionEncodingKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "UTF8", - "value": "utf-8", - "documentation": "Character offsets count UTF-8 code units." - }, - { - "name": "UTF16", - "value": "utf-16", - "documentation": "Character offsets count UTF-16 code units.\n\nThis is the default and must always be supported\nby servers" - }, - { - "name": "UTF32", - "value": "utf-32", - "documentation": "Character offsets count UTF-32 code units.\n\nImplementation note: these are the same as Unicode code points,\nso this `PositionEncodingKind` may also be used for an\nencoding-agnostic representation of character offsets." - } - ], - "supportsCustomValues": true, - "documentation": "A set of predefined position encoding kinds.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FileChangeType", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Created", - "value": 1, - "documentation": "The file got created." - }, - { - "name": "Changed", - "value": 2, - "documentation": "The file got changed." - }, - { - "name": "Deleted", - "value": 3, - "documentation": "The file got deleted." - } - ], - "documentation": "The file event type" - }, - { - "name": "WatchKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Create", - "value": 1, - "documentation": "Interested in create events." - }, - { - "name": "Change", - "value": 2, - "documentation": "Interested in change events" - }, - { - "name": "Delete", - "value": 4, - "documentation": "Interested in delete events" - } - ], - "supportsCustomValues": true - }, - { - "name": "DiagnosticSeverity", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Error", - "value": 1, - "documentation": "Reports an error." - }, - { - "name": "Warning", - "value": 2, - "documentation": "Reports a warning." - }, - { - "name": "Information", - "value": 3, - "documentation": "Reports an information." - }, - { - "name": "Hint", - "value": 4, - "documentation": "Reports a hint." - } - ], - "documentation": "The diagnostic's severity." - }, - { - "name": "DiagnosticTag", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Unnecessary", - "value": 1, - "documentation": "Unused or unnecessary code.\n\nClients are allowed to render diagnostics with this tag faded out instead of having\nan error squiggle." - }, - { - "name": "Deprecated", - "value": 2, - "documentation": "Deprecated or obsolete code.\n\nClients are allowed to rendered diagnostics with this tag strike through." - } - ], - "documentation": "The diagnostic tags.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "CompletionTriggerKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Invoked", - "value": 1, - "documentation": "Completion was triggered by typing an identifier (24x7 code\ncomplete), manual invocation (e.g Ctrl+Space) or via API." - }, - { - "name": "TriggerCharacter", - "value": 2, - "documentation": "Completion was triggered by a trigger character specified by\nthe `triggerCharacters` properties of the `CompletionRegistrationOptions`." - }, - { - "name": "TriggerForIncompleteCompletions", - "value": 3, - "documentation": "Completion was re-triggered as current completion list is incomplete" - } - ], - "documentation": "How a completion was triggered" - }, - { - "name": "SignatureHelpTriggerKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Invoked", - "value": 1, - "documentation": "Signature help was invoked manually by the user or by a command." - }, - { - "name": "TriggerCharacter", - "value": 2, - "documentation": "Signature help was triggered by a trigger character." - }, - { - "name": "ContentChange", - "value": 3, - "documentation": "Signature help was triggered by the cursor moving or by the document content changing." - } - ], - "documentation": "How a signature help was triggered.\n\n@since 3.15.0", - "since": "3.15.0" - }, - { - "name": "CodeActionTriggerKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Invoked", - "value": 1, - "documentation": "Code actions were explicitly requested by the user or by an extension." - }, - { - "name": "Automatic", - "value": 2, - "documentation": "Code actions were requested automatically.\n\nThis typically happens when current selection in a file changes, but can\nalso be triggered when file content changes." - } - ], - "documentation": "The reason why code actions were requested.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "FileOperationPatternKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "file", - "value": "file", - "documentation": "The pattern matches a file only." - }, - { - "name": "folder", - "value": "folder", - "documentation": "The pattern matches a folder only." - } - ], - "documentation": "A pattern kind describing if a glob pattern matches a file a folder or\nboth.\n\n@since 3.16.0", - "since": "3.16.0" - }, - { - "name": "NotebookCellKind", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Markup", - "value": 1, - "documentation": "A markup-cell is formatted source that is used for display." - }, - { - "name": "Code", - "value": 2, - "documentation": "A code-cell is source code." - } - ], - "documentation": "A notebook cell kind.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "ResourceOperationKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Create", - "value": "create", - "documentation": "Supports creating new files and folders." - }, - { - "name": "Rename", - "value": "rename", - "documentation": "Supports renaming existing files and folders." - }, - { - "name": "Delete", - "value": "delete", - "documentation": "Supports deleting existing files and folders." - } - ] - }, - { - "name": "FailureHandlingKind", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Abort", - "value": "abort", - "documentation": "Applying the workspace change is simply aborted if one of the changes provided\nfails. All operations executed before the failing operation stay executed." - }, - { - "name": "Transactional", - "value": "transactional", - "documentation": "All operations are executed transactional. That means they either all\nsucceed or no changes at all are applied to the workspace." - }, - { - "name": "TextOnlyTransactional", - "value": "textOnlyTransactional", - "documentation": "If the workspace edit contains only textual file changes they are executed transactional.\nIf resource changes (create, rename or delete file) are part of the change the failure\nhandling strategy is abort." - }, - { - "name": "Undo", - "value": "undo", - "documentation": "The client tries to undo the operations already executed. But there is no\nguarantee that this is succeeding." - } - ] - }, - { - "name": "PrepareSupportDefaultBehavior", - "type": { - "kind": "base", - "name": "uinteger" - }, - "values": [ - { - "name": "Identifier", - "value": 1, - "documentation": "The client's default behavior is to select the identifier\naccording the to language's syntax rule." - } - ] - }, - { - "name": "TokenFormat", - "type": { - "kind": "base", - "name": "string" - }, - "values": [ - { - "name": "Relative", - "value": "relative" - } - ] - } - ], - "typeAliases": [ - { - "name": "Definition", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Location" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - } - ] - }, - "documentation": "The definition of a symbol represented as one or many {@link Location locations}.\nFor most programming languages there is only one location at which a symbol is\ndefined.\n\nServers should prefer returning `DefinitionLink` over `Definition` if supported\nby the client." - }, - { - "name": "DefinitionLink", - "type": { - "kind": "reference", - "name": "LocationLink" - }, - "documentation": "Information about where a symbol is defined.\n\nProvides additional metadata over normal {@link Location location} definitions, including the range of\nthe defining symbol" - }, - { - "name": "LSPArray", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "LSPAny" - } - }, - "documentation": "LSP arrays.\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "LSPAny", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "LSPObject" - }, - { - "kind": "reference", - "name": "LSPArray" - }, - { - "kind": "base", - "name": "string" - }, - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "uinteger" - }, - { - "kind": "base", - "name": "decimal" - }, - { - "kind": "base", - "name": "boolean" - }, - { - "kind": "base", - "name": "null" - } - ] - }, - "documentation": "The LSP any type.\nPlease note that strictly speaking a property with the value `undefined`\ncan't be converted into JSON preserving the property name. However for\nconvenience it is allowed and assumed that all these properties are\noptional as well.\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "Declaration", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Location" - }, - { - "kind": "array", - "element": { - "kind": "reference", - "name": "Location" - } - } - ] - }, - "documentation": "The declaration of a symbol representation as one or many {@link Location locations}." - }, - { - "name": "DeclarationLink", - "type": { - "kind": "reference", - "name": "LocationLink" - }, - "documentation": "Information about where a symbol is declared.\n\nProvides additional metadata over normal {@link Location location} declarations, including the range of\nthe declaring symbol.\n\nServers should prefer returning `DeclarationLink` over `Declaration` if supported\nby the client." - }, - { - "name": "InlineValue", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "InlineValueText" - }, - { - "kind": "reference", - "name": "InlineValueVariableLookup" - }, - { - "kind": "reference", - "name": "InlineValueEvaluatableExpression" - } - ] - }, - "documentation": "Inline value information can be provided by different means:\n- directly as a text value (class InlineValueText).\n- as a name to use for a variable lookup (class InlineValueVariableLookup)\n- as an evaluatable expression (class InlineValueEvaluatableExpression)\nThe InlineValue types combines all inline value types into one type.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "DocumentDiagnosticReport", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "RelatedFullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "RelatedUnchangedDocumentDiagnosticReport" - } - ] - }, - "documentation": "The result of a document diagnostic pull request. A report can\neither be a full report containing all diagnostics for the\nrequested document or an unchanged report indicating that nothing\nhas changed in terms of diagnostics in comparison to the last\npull request.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "PrepareRenameResult", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Range" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - } - }, - { - "name": "placeholder", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "defaultBehavior", - "type": { - "kind": "base", - "name": "boolean" - } - } - ] - } - } - ] - } - }, - { - "name": "DocumentSelector", - "type": { - "kind": "array", - "element": { - "kind": "reference", - "name": "DocumentFilter" - } - }, - "documentation": "A document selector is the combination of one or many document filters.\n\n@sample `let sel:DocumentSelector = [{ language: 'typescript' }, { language: 'json', pattern: '**∕tsconfig.json' }]`;\n\nThe use of a string as a document filter is deprecated @since 3.16.0.", - "since": "3.16.0." - }, - { - "name": "ProgressToken", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "integer" - }, - { - "kind": "base", - "name": "string" - } - ] - } - }, - { - "name": "ChangeAnnotationIdentifier", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "An identifier to refer to a change annotation stored with a workspace edit." - }, - { - "name": "WorkspaceDocumentDiagnosticReport", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "WorkspaceFullDocumentDiagnosticReport" - }, - { - "kind": "reference", - "name": "WorkspaceUnchangedDocumentDiagnosticReport" - } - ] - }, - "documentation": "A workspace diagnostic document report.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentContentChangeEvent", - "type": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "range", - "type": { - "kind": "reference", - "name": "Range" - }, - "documentation": "The range of the document that changed." - }, - { - "name": "rangeLength", - "type": { - "kind": "base", - "name": "uinteger" - }, - "optional": true, - "documentation": "The optional length of the range that got replaced.\n\n@deprecated use range instead." - }, - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The new text for the provided range." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "text", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The new text of the whole document." - } - ] - } - } - ] - }, - "documentation": "An event describing a change to a text document. If only a text is provided\nit is considered to be the full content of the document." - }, - { - "name": "MarkedString", - "type": { - "kind": "or", - "items": [ - { - "kind": "base", - "name": "string" - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - } - }, - { - "name": "value", - "type": { - "kind": "base", - "name": "string" - } - } - ] - } - } - ] - }, - "documentation": "MarkedString can be used to render human readable text. It is either a markdown string\nor a code-block that provides a language and a code snippet. The language identifier\nis semantically equal to the optional language identifier in fenced code blocks in GitHub\nissues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting\n\nThe pair of a language and a value is an equivalent to markdown:\n```${language}\n${value}\n```\n\nNote that markdown strings will be sanitized - that means html will be escaped.\n@deprecated use MarkupContent instead.", - "deprecated": "use MarkupContent instead." - }, - { - "name": "DocumentFilter", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "TextDocumentFilter" - }, - { - "kind": "reference", - "name": "NotebookCellTextDocumentFilter" - } - ] - }, - "documentation": "A document filter describes a top level text document or\na notebook cell document.\n\n@since 3.17.0 - proposed support for NotebookCellTextDocumentFilter.", - "since": "3.17.0 - proposed support for NotebookCellTextDocumentFilter." - }, - { - "name": "LSPObject", - "type": { - "kind": "map", - "key": { - "kind": "base", - "name": "string" - }, - "value": { - "kind": "reference", - "name": "LSPAny" - } - }, - "documentation": "LSP object definition.\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "GlobPattern", - "type": { - "kind": "or", - "items": [ - { - "kind": "reference", - "name": "Pattern" - }, - { - "kind": "reference", - "name": "RelativePattern" - } - ] - }, - "documentation": "The glob pattern. Either a string pattern or a relative pattern.\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "TextDocumentFilter", - "type": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A language id, like `typescript`." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern, like `*.{ts,js}`." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A language id, like `typescript`." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern, like `*.{ts,js}`." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "language", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A language id, like `typescript`." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A glob pattern, like `*.{ts,js}`." - } - ] - } - } - ] - }, - "documentation": "A document filter denotes a document by different properties like\nthe {@link TextDocument.languageId language}, the {@link Uri.scheme scheme} of\nits resource, or a glob-pattern that is applied to the {@link TextDocument.fileName path}.\n\nGlob patterns can have the following syntax:\n- `*` to match one or more characters in a path segment\n- `?` to match on one character in a path segment\n- `**` to match any number of path segments, including none\n- `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)\n- `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)\n- `[!...]` 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`)\n\n@sample A language filter that applies to typescript files on disk: `{ language: 'typescript', scheme: 'file' }`\n@sample A language filter that applies to all package.json paths: `{ language: 'json', pattern: '**package.json' }`\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "NotebookDocumentFilter", - "type": { - "kind": "or", - "items": [ - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The type of the enclosing notebook." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The type of the enclosing notebook." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A glob pattern." - } - ] - } - }, - { - "kind": "literal", - "value": { - "properties": [ - { - "name": "notebookType", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "The type of the enclosing notebook." - }, - { - "name": "scheme", - "type": { - "kind": "base", - "name": "string" - }, - "optional": true, - "documentation": "A Uri {@link Uri.scheme scheme}, like `file` or `untitled`." - }, - { - "name": "pattern", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "A glob pattern." - } - ] - } - } - ] - }, - "documentation": "A notebook document filter denotes a notebook document by\ndifferent properties. The properties will be match\nagainst the notebook's URI (same as with documents)\n\n@since 3.17.0", - "since": "3.17.0" - }, - { - "name": "Pattern", - "type": { - "kind": "base", - "name": "string" - }, - "documentation": "The glob pattern to watch relative to the base path. Glob patterns can have the following syntax:\n- `*` to match one or more characters in a path segment\n- `?` to match on one character in a path segment\n- `**` to match any number of path segments, including none\n- `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)\n- `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)\n- `[!...]` 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`)\n\n@since 3.17.0", - "since": "3.17.0" - } - ] -} diff --git a/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.schema.json b/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.schema.json deleted file mode 100644 index f50cf3702..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.schema.json +++ /dev/null @@ -1,783 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "AndType": { - "additionalProperties": false, - "description": "Represents an `and`type (e.g. TextDocumentParams & WorkDoneProgressParams`).", - "properties": { - "items": { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "kind": { - "const": "and", - "type": "string" - } - }, - "required": [ - "kind", - "items" - ], - "type": "object" - }, - "ArrayType": { - "additionalProperties": false, - "description": "Represents an array type (e.g. `TextDocument[]`).", - "properties": { - "element": { - "$ref": "#/definitions/Type" - }, - "kind": { - "const": "array", - "type": "string" - } - }, - "required": [ - "kind", - "element" - ], - "type": "object" - }, - "BaseType": { - "additionalProperties": false, - "description": "Represents a base type like `string` or `DocumentUri`.", - "properties": { - "kind": { - "const": "base", - "type": "string" - }, - "name": { - "$ref": "#/definitions/BaseTypes" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - "BaseTypes": { - "enum": [ - "URI", - "DocumentUri", - "integer", - "uinteger", - "decimal", - "RegExp", - "string", - "boolean", - "null" - ], - "type": "string" - }, - "BooleanLiteralType": { - "additionalProperties": false, - "description": "Represents a boolean literal type (e.g. `kind: true`).", - "properties": { - "kind": { - "const": "booleanLiteral", - "type": "string" - }, - "value": { - "type": "boolean" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "Enumeration": { - "additionalProperties": false, - "description": "Defines an enumeration.", - "properties": { - "deprecated": { - "description": "Whether the enumeration is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The name of the enumeration.", - "type": "string" - }, - "proposed": { - "description": "Whether this is a proposed enumeration. If omitted, the enumeration is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this enumeration is available. Is undefined if not known.", - "type": "string" - }, - "supportsCustomValues": { - "description": "Whether the enumeration supports custom values (e.g. values which are not part of the set defined in `values`). If omitted no custom values are supported.", - "type": "boolean" - }, - "type": { - "$ref": "#/definitions/EnumerationType", - "description": "The type of the elements." - }, - "values": { - "description": "The enum values.", - "items": { - "$ref": "#/definitions/EnumerationEntry" - }, - "type": "array" - } - }, - "required": [ - "name", - "type", - "values" - ], - "type": "object" - }, - "EnumerationEntry": { - "additionalProperties": false, - "description": "Defines an enumeration entry.", - "properties": { - "deprecated": { - "description": "Whether the enum entry is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The name of the enum item.", - "type": "string" - }, - "proposed": { - "description": "Whether this is a proposed enumeration entry. If omitted, the enumeration entry is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this enumeration entry is available. Is undefined if not known.", - "type": "string" - }, - "value": { - "description": "The value.", - "type": [ - "string", - "number" - ] - } - }, - "required": [ - "name", - "value" - ], - "type": "object" - }, - "EnumerationType": { - "additionalProperties": false, - "properties": { - "kind": { - "const": "base", - "type": "string" - }, - "name": { - "enum": [ - "string", - "integer", - "uinteger" - ], - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - "IntegerLiteralType": { - "additionalProperties": false, - "properties": { - "kind": { - "const": "integerLiteral", - "description": "Represents an integer literal type (e.g. `kind: 1`).", - "type": "string" - }, - "value": { - "type": "number" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "MapKeyType": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "base", - "type": "string" - }, - "name": { - "enum": [ - "URI", - "DocumentUri", - "string", - "integer" - ], - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - { - "$ref": "#/definitions/ReferenceType" - } - ], - "description": "Represents a type that can be used as a key in a map type. If a reference type is used then the type must either resolve to a `string` or `integer` type. (e.g. `type ChangeAnnotationIdentifier === string`)." - }, - "MapType": { - "additionalProperties": false, - "description": "Represents a JSON object map (e.g. `interface Map { [key: K] => V; }`).", - "properties": { - "key": { - "$ref": "#/definitions/MapKeyType" - }, - "kind": { - "const": "map", - "type": "string" - }, - "value": { - "$ref": "#/definitions/Type" - } - }, - "required": [ - "kind", - "key", - "value" - ], - "type": "object" - }, - "MessageDirection": { - "description": "Indicates in which direction a message is sent in the protocol.", - "enum": [ - "clientToServer", - "serverToClient", - "both" - ], - "type": "string" - }, - "MetaData": { - "additionalProperties": false, - "properties": { - "version": { - "description": "The protocol version.", - "type": "string" - } - }, - "required": [ - "version" - ], - "type": "object" - }, - "MetaModel": { - "additionalProperties": false, - "description": "The actual meta model.", - "properties": { - "enumerations": { - "description": "The enumerations.", - "items": { - "$ref": "#/definitions/Enumeration" - }, - "type": "array" - }, - "metaData": { - "$ref": "#/definitions/MetaData", - "description": "Additional meta data." - }, - "notifications": { - "description": "The notifications.", - "items": { - "$ref": "#/definitions/Notification" - }, - "type": "array" - }, - "requests": { - "description": "The requests.", - "items": { - "$ref": "#/definitions/Request" - }, - "type": "array" - }, - "structures": { - "description": "The structures.", - "items": { - "$ref": "#/definitions/Structure" - }, - "type": "array" - }, - "typeAliases": { - "description": "The type aliases.", - "items": { - "$ref": "#/definitions/TypeAlias" - }, - "type": "array" - } - }, - "required": [ - "metaData", - "requests", - "notifications", - "structures", - "enumerations", - "typeAliases" - ], - "type": "object" - }, - "Notification": { - "additionalProperties": false, - "description": "Represents a LSP notification", - "properties": { - "deprecated": { - "description": "Whether the notification is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation;", - "type": "string" - }, - "messageDirection": { - "$ref": "#/definitions/MessageDirection", - "description": "The direction in which this notification is sent in the protocol." - }, - "method": { - "description": "The request's method name.", - "type": "string" - }, - "params": { - "anyOf": [ - { - "$ref": "#/definitions/Type" - }, - { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - } - ], - "description": "The parameter type(s) if any." - }, - "proposed": { - "description": "Whether this is a proposed notification. If omitted the notification is final.", - "type": "boolean" - }, - "registrationMethod": { - "description": "Optional a dynamic registration method if it different from the request's method.", - "type": "string" - }, - "registrationOptions": { - "$ref": "#/definitions/Type", - "description": "Optional registration options if the notification supports dynamic registration." - }, - "since": { - "description": "Since when (release number) this notification is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "method", - "messageDirection" - ], - "type": "object" - }, - "OrType": { - "additionalProperties": false, - "description": "Represents an `or` type (e.g. `Location | LocationLink`).", - "properties": { - "items": { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "kind": { - "const": "or", - "type": "string" - } - }, - "required": [ - "kind", - "items" - ], - "type": "object" - }, - "Property": { - "additionalProperties": false, - "description": "Represents an object property.", - "properties": { - "deprecated": { - "description": "Whether the property is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The property name;", - "type": "string" - }, - "optional": { - "description": "Whether the property is optional. If omitted, the property is mandatory.", - "type": "boolean" - }, - "proposed": { - "description": "Whether this is a proposed property. If omitted, the structure is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this property is available. Is undefined if not known.", - "type": "string" - }, - "type": { - "$ref": "#/definitions/Type", - "description": "The type of the property" - } - }, - "required": [ - "name", - "type" - ], - "type": "object" - }, - "ReferenceType": { - "additionalProperties": false, - "description": "Represents a reference to another type (e.g. `TextDocument`). This is either a `Structure`, a `Enumeration` or a `TypeAlias` in the same meta model.", - "properties": { - "kind": { - "const": "reference", - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, - "Request": { - "additionalProperties": false, - "description": "Represents a LSP request", - "properties": { - "deprecated": { - "description": "Whether the request is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation;", - "type": "string" - }, - "errorData": { - "$ref": "#/definitions/Type", - "description": "An optional error data type." - }, - "messageDirection": { - "$ref": "#/definitions/MessageDirection", - "description": "The direction in which this request is sent in the protocol." - }, - "method": { - "description": "The request's method name.", - "type": "string" - }, - "params": { - "anyOf": [ - { - "$ref": "#/definitions/Type" - }, - { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - } - ], - "description": "The parameter type(s) if any." - }, - "partialResult": { - "$ref": "#/definitions/Type", - "description": "Optional partial result type if the request supports partial result reporting." - }, - "proposed": { - "description": "Whether this is a proposed feature. If omitted the feature is final.", - "type": "boolean" - }, - "registrationMethod": { - "description": "Optional a dynamic registration method if it different from the request's method.", - "type": "string" - }, - "registrationOptions": { - "$ref": "#/definitions/Type", - "description": "Optional registration options if the request supports dynamic registration." - }, - "result": { - "$ref": "#/definitions/Type", - "description": "The result type." - }, - "since": { - "description": "Since when (release number) this request is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "method", - "result", - "messageDirection" - ], - "type": "object" - }, - "StringLiteralType": { - "additionalProperties": false, - "description": "Represents a string literal type (e.g. `kind: 'rename'`).", - "properties": { - "kind": { - "const": "stringLiteral", - "type": "string" - }, - "value": { - "type": "string" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "Structure": { - "additionalProperties": false, - "description": "Defines the structure of an object literal.", - "properties": { - "deprecated": { - "description": "Whether the structure is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation;", - "type": "string" - }, - "extends": { - "description": "Structures extended from. This structures form a polymorphic type hierarchy.", - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "mixins": { - "description": "Structures to mix in. The properties of these structures are `copied` into this structure. Mixins don't form a polymorphic type hierarchy in LSP.", - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "name": { - "description": "The name of the structure.", - "type": "string" - }, - "properties": { - "description": "The properties.", - "items": { - "$ref": "#/definitions/Property" - }, - "type": "array" - }, - "proposed": { - "description": "Whether this is a proposed structure. If omitted, the structure is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this structure is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "name", - "properties" - ], - "type": "object" - }, - "StructureLiteral": { - "additionalProperties": false, - "description": "Defines a unnamed structure of an object literal.", - "properties": { - "deprecated": { - "description": "Whether the literal is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "properties": { - "description": "The properties.", - "items": { - "$ref": "#/definitions/Property" - }, - "type": "array" - }, - "proposed": { - "description": "Whether this is a proposed structure. If omitted, the structure is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this structure is available. Is undefined if not known.", - "type": "string" - } - }, - "required": [ - "properties" - ], - "type": "object" - }, - "StructureLiteralType": { - "additionalProperties": false, - "description": "Represents a literal structure (e.g. `property: { start: uinteger; end: uinteger; }`).", - "properties": { - "kind": { - "const": "literal", - "type": "string" - }, - "value": { - "$ref": "#/definitions/StructureLiteral" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - "TupleType": { - "additionalProperties": false, - "description": "Represents a `tuple` type (e.g. `[integer, integer]`).", - "properties": { - "items": { - "items": { - "$ref": "#/definitions/Type" - }, - "type": "array" - }, - "kind": { - "const": "tuple", - "type": "string" - } - }, - "required": [ - "kind", - "items" - ], - "type": "object" - }, - "Type": { - "anyOf": [ - { - "$ref": "#/definitions/BaseType" - }, - { - "$ref": "#/definitions/ReferenceType" - }, - { - "$ref": "#/definitions/ArrayType" - }, - { - "$ref": "#/definitions/MapType" - }, - { - "$ref": "#/definitions/AndType" - }, - { - "$ref": "#/definitions/OrType" - }, - { - "$ref": "#/definitions/TupleType" - }, - { - "$ref": "#/definitions/StructureLiteralType" - }, - { - "$ref": "#/definitions/StringLiteralType" - }, - { - "$ref": "#/definitions/IntegerLiteralType" - }, - { - "$ref": "#/definitions/BooleanLiteralType" - } - ] - }, - "TypeAlias": { - "additionalProperties": false, - "description": "Defines a type alias. (e.g. `type Definition = Location | LocationLink`)", - "properties": { - "deprecated": { - "description": "Whether the type alias is deprecated or not. If deprecated the property contains the deprecation message.", - "type": "string" - }, - "documentation": { - "description": "An optional documentation.", - "type": "string" - }, - "name": { - "description": "The name of the type alias.", - "type": "string" - }, - "proposed": { - "description": "Whether this is a proposed type alias. If omitted, the type alias is final.", - "type": "boolean" - }, - "since": { - "description": "Since when (release number) this structure is available. Is undefined if not known.", - "type": "string" - }, - "type": { - "$ref": "#/definitions/Type", - "description": "The aliased type." - } - }, - "required": [ - "name", - "type" - ], - "type": "object" - }, - "TypeKind": { - "enum": [ - "base", - "reference", - "array", - "map", - "and", - "or", - "tuple", - "literal", - "stringLiteral", - "integerLiteral", - "booleanLiteral" - ], - "type": "string" - } - } -} diff --git a/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.ts b/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.ts deleted file mode 100644 index d8d525857..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/metaModel/metaModel.ts +++ /dev/null @@ -1,551 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -export type BaseTypes = 'URI' | 'DocumentUri' | 'integer' | 'uinteger' | 'decimal' | 'RegExp' | 'string' | 'boolean' | 'null'; - -export type TypeKind = 'base' | 'reference' | 'array' | 'map' | 'and' | 'or' | 'tuple' | 'literal' | 'stringLiteral' | 'integerLiteral' | 'booleanLiteral'; - -/** - * Indicates in which direction a message is sent in the protocol. - */ -export type MessageDirection = 'clientToServer' | 'serverToClient' | 'both'; - -/** - * Represents a base type like `string` or `DocumentUri`. - */ -export type BaseType = { - kind: 'base'; - name: BaseTypes; -}; - -/** - * Represents a reference to another type (e.g. `TextDocument`). - * This is either a `Structure`, a `Enumeration` or a `TypeAlias` - * in the same meta model. - */ -export type ReferenceType = { - kind: 'reference'; - name: string; -}; - -/** - * Represents an array type (e.g. `TextDocument[]`). - */ -export type ArrayType = { - kind: 'array'; - element: Type; -}; - -/** - * Represents a type that can be used as a key in a - * map type. If a reference type is used then the - * type must either resolve to a `string` or `integer` - * type. (e.g. `type ChangeAnnotationIdentifier === string`). - */ -export type MapKeyType = { kind: 'base'; name: 'URI' | 'DocumentUri' | 'string' | 'integer' } | ReferenceType; - -/** - * Represents a JSON object map - * (e.g. `interface Map { [key: K] => V; }`). - */ -export type MapType = { - kind: 'map'; - key: MapKeyType; - value: Type; -}; - -/** - * Represents an `and`type - * (e.g. TextDocumentParams & WorkDoneProgressParams`). - */ -export type AndType = { - kind: 'and'; - items: Type[]; -}; - -/** - * Represents an `or` type - * (e.g. `Location | LocationLink`). - */ -export type OrType = { - kind: 'or'; - items: Type[]; -}; - -/** - * Represents a `tuple` type - * (e.g. `[integer, integer]`). - */ -export type TupleType = { - kind: 'tuple'; - items: Type[]; -}; - -/** - * Represents a literal structure - * (e.g. `property: { start: uinteger; end: uinteger; }`). - */ -export type StructureLiteralType = { - kind: 'literal'; - value: StructureLiteral; -}; - -/** - * Represents a string literal type - * (e.g. `kind: 'rename'`). - */ -export type StringLiteralType = { - kind: 'stringLiteral'; - value: string; -}; - -export type IntegerLiteralType = { - /** - * Represents an integer literal type - * (e.g. `kind: 1`). - */ - kind: 'integerLiteral'; - value: number; -}; - -/** - * Represents a boolean literal type - * (e.g. `kind: true`). - */ -export type BooleanLiteralType = { - kind: 'booleanLiteral'; - value: boolean; -}; - -export type Type = BaseType | ReferenceType | ArrayType | MapType | AndType | OrType | TupleType | StructureLiteralType | StringLiteralType | IntegerLiteralType | BooleanLiteralType; - -/** - * Represents a LSP request - */ -export type Request = { - /** - * The request's method name. - */ - method: string; - - /** - * The parameter type(s) if any. - */ - params?: Type | Type[]; - - /** - * The result type. - */ - result: Type; - - /** - * Optional partial result type if the request - * supports partial result reporting. - */ - partialResult?: Type; - - /** - * An optional error data type. - */ - errorData?: Type; - - /** - * Optional a dynamic registration method if it - * different from the request's method. - */ - registrationMethod?: string; - - /** - * Optional registration options if the request - * supports dynamic registration. - */ - registrationOptions?: Type; - - /** - * The direction in which this request is sent - * in the protocol. - */ - messageDirection: MessageDirection; - - /** - * An optional documentation; - */ - documentation?: string; - - /** - * Since when (release number) this request is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed feature. If omitted - * the feature is final. - */ - proposed?: boolean; - - /** - * Whether the request is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Represents a LSP notification - */ -export type Notification = { - /** - * The request's method name. - */ - method: string; - - /** - * The parameter type(s) if any. - */ - params?: Type | Type[]; - - /** - * Optional a dynamic registration method if it - * different from the request's method. - */ - registrationMethod?: string; - - /** - * Optional registration options if the notification - * supports dynamic registration. - */ - registrationOptions?: Type; - - /** - * The direction in which this notification is sent - * in the protocol. - */ - messageDirection: MessageDirection; - - /** - * An optional documentation; - */ - documentation?: string; - - /** - * Since when (release number) this notification is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed notification. If omitted - * the notification is final. - */ - proposed?: boolean; - - /** - * Whether the notification is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Represents an object property. - */ -export type Property = { - /** - * The property name; - */ - name: string; - - /** - * The type of the property - */ - type: Type; - - /** - * Whether the property is optional. If - * omitted, the property is mandatory. - */ - optional?: boolean; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this property is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed property. If omitted, - * the structure is final. - */ - proposed?: boolean; - - /** - * Whether the property is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines the structure of an object literal. - */ -export type Structure = { - /** - * The name of the structure. - */ - name: string; - - /** - * Structures extended from. This structures form - * a polymorphic type hierarchy. - */ - extends?: Type[]; - - /** - * Structures to mix in. The properties of these - * structures are `copied` into this structure. - * Mixins don't form a polymorphic type hierarchy in - * LSP. - */ - mixins?: Type[]; - - /** - * The properties. - */ - properties: Property[]; - - /** - * An optional documentation; - */ - documentation?: string; - - /** - * Since when (release number) this structure is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed structure. If omitted, - * the structure is final. - */ - proposed?: boolean; - - /** - * Whether the structure is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines a unnamed structure of an object literal. - */ -export type StructureLiteral = { - - /** - * The properties. - */ - properties: Property[]; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this structure is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed structure. If omitted, - * the structure is final. - */ - proposed?: boolean; - - /** - * Whether the literal is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines a type alias. - * (e.g. `type Definition = Location | LocationLink`) - */ -export type TypeAlias = { - /** - * The name of the type alias. - */ - name: string; - - /** - * The aliased type. - */ - type: Type; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this structure is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed type alias. If omitted, - * the type alias is final. - */ - proposed?: boolean; - - /** - * Whether the type alias is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -/** - * Defines an enumeration entry. - */ -export type EnumerationEntry = { - /** - * The name of the enum item. - */ - name: string; - - /** - * The value. - */ - value: string | number; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this enumeration entry is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed enumeration entry. If omitted, - * the enumeration entry is final. - */ - proposed?: boolean; - - /** - * Whether the enum entry is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -export type EnumerationType = { kind: 'base'; name: 'string' | 'integer' | 'uinteger' }; - -/** - * Defines an enumeration. - */ -export type Enumeration = { - /** - * The name of the enumeration. - */ - name: string; - - /** - * The type of the elements. - */ - type: EnumerationType; - - /** - * The enum values. - */ - values: EnumerationEntry[]; - - /** - * Whether the enumeration supports custom values (e.g. values which are not - * part of the set defined in `values`). If omitted no custom values are - * supported. - */ - supportsCustomValues?: boolean; - - /** - * An optional documentation. - */ - documentation?: string; - - /** - * Since when (release number) this enumeration is - * available. Is undefined if not known. - */ - since?: string; - - /** - * Whether this is a proposed enumeration. If omitted, - * the enumeration is final. - */ - proposed?: boolean; - - /** - * Whether the enumeration is deprecated or not. If deprecated - * the property contains the deprecation message. - */ - deprecated?: string; -}; - -export type MetaData = { - /** - * The protocol version. - */ - version: string; -}; - -/** - * The actual meta model. - */ -export type MetaModel = { - /** - * Additional meta data. - */ - metaData: MetaData; - - /** - * The requests. - */ - requests: Request[]; - - /** - * The notifications. - */ - notifications: Notification[]; - - /** - * The structures. - */ - structures: Structure[]; - - /** - * The enumerations. - */ - enumerations: Enumeration[]; - - /** - * The type aliases. - */ - typeAliases: TypeAlias[]; -}; diff --git a/language-server-protocol/_specifications/lsp/3.18/notebookDocument/notebook.md b/language-server-protocol/_specifications/lsp/3.18/notebookDocument/notebook.md deleted file mode 100644 index 67b585bb9..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/notebookDocument/notebook.md +++ /dev/null @@ -1,617 +0,0 @@ -### Notebook Document Synchronization - -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: - -- *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. - -The two concepts are defined as follows: - -
- -```typescript -/** - * A notebook document. - * - * @since 3.17.0 - */ -export interface NotebookDocument { - - /** - * 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[]; -} -``` - -
- - -```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; -} -``` - -
- -```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; -} -``` - -
- -```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: - -
- -```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; -} -``` - -
- -```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/**/; -``` -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 `notebookDocument/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 - -
- -```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; - - /** - * The client supports sending execution summary data per cell. - */ - executionSummarySupport?: 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: - -
- -```typescript -/** - * Options specific to a notebook plus its cells - * to be synced to the server. - * - * If a selector provides 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 - * documents 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. - */ - notebook: 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. - */ - notebook?: 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: - -
- -```typescript -/** - * Registration options specific to a notebook. - * - * @since 3.17.0 - */ -export interface NotebookDocumentSyncRegistrationOptions extends - NotebookDocumentSyncOptions, StaticRegistrationOptions { -} -``` - -#### DidOpenNotebookDocument Notification (:arrow_right:) - -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: - -
- -```typescript -/** - * The params sent in an 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[]; -} -``` - -#### DidChangeNotebookDocument Notification (:arrow_right:) - -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: - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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[]; - }[]; - }; -} -``` - -
- -```typescript -/** - * A change describing how to move a `NotebookCell` - * array from state S to S'. - * - * @since 3.17.0 - */ -export interface NotebookCellArrayChange { - /** - * The start offset of the cell that changed. - */ - start: uinteger; - - /** - * The deleted cells - */ - deleteCount: uinteger; - - /** - * The new cells, if any - */ - cells?: NotebookCell[]; -} -``` - -#### DidSaveNotebookDocument Notification (:arrow_right:) - -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_: - -
- -* method: `notebookDocument/didSave` -* params: `DidSaveNotebookDocumentParams` defined as follows: - -
- -```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; -} -``` - -#### DidCloseNotebookDocument Notification (:arrow_right:) - -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_: - -
- -* method: `notebookDocument/didClose` -* params: `DidCloseNotebookDocumentParams` defined as follows: - -
- -```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[]; -} -``` - -
- -```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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/specification.md b/language-server-protocol/_specifications/lsp/3.18/specification.md deleted file mode 100644 index 76752d445..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/specification.md +++ /dev/null @@ -1,866 +0,0 @@ ---- -title: Specification -shortTitle: 3.18 (Upcoming) -layout: specifications -sectionid: specification-3-18 -toc: specification-3-18-toc -fullTitle: Language Server Protocol Specification - 3.18 -index: 2 ---- - -This document describes the upcoming 3.18.x version of the language server protocol and is under development. An implementation for node of the 3.18.x version of the protocol can be found [here](https://github.com/Microsoft/vscode-languageserver-node). - -**Note:** edits to this specification can be made via a pull request against this markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/specification.md). - -## What's new in 3.18 - -All new 3.18 features are tagged with a corresponding since version 3.18 text or in JSDoc using `@since 3.18.0` annotation. - -A detailed list of the changes can be found in the [change log](#version_3_18_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. - -## Base Protocol - -The base protocol consists of a header and a content part (comparable to HTTP). The header and content part are -separated by a '\r\n'. - -### Header Part - -The header part consists of header fields. Each header field is comprised of a name and a value, separated by ': ' (a colon and a space). The structure of header fields conform to the [HTTP semantic](https://tools.ietf.org/html/rfc7230#section-3.2). Each header field is terminated by '\r\n'. Considering the last header field and the overall header itself are each terminated with '\r\n', and that at least one header is mandatory, this means that two '\r\n' sequences always immediately precede the content part of a message. - -Currently the following header fields are supported: - -| Header Field Name | Value Type | Description | -|:------------------|:------------|:------------| -| Content-Length | number | The length of the content part in bytes. This header is required. | -| Content-Type | string | The mime type of the content part. Defaults to application/vscode-jsonrpc; charset=utf-8 | -{: .table .table-bordered .table-responsive} - -The header part is encoded using the 'ascii' encoding. This includes the '\r\n' separating the header and content part. - -### Content Part - -Contains the actual content of the message. The content part of a message uses [JSON-RPC](http://www.jsonrpc.org/) to describe requests, responses and notifications. The content part is encoded using the charset provided in the Content-Type field. It defaults to `utf-8`, which is the only encoding supported right now. If a server or client receives a header with a different encoding than `utf-8` it should respond with an error. - -(Prior versions of the protocol used the string constant `utf8` which is not a correct encoding constant according to [specification](http://www.iana.org/assignments/character-sets/character-sets.xhtml).) For backwards compatibility it is highly recommended that a client and a server treats the string `utf8` as `utf-8`. - -### Example: - -``` -Content-Length: ...\r\n -\r\n -{ - "jsonrpc": "2.0", - "id": 1, - "method": "textDocument/didOpen", - "params": { - ... - } -} -``` -### Base Protocol JSON structures - -The following TypeScript definitions describe the base [JSON-RPC protocol](http://www.jsonrpc.org/specification): - -#### Base Types - -The protocol use the following definitions for integers, unsigned integers, decimal numbers, objects and arrays: - -
- -```typescript -/** - * Defines an integer number in the range of -2^31 to 2^31 - 1. - */ -export type integer = number; -``` - -
- -```typescript -/** - * Defines an unsigned integer number in the range of 0 to 2^31 - 1. - */ -export type uinteger = number; -``` - -
- -```typescript -/** - * Defines a decimal number. Since decimal numbers are very - * rare in the language server specification we denote the - * exact range with every decimal using the mathematics - * interval notation (e.g. [0, 1] denotes all decimals d with - * 0 <= d <= 1. - */ -export type decimal = number; -``` - -
- -```typescript -/** - * The LSP any type - * - * @since 3.17.0 - */ -export type LSPAny = LSPObject | LSPArray | string | integer | uinteger | - decimal | boolean | null; -``` - -
- -```typescript -/** - * LSP object definition. - * - * @since 3.17.0 - */ -export type LSPObject = { [key: string]: LSPAny }; -``` - -
- -```typescript -/** - * LSP arrays. - * - * @since 3.17.0 - */ -export type LSPArray = LSPAny[]; -``` - -#### Abstract Message - -A general message as defined by JSON-RPC. The language server protocol always uses "2.0" as the `jsonrpc` version. - -
- -```typescript -interface Message { - jsonrpc: string; -} -``` -#### Request Message - -A request message to describe a request between the client and the server. Every processed request must send a response back to the sender of the request. - -```typescript -interface RequestMessage extends Message { - - /** - * The request id. - */ - id: integer | string; - - /** - * The method to be invoked. - */ - method: string; - - /** - * The method's params. - */ - params?: array | object; -} -``` - -#### Response Message - -A Response Message sent as a result of a request. If a request doesn't provide a result value the receiver of a request still needs to return a response message to conform to the JSON-RPC specification. The result property of the ResponseMessage should be set to `null` in this case to signal a successful request. - -```typescript -interface ResponseMessage extends Message { - /** - * The request id. - */ - id: integer | string | null; - - /** - * The result of a request. This member is REQUIRED on success. - * This member MUST NOT exist if there was an error invoking the method. - */ - result?: string | number | boolean | object | null; - - /** - * The error object in case a request fails. - */ - error?: ResponseError; -} -``` - -
- -```typescript -interface ResponseError { - /** - * A number indicating the error type that occurred. - */ - code: integer; - - /** - * A string providing a short description of the error. - */ - message: string; - - /** - * A primitive or structured value that contains additional - * information about the error. Can be omitted. - */ - data?: string | number | boolean | array | object | null; -} -``` - -
- -```typescript -export namespace ErrorCodes { - // Defined by JSON-RPC - export const ParseError: integer = -32700; - export const InvalidRequest: integer = -32600; - export const MethodNotFound: integer = -32601; - export const InvalidParams: integer = -32602; - export const InternalError: integer = -32603; - - /** - * This is the start range of JSON-RPC reserved error codes. - * It doesn't denote a real error code. No LSP error codes should - * be defined between the start and end range. For backwards - * compatibility the `ServerNotInitialized` and the `UnknownErrorCode` - * are left in the range. - * - * @since 3.16.0 - */ - export const jsonrpcReservedErrorRangeStart: integer = -32099; - /** @deprecated use jsonrpcReservedErrorRangeStart */ - export const serverErrorStart: integer = jsonrpcReservedErrorRangeStart; - - /** - * Error code indicating that a server received a notification or - * request before the server has received the `initialize` request. - */ - export const ServerNotInitialized: integer = -32002; - export const UnknownErrorCode: integer = -32001; - - /** - * This is the end range of JSON-RPC reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - export const jsonrpcReservedErrorRangeEnd = -32000; - /** @deprecated use jsonrpcReservedErrorRangeEnd */ - export const serverErrorEnd: integer = jsonrpcReservedErrorRangeEnd; - - /** - * This is the start range of LSP reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - 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; - - /** - * This is the end range of LSP reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - export const lspReservedErrorRangeEnd: integer = -32800; -} -``` -#### Notification Message - -A notification message. A processed notification message must not send a response back. They work like events. - -```typescript -interface NotificationMessage extends Message { - /** - * The method to be invoked. - */ - method: string; - - /** - * The notification's params. - */ - params?: array | object; -} -``` - -#### $ Notifications and Requests - -Notification and requests whose methods start with '\$/' are messages which are protocol implementation dependent and might not be implementable in all clients or servers. For example, if the server implementation uses a single threaded synchronous programming language then there is little a server can do to react to a `$/cancelRequest` notification. If a server or client receives notifications starting with '\$/' it is free to ignore the notification. If a server or client receives a request starting with '\$/' it must error the request with error code `MethodNotFound` (e.g. `-32601`). - -#### Cancellation Support (:arrow_right: :arrow_left:) - -The base protocol offers support for request cancellation. To cancel a request, a notification message with the following properties is sent: - -_Notification_: -* method: '$/cancelRequest' -* params: `CancelParams` defined as follows: - -```typescript -interface CancelParams { - /** - * The request id to cancel. - */ - id: integer | string; -} -``` - -A request that got canceled still needs to return from the server and send a response back. It can not be left open / hanging. This is in line with the JSON-RPC protocol that requires that every request sends a response back. In addition it allows for returning partial results on cancel. If the request returns an error response on cancellation it is advised to set the error code to `ErrorCodes.RequestCancelled`. - -#### Progress Support (:arrow_right: :arrow_left:) - -> *Since version 3.15.0* - -The base protocol offers also support to report progress in a generic fashion. This mechanism can be used to report any kind of progress including [work done progress](#workDoneProgress) (usually used to report progress in the user interface using a progress bar) and partial result progress to support streaming of results. - -A progress notification has the following properties: - -_Notification_: -* method: '$/progress' -* params: `ProgressParams` defined as follows: - -```typescript -type ProgressToken = integer | string; -``` - -```typescript -interface ProgressParams { - /** - * The progress token provided by the client or server. - */ - token: ProgressToken; - - /** - * The progress data. - */ - value: T; -} -``` - -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 - -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. - -### Capabilities - -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. - -### 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. - -### Message Documentation - -As said LSP defines a set of requests, responses and notifications. Each of those are documented 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. - - -### Basic JSON Structures - -There are quite some JSON structures that are shared between different requests and notifications. Their structure and capabilities are documented in this section. - -{% include_relative types/uri.md %} -{% include_relative types/regexp.md %} -{% include_relative types/enumerations.md %} - -{% include_relative types/textDocuments.md %} -{% include_relative types/position.md %} -{% include_relative types/range.md %} -{% include_relative types/textDocumentItem.md %} -{% include_relative types/textDocumentIdentifier.md %} -{% include_relative types/versionedTextDocumentIdentifier.md %} -{% include_relative types/textDocumentPositionParams.md %} -{% include_relative types/documentFilter.md %} - -{% include_relative types/textEdit.md %} -{% include_relative types/textEditArray.md %} -{% include_relative types/textDocumentEdit.md %} -{% include_relative types/location.md %} -{% include_relative types/locationLink.md %} -{% include_relative types/diagnostic.md %} -{% include_relative types/command.md %} -{% include_relative types/markupContent.md %} -{% include_relative types/resourceChanges.md %} -{% include_relative types/workspaceEdit.md %} - -{% include_relative types/workDoneProgress.md %} -{% include_relative types/partialResults.md %} -{% include_relative types/partialResultParams.md %} -{% include_relative types/traceValue.md %} - -### Server lifecycle - -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. - -{% include_relative general/initialize.md %} -{% include_relative general/initialized.md %} -{% include_relative client/registerCapability.md %} -{% include_relative client/unregisterCapability.md %} -{% include_relative general/setTrace.md %} -{% include_relative general/logTrace.md %} -{% include_relative general/shutdown.md %} -{% include_relative general/exit.md %} - -### Text Document Synchronization - -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). - -_Client Capability_: -* property path (optional): `textDocument.synchronization.dynamicRegistration` -* property type: `boolean` - -Controls whether text document synchronization supports dynamic registration. - -_Server Capability_: -* 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): - -
- -```typescript -/** - * Defines how the host (editor) should sync document changes to the language - * server. - */ -export namespace TextDocumentSyncKind { - /** - * Documents should not be synced at all. - */ - export const None = 0; - - /** - * Documents are synced by always sending the full content - * of the document. - */ - export const Full = 1; - - /** - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * sent. - */ - export const Incremental = 2; -} - -export type TextDocumentSyncKind = 0 | 1 | 2; -``` - -
- -```typescript -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. If omitted open - * close notifications should not be sent. - */ - openClose?: boolean; - - /** - * Change notifications are sent to the server. See - * TextDocumentSyncKind.None, TextDocumentSyncKind.Full and - * TextDocumentSyncKind.Incremental. If omitted it defaults to - * TextDocumentSyncKind.None. - */ - change?: TextDocumentSyncKind; -} -``` - -{% include_relative textDocument/didOpen.md %} -{% include_relative textDocument/didChange.md %} -{% include_relative textDocument/willSave.md %} -{% include_relative textDocument/willSaveWaitUntil.md %} -{% include_relative textDocument/didSave.md %} -{% include_relative textDocument/didClose.md %} -{% include_relative textDocument/didRename.md %} - -The final structure of the `TextDocumentSyncClientCapabilities` and the `TextDocumentSyncOptions` server options look like this - -
- -```typescript -export interface TextDocumentSyncClientCapabilities { - /** - * Whether text document synchronization supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports sending will save notifications. - */ - willSave?: boolean; - - /** - * The client supports sending a will save request and - * waits for a response providing text edits which will - * be applied to the document before it is saved. - */ - willSaveWaitUntil?: boolean; - - /** - * The client supports did save notifications. - */ - didSave?: boolean; -} -``` - -
- -```typescript -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. If omitted open - * close notification should not be sent. - */ - openClose?: boolean; - /** - * Change notifications are sent to the server. See - * TextDocumentSyncKind.None, TextDocumentSyncKind.Full and - * TextDocumentSyncKind.Incremental. If omitted it defaults to - * TextDocumentSyncKind.None. - */ - change?: TextDocumentSyncKind; - /** - * If present will save notifications are sent to the server. If omitted - * the notification should not be sent. - */ - willSave?: boolean; - /** - * If present will save wait until requests are sent to the server. If - * omitted the request should not be sent. - */ - willSaveWaitUntil?: boolean; - /** - * If present save notifications are sent to the server. If omitted the - * notification should not be sent. - */ - save?: boolean | SaveOptions; -} -``` - -{% include_relative notebookDocument/notebook.md %} - -### Language Features - -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. - -{% include_relative language/declaration.md %} -{% include_relative language/definition.md %} -{% include_relative language/typeDefinition.md %} -{% include_relative language/implementation.md %} -{% include_relative language/references.md %} -{% include_relative language/callHierarchy.md %} -{% include_relative language/typeHierarchy.md %} -{% include_relative language/documentHighlight.md %} -{% include_relative language/documentLink.md %} -{% include_relative language/hover.md %} -{% include_relative language/codeLens.md %} -{% include_relative language/foldingRange.md %} -{% include_relative language/selectionRange.md %} -{% include_relative language/documentSymbol.md %} -{% include_relative language/semanticTokens.md %} -{% include_relative language/inlayHint.md %} -{% include_relative language/inlineValue.md %} -{% include_relative language/moniker.md %} -{% include_relative language/completion.md %} -{% include_relative language/publishDiagnostics.md %} -{% include_relative language/pullDiagnostics.md %} -{% include_relative language/signatureHelp.md %} -{% include_relative language/codeAction.md %} -{% include_relative language/documentColor.md %} -{% include_relative language/colorPresentation.md %} -{% include_relative language/formatting.md %} -{% include_relative language/rangeFormatting.md %} -{% include_relative language/onTypeFormatting.md %} -{% include_relative language/rename.md %} -{% include_relative language/linkedEditingRange.md %} - -### Workspace Features - -{% include_relative workspace/symbol.md %} -{% include_relative workspace/configuration.md %} -{% include_relative workspace/didChangeConfiguration.md %} -{% include_relative workspace/workspaceFolders.md %} -{% include_relative workspace/didChangeWorkspaceFolders.md %} -{% include_relative workspace/willCreateFiles.md %} -{% include_relative workspace/didCreateFiles.md %} -{% include_relative workspace/willRenameFiles.md %} -{% include_relative workspace/didRenameFiles.md %} -{% include_relative workspace/willDeleteFiles.md %} -{% include_relative workspace/didDeleteFiles.md %} -{% include_relative workspace/didChangeWatchedFiles.md %} -{% include_relative workspace/executeCommand.md %} -{% include_relative workspace/applyEdit.md %} - -### Window Features - -{% include_relative window/showMessage.md %} -{% include_relative window/showMessageRequest.md %} -{% include_relative window/showDocument.md %} -{% include_relative window/logMessage.md %} -{% include_relative window/workDoneProgressCreate.md %} -{% include_relative window/workDoneProgressCancel.md %} -{% include_relative telemetry/event.md %} - -#### Miscellaneous - -#### Implementation Considerations - -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: - -- if a client sends a request to the server and the client state changes in a way that it invalidates the response it should do the following: - - cancel the server request and ignore the result if the result is not useful for the client anymore. If necessary the client should resend the request. - - 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 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: - -- **stdio**: uses stdio as the communication channel. -- **pipe**: use pipes (Windows) or socket files (Linux, Mac) as the communication channel. The pipe / socket file name is passed as the next arg or with `--pipe=`. -- **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`. - -#### Meta Model - -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. - -### Change Log - -#### 3.18.0 (mm/dd/yyyy) - -#### 3.17.0 (05/10/2022) - -* 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. - -#### 3.16.0 (12/14/2020) - -* Add support for tracing. -* Add semantic token support. -* Add call hierarchy support. -* Add client capability for resolving text edits on completion items. -* Add support for client default behavior on renames. -* Add support for insert and replace ranges on `CompletionItem`. -* Add support for diagnostic code descriptions. -* Add support for document symbol provider label. -* Add support for tags on `SymbolInformation` and `DocumentSymbol`. -* Add support for moniker request method. -* Add support for code action `data` property. -* Add support for code action `disabled` property. -* Add support for code action resolve request. -* Add support for diagnostic `data` property. -* Add support for signature information `activeParameter` property. -* Add support for `workspace/didCreateFiles` notifications and `workspace/willCreateFiles` requests. -* Add support for `workspace/didRenameFiles` notifications and `workspace/willRenameFiles` requests. -* Add support for `workspace/didDeleteFiles` notifications and `workspace/willDeleteFiles` requests. -* Add client capability to signal whether the client normalizes line endings. -* Add support to preserve additional attributes on `MessageActionItem`. -* Add support to provide the clients locale in the initialize call. -* Add support for opening and showing a document in the client user interface. -* Add support for linked editing. -* Add support for change annotations in text edits as well as in create file, rename file and delete file operations. - -#### 3.15.0 (01/14/2020) - -* Add generic progress reporting support. -* Add specific work done progress reporting support to requests where applicable. -* Add specific partial result progress support to requests where applicable. -* Add support for `textDocument/selectionRange`. -* Add support for server and client information. -* Add signature help context. -* Add Erlang and Elixir to the list of supported programming languages -* Add `version` on `PublishDiagnosticsParams` -* Add `CodeAction#isPreferred` support. -* Add `CompletionItem#tag` support. -* Add `Diagnostic#tag` support. -* Add `DocumentLink#tooltip` support. -* Add `trimTrailingWhitespace`, `insertFinalNewline` and `trimFinalNewlines` to `FormattingOptions`. -* Clarified `WorkspaceSymbolParams#query` parameter. - - -#### 3.14.0 (12/13/2018) - -* Add support for signature label offsets. -* Add support for location links. -* Add support for `textDocument/declaration` request. - -#### 3.13.0 (9/11/2018) - -* Add support for file and folder operations (create, rename, move) to workspace edits. - -#### 3.12.0 (8/23/2018) - -* Add support for `textDocument/prepareRename` request. - -#### 3.11.0 (8/21/2018) - -* Add support for CodeActionOptions to allow a server to provide a list of code action it supports. - -#### 3.10.0 (7/23/2018) - -* Add support for hierarchical document symbols as a valid response to a `textDocument/documentSymbol` request. -* Add support for folding ranges as a valid response to a `textDocument/foldingRange` request. - -#### 3.9.0 (7/10/2018) - -* Add support for `preselect` property in `CompletionItem` - -#### 3.8.0 (6/11/2018) - -* Added support for CodeAction literals to the `textDocument/codeAction` request. -* ColorServerCapabilities.colorProvider can also be a boolean -* Corrected ColorPresentationParams.colorInfo to color (as in the `d.ts` and in implementations) - -#### 3.7.0 (4/5/2018) - -* Added support for related information to Diagnostics. - -#### 3.6.0 (2/22/2018) - -Merge the proposed protocol for workspace folders, configuration, go to type definition, go to implementation and document color provider into the main branch of the specification. For details see: - -* [Get Workspace Folders](https://microsoft.github.io/language-server-protocol/specification#workspace_workspaceFolders) -* [DidChangeWorkspaceFolders Notification](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeWorkspaceFolders) -* [Get Configuration](https://microsoft.github.io/language-server-protocol/specification#workspace_configuration) -* [Go to Type Definition](https://microsoft.github.io/language-server-protocol/specification#textDocument_typeDefinition) -* [Go to Implementation](https://microsoft.github.io/language-server-protocol/specification#textDocument_implementation) -* [Document Color](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor) -* [Color Presentation](https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation) - -In addition we enhanced the `CompletionTriggerKind` with a new value `TriggerForIncompleteCompletions: 3 = 3` to signal the a completion request got trigger since the last result was incomplete. - -#### 3.5.0 - -Decided to skip this version to bring the protocol version number in sync the with npm module vscode-languageserver-protocol. - -#### 3.4.0 (11/27/2017) - -* [extensible completion item and symbol kinds](https://github.com/Microsoft/language-server-protocol/issues/129) - -#### 3.3.0 (11/24/2017) - -* Added support for `CompletionContext` -* Added support for `MarkupContent` -* Removed old New and Updated markers. - -#### 3.2.0 (09/26/2017) - -* Added optional `commitCharacters` property to the `CompletionItem` - -#### 3.1.0 (02/28/2017) - -* Make the `WorkspaceEdit` changes backwards compatible. -* Updated the specification to correctly describe the breaking changes from 2.x to 3.x around `WorkspaceEdit`and `TextDocumentEdit`. - -#### 3.0 Version - -- add support for client feature flags to support that servers can adapt to different client capabilities. An example is the new `textDocument/willSaveWaitUntil` request which not all clients might be able to support. If the feature is disabled in the client capabilities sent on the initialize request, the server can't rely on receiving the request. -- add support to experiment with new features. The new `ClientCapabilities.experimental` section together with feature flags allow servers to provide experimental feature without the need of ALL clients to adopt them immediately. -- servers can more dynamically react to client features. Capabilities can now be registered and unregistered after the initialize request using the new `client/registerCapability` and `client/unregisterCapability`. This, for example, allows servers to react to settings or configuration changes without a restart. -- add support for `textDocument/willSave` notification and `textDocument/willSaveWaitUntil` request. -- add support for `textDocument/documentLink` request. -- add a `rootUri` property to the initializeParams in favor of the `rootPath` property. diff --git a/language-server-protocol/_specifications/lsp/3.18/telemetry/event.md b/language-server-protocol/_specifications/lsp/3.18/telemetry/event.md deleted file mode 100644 index e7eed029a..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/telemetry/event.md +++ /dev/null @@ -1,7 +0,0 @@ -#### Telemetry Notification (:arrow_left:) - -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'; diff --git a/language-server-protocol/_specifications/lsp/3.18/textDocument/didChange.md b/language-server-protocol/_specifications/lsp/3.18/textDocument/didChange.md deleted file mode 100644 index f72023881..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/textDocument/didChange.md +++ /dev/null @@ -1,93 +0,0 @@ -#### DidChangeTextDocument Notification (:arrow_right:) - -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. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentChangeRegistrationOptions` defined as follows: - -
- -```typescript -/** - * Describe options to be used when registering for text document change events. - */ -export interface TextDocumentChangeRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * How documents are synced to the server. See TextDocumentSyncKind.Full - * and TextDocumentSyncKind.Incremental. - */ - syncKind: TextDocumentSyncKind; -} -``` - -_Notification_: -* method: `textDocument/didChange` -* params: `DidChangeTextDocumentParams` defined as follows: - -
- -```typescript -interface DidChangeTextDocumentParams { - /** - * The document that did change. The version number points - * to the version after all provided content changes have - * been applied. - */ - textDocument: VersionedTextDocumentIdentifier; - - /** - * The actual content changes. The content changes describe single state - * changes to the document. So if there are two content changes c1 (at - * array index 0) and c2 (at array index 1) for a document in state S then - * c1 moves the document from S to S' and c2 from S' to S''. So c1 is - * computed on the state S and c2 is computed on the state S'. - * - * To mirror the content of a document using change events use the following - * approach: - * - start with the same initial content - * - apply the 'textDocument/didChange' notifications in the order you - * receive them. - * - apply the `TextDocumentContentChangeEvent`s in a single notification - * in the order you receive them. - */ - contentChanges: TextDocumentContentChangeEvent[]; -} -``` - -
- -```typescript -/** - * 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 = { - /** - * The range of the document that changed. - */ - range: Range; - - /** - * The optional length of the range that got replaced. - * - * @deprecated use range instead. - */ - rangeLength?: uinteger; - - /** - * The new text for the provided range. - */ - text: string; -} | { - /** - * The new text of the whole document. - */ - text: string; -}; -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/textDocument/didClose.md b/language-server-protocol/_specifications/lsp/3.18/textDocument/didClose.md deleted file mode 100644 index 48e4032cc..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/textDocument/didClose.md +++ /dev/null @@ -1,26 +0,0 @@ -#### DidCloseTextDocument Notification (:arrow_right:) - -The document close notification is sent from the client to the server when the document got closed in the client. The document's master now exists where the document's Uri points to (e.g. if the document's Uri is a file Uri the master now exists on disk). As with the open notification the close notification is about managing the document's content. Receiving a close notification doesn't mean that the document was open in an editor before. A close notification requires a previous open notification to be sent. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: `textDocument/didClose` -* params: `DidCloseTextDocumentParams` defined as follows: - -
- -```typescript -interface DidCloseTextDocumentParams { - /** - * The document that was closed. - */ - textDocument: TextDocumentIdentifier; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/textDocument/didOpen.md b/language-server-protocol/_specifications/lsp/3.18/textDocument/didOpen.md deleted file mode 100644 index 9704bcfb9..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/textDocument/didOpen.md +++ /dev/null @@ -1,28 +0,0 @@ -#### DidOpenTextDocument Notification (:arrow_right:) - -The document open notification is sent from the client to the server to signal newly opened text documents. The document's content is now managed by the client and the server must not try to read the document's content using the document's Uri. Open in this sense means it is managed by the client. It doesn't necessarily mean that its content is presented in an editor. An open notification must not be sent more than once without a corresponding close notification send before. This means open and close notification must be balanced and the max open count for a particular textDocument is one. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -The `DidOpenTextDocumentParams` contain the language id the document is associated with. If the language id of a document changes, the client needs to send a `textDocument/didClose` to the server followed by a `textDocument/didOpen` with the new language id if the server handles the new language id as well. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: [`TextDocumentRegistrationOptions`](#textDocumentRegistrationOptions) - -_Notification_: -* method: 'textDocument/didOpen' -* params: `DidOpenTextDocumentParams` defined as follows: - -
- -```typescript -interface DidOpenTextDocumentParams { - /** - * The document that was opened. - */ - textDocument: TextDocumentItem; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/textDocument/didRename.md b/language-server-protocol/_specifications/lsp/3.18/textDocument/didRename.md deleted file mode 100644 index e7f415357..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/textDocument/didRename.md +++ /dev/null @@ -1,5 +0,0 @@ -#### Renaming a document - -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. diff --git a/language-server-protocol/_specifications/lsp/3.18/textDocument/didSave.md b/language-server-protocol/_specifications/lsp/3.18/textDocument/didSave.md deleted file mode 100644 index 8e4f308be..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/textDocument/didSave.md +++ /dev/null @@ -1,61 +0,0 @@ -#### DidSaveTextDocument Notification (:arrow_right:) - -The document save notification is sent from the client to the server when the document was saved in the client. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.didSave` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/didSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.save` -* property type: `boolean | SaveOptions` where `SaveOptions` is defined as follows: - -
- -```typescript -export interface SaveOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -The capability indicates that the server is interested in `textDocument/didSave` notifications. - -_Registration Options_: `TextDocumentSaveRegistrationOptions` defined as follows: - -
- -```typescript -export interface TextDocumentSaveRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -_Notification_: -* method: `textDocument/didSave` -* params: `DidSaveTextDocumentParams` defined as follows: - -
- -```typescript -interface DidSaveTextDocumentParams { - /** - * The document that was saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * Optional the content when saved. Depends on the includeText value - * when the save notification was requested. - */ - text?: string; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/textDocument/willSave.md b/language-server-protocol/_specifications/lsp/3.18/textDocument/willSave.md deleted file mode 100644 index cb61d54db..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/textDocument/willSave.md +++ /dev/null @@ -1,68 +0,0 @@ -#### WillSaveTextDocument Notification (:arrow_right:) - -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` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSave` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSave` notifications. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: 'textDocument/willSave' -* params: `WillSaveTextDocumentParams` defined as follows: - -
- -```typescript -/** - * The parameters send in a will save text document notification. - */ -export interface WillSaveTextDocumentParams { - /** - * The document that will be saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * The 'TextDocumentSaveReason'. - */ - reason: TextDocumentSaveReason; -} -``` - -
- -```typescript -/** - * Represents reasons why a text document is saved. - */ -export namespace TextDocumentSaveReason { - - /** - * Manually triggered, e.g. by the user pressing save, by starting - * debugging, or by an API call. - */ - export const Manual = 1; - - /** - * Automatic after a delay. - */ - export const AfterDelay = 2; - - /** - * When the editor lost focus. - */ - export const FocusOut = 3; -} - -export type TextDocumentSaveReason = 1 | 2 | 3; -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/textDocument/willSaveWaitUntil.md b/language-server-protocol/_specifications/lsp/3.18/textDocument/willSaveWaitUntil.md deleted file mode 100644 index ba2d3f41a..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/textDocument/willSaveWaitUntil.md +++ /dev/null @@ -1,25 +0,0 @@ -#### WillSaveWaitUntilTextDocument Request (:leftwards_arrow_with_hook:) - -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` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSaveWaitUntil` requests. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSaveWaitUntil` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSaveWaitUntil` requests. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Request_: -* method: `textDocument/willSaveWaitUntil` -* params: `WillSaveTextDocumentParams` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` -* error: code and message set in case an exception happens during the `textDocument/willSaveWaitUntil` request. diff --git a/language-server-protocol/_specifications/lsp/3.18/types/command.md b/language-server-protocol/_specifications/lsp/3.18/types/command.md deleted file mode 100644 index 0d30506a2..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/command.md +++ /dev/null @@ -1,21 +0,0 @@ -#### Command - -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[]; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/diagnostic.md b/language-server-protocol/_specifications/lsp/3.18/types/diagnostic.md deleted file mode 100644 index 6c40d0958..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/diagnostic.md +++ /dev/null @@ -1,158 +0,0 @@ -#### Diagnostic - -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; -``` - -
- -```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: - -
- -```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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/documentFilter.md b/language-server-protocol/_specifications/lsp/3.18/types/documentFilter.md deleted file mode 100644 index 056d71df8..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/documentFilter.md +++ /dev/null @@ -1,48 +0,0 @@ -#### DocumentFilter - -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`: -```typescript -{ language: 'typescript', scheme: 'file' } -{ language: 'json', pattern: '**/package.json' } -``` - -```typescript -export interface DocumentFilter { - /** - * A language id, like `typescript`. - */ - language?: string; - - /** - * A Uri [scheme](#Uri.scheme), like `file` or `untitled`. - */ - scheme?: string; - - /** - * A glob pattern, like `*.{ts,js}`. - * - * 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`) - */ - pattern?: string; -} -``` - -Please note that for a document filter to be valid at least one of the properties for `language`, `scheme`, or `pattern` must be set. To keep the type definition simple all properties are marked as optional. - -A document selector is the combination of one or more document filters. - -
- -```typescript -export type DocumentSelector = DocumentFilter[]; -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/enumerations.md b/language-server-protocol/_specifications/lsp/3.18/types/enumerations.md deleted file mode 100644 index 1738506db..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/enumerations.md +++ /dev/null @@ -1,5 +0,0 @@ -#### Enumerations - -The protocol supports two kind of enumerations: (a) integer based enumerations and (b) strings based enumerations. Integer based enumerations usually start with `1`. The ones 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 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. diff --git a/language-server-protocol/_specifications/lsp/3.18/types/location.md b/language-server-protocol/_specifications/lsp/3.18/types/location.md deleted file mode 100644 index 1aab270fe..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/location.md +++ /dev/null @@ -1,9 +0,0 @@ -#### Location - -Represents a location inside a resource, such as a line inside a text file. -```typescript -interface Location { - uri: DocumentUri; - range: Range; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/locationLink.md b/language-server-protocol/_specifications/lsp/3.18/types/locationLink.md deleted file mode 100644 index 791a462c0..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/locationLink.md +++ /dev/null @@ -1,36 +0,0 @@ -#### LocationLink - -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 - * `targetRange`. See also `DocumentSymbol#range` - */ - targetSelectionRange: Range; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/types/markupContent.md b/language-server-protocol/_specifications/lsp/3.18/types/markupContent.md deleted file mode 100644 index 4e7b95e78..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/markupContent.md +++ /dev/null @@ -1,106 +0,0 @@ -#### MarkupContent - - 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/). - -```typescript -/** - * Describes the content type that a client supports in various - * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. - * - * Please note that `MarkupKinds` must not start with a `$`. This kinds - * are reserved for internal usage. - */ -export namespace MarkupKind { - /** - * Plain text is supported as a content format - */ - export const PlainText: 'plaintext' = 'plaintext'; - - /** - * Markdown is supported as a content format - */ - export const Markdown: 'markdown' = 'markdown'; -} -export type MarkupKind = 'plaintext' | 'markdown'; -``` - -
- -```typescript -/** - * A `MarkupContent` literal represents a string value which content is - * interpreted base on its kind flag. Currently the protocol supports - * `plaintext` and `markdown` as markup kinds. - * - * If the kind is `markdown` then the value can contain fenced code blocks like - * in GitHub issues. - * - * Here is an example how such a string can be constructed using - * JavaScript / TypeScript: - * ```typescript - * let markdown: MarkdownContent = { - * kind: MarkupKind.Markdown, - * value: [ - * '# Header', - * 'Some text', - * '```typescript', - * 'someCode();', - * '```' - * ].join('\n') - * }; - * ``` - * - * *Please Note* that clients might sanitize the return markdown. A client could - * decide to remove HTML from the markdown to avoid script execution. - */ -export interface MarkupContent { - /** - * The type of the Markup - */ - kind: MarkupKind; - - /** - * The content itself - */ - value: string; -} -``` - -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 -/** - * Client capabilities specific to the used markdown parser. - * - * @since 3.16.0 - */ -export interface MarkdownClientCapabilities { - /** - * The name of the parser. - */ - parser: string; - - /** - * 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/) -Python-Markdown | 3.2.2 | [Python-Markdown Documentation](https://python-markdown.github.io) - diff --git a/language-server-protocol/_specifications/lsp/3.18/types/partialResultParams.md b/language-server-protocol/_specifications/lsp/3.18/types/partialResultParams.md deleted file mode 100644 index 98dfc0474..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/partialResultParams.md +++ /dev/null @@ -1,13 +0,0 @@ -#### PartialResultParams - -A parameter literal used to pass a partial result token. - -```typescript -export interface PartialResultParams { - /** - * An optional token that a server can use to report partial results (e.g. - * streaming) to the client. - */ - partialResultToken?: ProgressToken; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/partialResults.md b/language-server-protocol/_specifications/lsp/3.18/types/partialResults.md deleted file mode 100644 index b4f634808..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/partialResults.md +++ /dev/null @@ -1,33 +0,0 @@ -#### Partial Result Progress - -> *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[]` \| `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 -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae", - // The token used to report partial result progress. - "partialResultToken": "5f6f349e-4f81-4a3b-afff-ee04bff96804" -} -``` - -The `partialResultToken` is then used to report partial results for the find references request. - -If a server reports partial result via a corresponding `$/progress`, the whole result must be reported using n `$/progress` notifications. The final response has to be empty in terms of result values. This avoids confusion about how the final result should be interpreted, e.g. as another partial result or as a replacing result. - -If the response errors the provided partial results should be treated as follows: - -- 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. diff --git a/language-server-protocol/_specifications/lsp/3.18/types/position.md b/language-server-protocol/_specifications/lsp/3.18/types/position.md deleted file mode 100644 index 034a1c904..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/position.md +++ /dev/null @@ -1,67 +0,0 @@ -#### Position - -Position in a text document expressed as zero-based line and zero-based character offset. A position is between two characters like an 'insert' cursor in an editor. Special values like, for example, `-1` to denote the end of a line are not supported. - -```typescript -interface Position { - /** - * Line position in a document (zero-based). - */ - line: uinteger; - - /** - * 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. - */ - 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. - -
- - -```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 (e.g. bytes). - */ - 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'; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/types/range.md b/language-server-protocol/_specifications/lsp/3.18/types/range.md deleted file mode 100644 index ddc09471d..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/range.md +++ /dev/null @@ -1,23 +0,0 @@ -#### Range - -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: -```typescript -{ - start: { line: 5, character: 23 }, - end : { line: 6, character: 0 } -} -``` - -```typescript -interface Range { - /** - * The range's start position. - */ - start: Position; - - /** - * The range's end position. - */ - end: Position; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/types/regexp.md b/language-server-protocol/_specifications/lsp/3.18/types/regexp.md deleted file mode 100644 index 7d1403048..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/regexp.md +++ /dev/null @@ -1,47 +0,0 @@ -#### Regular Expressions - -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: - -* the client will announce which regular expression engine it will use. This will allow server that are written for a very specific client make full use of the regular expression capabilities of the client -* the specification will define a set of regular expression features that should be supported by a client. Instead of writing a new specification LSP will refer to the [ECMAScript Regular Expression specification](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) and remove features from it that are not necessary in the context of LSP or hard to implement for other clients. - -_Client Capability_: - -The following client capability is used to announce a client's regular expression engine - -* property path (optional): `general.regularExpressions` -* property type: `RegularExpressionsClientCapabilities` defined as follows: - -```typescript -/** - * Client capabilities specific to regular expressions. - */ -export interface RegularExpressionsClientCapabilities { - /** - * The engine's name. - */ - engine: string; - - /** - * The engine's version. - */ - version?: string; -} -``` - -The following table lists the well known engine values. Please note that the table should be driven by the community which integrates LSP into existing clients. It is not the goal of the spec to list all available regular expression engines. - -Engine | Version | Documentation -------- | ------- | ------------- -ECMAScript | `ES2020` | [ECMAScript 2020](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) & [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions) - -_Regular Expression Subset_: - -The following features from the [ECMAScript 2020](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) regular expression specification are NOT mandatory for a client: - -- *Assertions*: Lookahead assertion, Negative lookahead assertion, lookbehind assertion, negative lookbehind assertion. -- *Character classes*: matching control characters using caret notation (e.g. `\cX`) and matching UTF-16 code units (e.g. `\uhhhh`). -- *Group and ranges*: named capturing groups. -- *Unicode property escapes*: none of the features needs to be supported. - -The only regular expression flag that a client needs to support is 'i' to specify a case insensitive search. diff --git a/language-server-protocol/_specifications/lsp/3.18/types/resourceChanges.md b/language-server-protocol/_specifications/lsp/3.18/types/resourceChanges.md deleted file mode 100644 index 555b72745..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/resourceChanges.md +++ /dev/null @@ -1,160 +0,0 @@ -### File Resource changes - -> 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; -} -``` - -
- -```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; -} -``` - -
- -```typescript -/** - * Rename file options - */ -export interface RenameFileOptions { - /** - * Overwrite target if existing. Overwrite wins over `ignoreIfExists` - */ - overwrite?: boolean; - - /** - * Ignores if target exists. - */ - ignoreIfExists?: boolean; -} -``` - -
- -```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; -} -``` - -
- -```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; -} -``` - -
- -```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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentEdit.md b/language-server-protocol/_specifications/lsp/3.18/types/textDocumentEdit.md deleted file mode 100644 index 51a89c7f2..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentEdit.md +++ /dev/null @@ -1,22 +0,0 @@ -#### TextDocumentEdit - -> 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)[]; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentIdentifier.md b/language-server-protocol/_specifications/lsp/3.18/types/textDocumentIdentifier.md deleted file mode 100644 index 728bbbac7..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentIdentifier.md +++ /dev/null @@ -1,11 +0,0 @@ -#### TextDocumentIdentifier - -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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentItem.md b/language-server-protocol/_specifications/lsp/3.18/types/textDocumentItem.md deleted file mode 100644 index beab9dbd2..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentItem.md +++ /dev/null @@ -1,91 +0,0 @@ -#### TextDocumentItem - -An item to transfer a text document from the client to the server. - -```typescript -interface TextDocumentItem { - /** - * The text document's URI. - */ - uri: DocumentUri; - - /** - * The text document's language identifier. - */ - languageId: string; - - /** - * The version number of this document (it will increase after each - * change, including undo/redo). - */ - version: integer; - - /** - * The content of the opened text document. - */ - text: string; -} -``` - -Text documents have a language identifier to identify a document on the server side when it handles more than one language to avoid re-interpreting the file extension. If a document refers to one of the programming languages listed below it is recommended that clients use those ids. - -Language | Identifier --------- | ---------- -ABAP | `abap` -Windows Bat | `bat` -BibTeX | `bibtex` -Clojure | `clojure` -Coffeescript | `coffeescript` -C | `c` -C++ | `cpp` -C# | `csharp` -CSS | `css` -Diff | `diff` -Dart | `dart` -Dockerfile | `dockerfile` -Elixir | `elixir` -Erlang | `erlang` -F# | `fsharp` -Git | `git-commit` and `git-rebase` -Go | `go` -Groovy | `groovy` -Handlebars | `handlebars` -HTML | `html` -Ini | `ini` -Java | `java` -JavaScript | `javascript` -JavaScript React | `javascriptreact` -JSON | `json` -LaTeX | `latex` -Less | `less` -Lua | `lua` -Makefile | `makefile` -Markdown | `markdown` -Objective-C | `objective-c` -Objective-C++ | `objective-cpp` -Perl | `perl` -Perl 6 | `perl6` -PHP | `php` -Powershell | `powershell` -Pug | `jade` -Python | `python` -R | `r` -Razor (cshtml) | `razor` -Ruby | `ruby` -Rust | `rust` -SCSS | `scss` (syntax using curly brackets), `sass` (indented syntax) -Scala | `scala` -ShaderLab | `shaderlab` -Shell Script (Bash) | `shellscript` -SQL | `sql` -Swift | `swift` -TypeScript | `typescript` -TypeScript React| `typescriptreact` -TeX | `tex` -Text (plain) | `plaintext` -Visual Basic | `vb` -XML | `xml` -XSL | `xsl` -YAML | `yaml` -{: .table .table-bordered .table-responsive} - diff --git a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentPositionParams.md b/language-server-protocol/_specifications/lsp/3.18/types/textDocumentPositionParams.md deleted file mode 100644 index b3e434afe..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/textDocumentPositionParams.md +++ /dev/null @@ -1,19 +0,0 @@ -#### TextDocumentPositionParams - -Was `TextDocumentPosition` in 1.0 with inlined parameters. - -A parameter literal used in requests to pass a text document and a position inside that document. It is up to the client to decide how a selection is converted into a position when issuing a request for a text document. The client can, for example, honor or ignore the selection direction to make LSP request consistent with features implemented internally. - -```typescript -interface TextDocumentPositionParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The position inside the text document. - */ - position: Position; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/types/textDocuments.md b/language-server-protocol/_specifications/lsp/3.18/types/textDocuments.md deleted file mode 100644 index b9fa54f97..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/textDocuments.md +++ /dev/null @@ -1,13 +0,0 @@ -#### Text Documents - -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. - -> 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']; -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/types/textEdit.md b/language-server-protocol/_specifications/lsp/3.18/types/textEdit.md deleted file mode 100644 index 1b3a26013..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/textEdit.md +++ /dev/null @@ -1,81 +0,0 @@ -#### TextEdit & AnnotatedTextEdit - -> 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 identifiers 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; -``` - -
- -```typescript -/** - * A special text edit with an additional change annotation. - * - * @since 3.16.0. - */ -export interface AnnotatedTextEdit extends TextEdit { - /** - * The actual annotation identifier. - */ - annotationId: ChangeAnnotationIdentifier; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/textEditArray.md b/language-server-protocol/_specifications/lsp/3.18/types/textEditArray.md deleted file mode 100644 index e1004be3f..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/textEditArray.md +++ /dev/null @@ -1,5 +0,0 @@ -#### TextEdit[] - -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 they 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. diff --git a/language-server-protocol/_specifications/lsp/3.18/types/traceValue.md b/language-server-protocol/_specifications/lsp/3.18/types/traceValue.md deleted file mode 100644 index ac7e6669d..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/traceValue.md +++ /dev/null @@ -1,8 +0,0 @@ -#### TraceValue - -A `TraceValue` represents the level of verbosity with which the server systematically reports its execution trace using [$/logTrace](#logTrace) notifications. -The initial trace value is set by the client at initialization and can be modified later using the [$/setTrace](#setTrace) notification. - -```typescript -export type TraceValue = 'off' | 'messages' | 'verbose'; -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/uri.md b/language-server-protocol/_specifications/lsp/3.18/types/uri.md deleted file mode 100644 index 1ffd89829..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/uri.md +++ /dev/null @@ -1,29 +0,0 @@ -#### URI - -URI's are transferred as strings. The URI's format is defined in [https://tools.ietf.org/html/rfc3986](https://tools.ietf.org/html/rfc3986) - -``` - foo://example.com:8042/over/there?name=ferret#nose - \_/ \______________/\_________/ \_________/ \__/ - | | | | | -scheme authority path query fragment - | _____________________|__ - / \ / \ - urn:example:animal:ferret:nose -``` - -We also maintain a node module to parse a string into `scheme`, `authority`, `path`, `query`, and `fragment` URI components. The GitHub repository is [https://github.com/Microsoft/vscode-uri](https://github.com/Microsoft/vscode-uri) the npm module is [https://www.npmjs.com/package/vscode-uri](https://www.npmjs.com/package/vscode-uri). - -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. - -
- -```typescript -type DocumentUri = string; -``` - -There is also a tagging interface for normal non document URIs. It maps to a `string` as well. - -```typescript -type URI = string; -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/versionedTextDocumentIdentifier.md b/language-server-protocol/_specifications/lsp/3.18/types/versionedTextDocumentIdentifier.md deleted file mode 100644 index 0ec853eaf..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/versionedTextDocumentIdentifier.md +++ /dev/null @@ -1,36 +0,0 @@ -#### VersionedTextDocumentIdentifier - -An identifier to denote a specific version of a text document. This information usually flows from the client to the server. - -```typescript -interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. - * - * The version number of a document will increase after each change, - * including undo/redo. The number doesn't need to be consecutive. - */ - version: integer; -} -``` - -An identifier which optionally denotes a specific version of a text document. This information usually flows from the server to the client. - -
- -```typescript -interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. If an optional versioned text document - * identifier is sent from the server to the client and the file is not - * open in the editor (the server has not received an open notification - * before) the server can send `null` to indicate that the version is - * known and the content on disk is the master (as specified with document - * content ownership). - * - * The version number of a document will increase after each change, - * including undo/redo. The number doesn't need to be consecutive. - */ - version: integer | null; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/types/workDoneProgress.md b/language-server-protocol/_specifications/lsp/3.18/types/workDoneProgress.md deleted file mode 100644 index c3aae4ee5..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/workDoneProgress.md +++ /dev/null @@ -1,205 +0,0 @@ -#### Work Done Progress - -> *Since version 3.15.0* - -Work done progress is reported using the generic [`$/progress`](#progress) notification. The value payload of a work done progress notification can be of three different forms. - -##### Work Done Progress Begin - -To start progress reporting a `$/progress` notification with the following payload must be sent: - -```typescript -export interface WorkDoneProgressBegin { - - kind: 'begin'; - - /** - * Mandatory title of the progress operation. Used to briefly inform about - * the kind of operation being performed. - * - * Examples: "Indexing" or "Linking dependencies". - */ - title: string; - - /** - * Controls if a cancel button should show to allow the user to cancel the - * long running operation. Clients that don't support cancellation are - * allowed to ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. The value range is [0, 100] - */ - percentage?: uinteger; -} -``` - -##### Work Done Progress Report - -Reporting progress is done using the following payload: - -```typescript -export interface WorkDoneProgressReport { - - kind: 'report'; - - /** - * Controls enablement state of a cancel button. This property is only valid - * if a cancel button got requested in the `WorkDoneProgressBegin` payload. - * - * Clients that don't support cancellation or don't support control the - * button's enablement state are allowed to ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. The value range is [0, 100] - */ - percentage?: uinteger; -} -``` - -##### Work Done Progress End - -Signaling the end of a progress reporting is done using the following payload: - -```typescript -export interface WorkDoneProgressEnd { - - kind: 'end'; - - /** - * Optional, a final message indicating to, for example, indicate the outcome - * of the operation. - */ - message?: string; -} -``` - -##### Initiating Work Done Progress - -Work Done progress can be initiated in two different ways: - -1. by the sender of a request (mostly clients) using the predefined `workDoneToken` property in the requests parameter literal. The document will refer to this kind of progress as client initiated progress. -1. by a server using the request `window/workDoneProgress/create`. The document will refer to this kind of progress as server initiated progress. - -###### Client Initiated Progress - -Consider a client sending a `textDocument/reference` request to a server and the client accepts work done progress reporting on that request. To signal this to the server the client would add a `workDoneToken` property to the reference request parameters. Something like this: - -```json -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae" -} -``` - -The corresponding type definition for the parameter property looks like this: - - -
- -```typescript -export interface WorkDoneProgressParams { - /** - * An optional token that a server can use to report work done progress. - */ - workDoneToken?: ProgressToken; -} -``` - -A server uses the `workDoneToken` to report progress for the specific `textDocument/reference`. For the above request the `$/progress` notification params look like this: - -```json -{ - "token": "1d546990-40a3-4b77-b134-46622995f6ae", - "value": { - "kind": "begin", - "title": "Finding references for A#foo", - "cancellable": false, - "message": "Processing file X.ts", - "percentage": 0 - } -} -``` - -The token received via the `workDoneToken` property in a request's param literal is only valid as long as the request has not send a response back. - -There is no specific client capability signaling whether a client will send a progress token per request. The reason for this is that this is in many clients not a static aspect and might even change for every request instance for the same request type. So the capability is signal on every request instance by the presence of a `workDoneToken` property. - -To avoid that clients set up a progress monitor user interface before sending a request but the server doesn't actually report any progress a server needs to signal general work done progress reporting support in the corresponding server capability. For the above find references example a server would signal such a support by setting the `referencesProvider` property in the server capabilities as follows: - -```json -{ - "referencesProvider": { - "workDoneProgress": true - } -} -``` - -The corresponding type definition for the server capability looks like this: - -
- -```typescript -export interface WorkDoneProgressOptions { - workDoneProgress?: boolean; -} -``` -###### Server Initiated Progress - -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: - -```typescript - /** - * Window specific client capabilities. - */ - window?: { - /** - * Whether client supports server initiated progress using the - * `window/workDoneProgress/create` request. - */ - workDoneProgress?: boolean; - }; -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/types/workspaceEdit.md b/language-server-protocol/_specifications/lsp/3.18/types/workspaceEdit.md deleted file mode 100644 index b8ac0f461..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/types/workspaceEdit.md +++ /dev/null @@ -1,174 +0,0 @@ -#### WorkspaceEdit - -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; - }; -} -``` - -##### WorkspaceEditClientCapabilities - -> 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; - }; -} -``` - -
- -```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'; -} -``` - -
- -```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'; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/window/logMessage.md b/language-server-protocol/_specifications/lsp/3.18/window/logMessage.md deleted file mode 100644 index 7625ce4ce..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/window/logMessage.md +++ /dev/null @@ -1,23 +0,0 @@ -#### LogMessage Notification (:arrow_left:) - -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; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/window/showDocument.md b/language-server-protocol/_specifications/lsp/3.18/window/showDocument.md deleted file mode 100644 index 387a9d90a..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/window/showDocument.md +++ /dev/null @@ -1,88 +0,0 @@ -#### Show Document Request (:arrow_right_hook:) - -> 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 resource referenced by a URI 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 resource. - * - * @since 3.16.0 - */ -export interface ShowDocumentParams { - /** - * The 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. diff --git a/language-server-protocol/_specifications/lsp/3.18/window/showMessage.md b/language-server-protocol/_specifications/lsp/3.18/window/showMessage.md deleted file mode 100644 index cd73c0c65..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/window/showMessage.md +++ /dev/null @@ -1,48 +0,0 @@ -#### ShowMessage Notification (:arrow_left:) - -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; -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/window/showMessageRequest.md b/language-server-protocol/_specifications/lsp/3.18/window/showMessageRequest.md deleted file mode 100644 index 28650c0f9..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/window/showMessageRequest.md +++ /dev/null @@ -1,68 +0,0 @@ -#### ShowMessage Request (:arrow_right_hook:) - -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: - -
- -```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; -} -``` - -_Response_: -* result: the selected `MessageActionItem` \| `null` if none got selected. -* error: code and message set in case an exception happens during showing a message. diff --git a/language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCancel.md b/language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCancel.md deleted file mode 100644 index ce83fc8d7..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCancel.md +++ /dev/null @@ -1,17 +0,0 @@ -#### Cancel a Work Done Progress (:arrow_right:) - -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; -} -``` \ No newline at end of file diff --git a/language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCreate.md b/language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCreate.md deleted file mode 100644 index 88180e373..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/window/workDoneProgressCreate.md +++ /dev/null @@ -1,26 +0,0 @@ -#### Create Work Done Progress (:arrow_right_hook:) - -The `window/workDoneProgress/create` request is sent from the server to the client to ask the client to create a work done progress. - -_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`. diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/applyEdit.md b/language-server-protocol/_specifications/lsp/3.18/workspace/applyEdit.md deleted file mode 100644 index 05a9fab62..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/applyEdit.md +++ /dev/null @@ -1,61 +0,0 @@ -#### Applies a WorkspaceEdit (:arrow_right_hook:) - -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: `ApplyWorkspaceEditResult` defined as follows: - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/configuration.md b/language-server-protocol/_specifications/lsp/3.18/workspace/configuration.md deleted file mode 100644 index d5b0e9458..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/configuration.md +++ /dev/null @@ -1,43 +0,0 @@ -#### Configuration Request (:arrow_right_hook:) - -> *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 - -
- -```typescript -export interface ConfigurationParams { - items: ConfigurationItem[]; -} -``` - -
- -```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 diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeConfiguration.md b/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeConfiguration.md deleted file mode 100644 index 04bf9bb2d..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeConfiguration.md +++ /dev/null @@ -1,33 +0,0 @@ -#### DidChangeConfiguration Notification (:arrow_right:) - -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: - -
- -```typescript -export interface DidChangeConfigurationClientCapabilities { - /** - * Did change configuration notification supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Notification_: -* method: 'workspace/didChangeConfiguration', -* params: `DidChangeConfigurationParams` defined as follows: - -
- -```typescript -interface DidChangeConfigurationParams { - /** - * The actual changed settings - */ - settings: LSPAny; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWatchedFiles.md b/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWatchedFiles.md deleted file mode 100644 index 21d28d76c..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWatchedFiles.md +++ /dev/null @@ -1,210 +0,0 @@ -#### DidChangeWatchedFiles Notification (:arrow_right:) - -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; - - /** - * Whether the client has support for relative patterns - * or not. - * - * @since 3.17.0 - */ - relativePatternSupport?: 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[]; -} -``` - -
- -```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; -``` - -
- -```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; -} -``` - -
- -```typescript -/** - * The glob pattern. Either a string pattern or a relative pattern. - * - * @since 3.17.0 - */ -export type GlobPattern = Pattern | RelativePattern; -``` - -
- -```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; -} -``` - -
- -```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: - -
- -```typescript -interface DidChangeWatchedFilesParams { - /** - * The actual file events. - */ - changes: FileEvent[]; -} -``` - -Where FileEvents are described as follows: - -
- -```typescript -/** - * An event describing a file change. - */ -interface FileEvent { - /** - * The file's URI. - */ - uri: DocumentUri; - /** - * The change type. - */ - type: uinteger; -} -``` - -
- -```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; -} - -export type FileChangeType = 1 | 2 | 3; -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWorkspaceFolders.md b/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWorkspaceFolders.md deleted file mode 100644 index eaf586bf6..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/didChangeWorkspaceFolders.md +++ /dev/null @@ -1,45 +0,0 @@ -#### DidChangeWorkspaceFolders Notification (:arrow_right:) - -> *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: - -
- -```typescript -export interface DidChangeWorkspaceFoldersParams { - /** - * The actual workspace folder change event. - */ - event: WorkspaceFoldersChangeEvent; -} -``` - -
- -```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[]; -} -``` diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/didCreateFiles.md b/language-server-protocol/_specifications/lsp/3.18/workspace/didCreateFiles.md deleted file mode 100644 index 04837a97d..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/didCreateFiles.md +++ /dev/null @@ -1,19 +0,0 @@ -#### DidCreateFiles Notification (:arrow_right:) - -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` diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/didDeleteFiles.md b/language-server-protocol/_specifications/lsp/3.18/workspace/didDeleteFiles.md deleted file mode 100644 index b2bcde517..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/didDeleteFiles.md +++ /dev/null @@ -1,19 +0,0 @@ -#### DidDeleteFiles Notification (:arrow_right:) - -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` diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/didRenameFiles.md b/language-server-protocol/_specifications/lsp/3.18/workspace/didRenameFiles.md deleted file mode 100644 index 67cf77533..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/didRenameFiles.md +++ /dev/null @@ -1,19 +0,0 @@ -#### DidRenameFiles Notification (:arrow_right:) - -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` diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/executeCommand.md b/language-server-protocol/_specifications/lsp/3.18/workspace/executeCommand.md deleted file mode 100644 index 6ca8a8c27..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/executeCommand.md +++ /dev/null @@ -1,72 +0,0 @@ -#### Execute a command (:leftwards_arrow_with_hook:) - -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?: 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. diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/symbol.md b/language-server-protocol/_specifications/lsp/3.18/workspace/symbol.md deleted file mode 100644 index ecd09bbca..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/symbol.md +++ /dev/null @@ -1,176 +0,0 @@ -#### Workspace Symbols Request (:leftwards_arrow_with_hook:) - -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 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` 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: - -
- -```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: - -
- -```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[]` \| `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: - -
- -```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 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; - - /** - * 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 }; - - /** - * A data entry field that is preserved on a workspace symbol between a - * workspace symbol request and a workspace symbol resolve request. - */ - data?: LSPAny; -} -``` -* partial result: `SymbolInformation[]` \| `WorkspaceSymbol[]` as defined above. -* error: code and message set in case an exception happens during the workspace symbol request. - -#### Workspace Symbol Resolve Request (:leftwards_arrow_with_hook:) - -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. diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/willCreateFiles.md b/language-server-protocol/_specifications/lsp/3.18/workspace/willCreateFiles.md deleted file mode 100644 index 0c6e7af73..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/willCreateFiles.md +++ /dev/null @@ -1,179 +0,0 @@ -#### WillCreateFiles Request (:leftwards_arrow_with_hook:) - -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. Hence the `WorkspaceEdit` can not manipulate the content of the files to be 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[]; -} -``` - -
- -```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'; -``` - -
- -```typescript -/** - * Matching options for the file operation pattern. - * - * @since 3.16.0 - */ -export interface FileOperationPatternOptions { - - /** - * The pattern should be matched ignoring casing. - */ - ignoreCase?: boolean; -} -``` - -
- -```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; -} -``` - -
- -```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: - -
- -```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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/willDeleteFiles.md b/language-server-protocol/_specifications/lsp/3.18/workspace/willDeleteFiles.md deleted file mode 100644 index 030206a58..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/willDeleteFiles.md +++ /dev/null @@ -1,60 +0,0 @@ -#### WillDeleteFiles Request (:leftwards_arrow_with_hook:) - -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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/willRenameFiles.md b/language-server-protocol/_specifications/lsp/3.18/workspace/willRenameFiles.md deleted file mode 100644 index 1932678c2..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/willRenameFiles.md +++ /dev/null @@ -1,66 +0,0 @@ -#### WillRenameFiles Request (:leftwards_arrow_with_hook:) - -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[]; -} -``` - -
- -```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. diff --git a/language-server-protocol/_specifications/lsp/3.18/workspace/workspaceFolders.md b/language-server-protocol/_specifications/lsp/3.18/workspace/workspaceFolders.md deleted file mode 100644 index 502ce5885..000000000 --- a/language-server-protocol/_specifications/lsp/3.18/workspace/workspaceFolders.md +++ /dev/null @@ -1,62 +0,0 @@ -#### Workspace folders request (:arrow_right_hook:) - -> *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 diff --git a/language-server-protocol/_specifications/specification-3-14.md b/language-server-protocol/_specifications/specification-3-14.md deleted file mode 100644 index bc02d4626..000000000 --- a/language-server-protocol/_specifications/specification-3-14.md +++ /dev/null @@ -1,4461 +0,0 @@ ---- -title: Specification -shortTitle: 3.14 (Previous) -layout: specifications -sectionid: specification-3-14 -toc: specification-3-14-toc -fullTitle: Language Server Protocol Specification - 3.14 -index: 1 ---- - -This document describes version 3.14.x of the language server protocol. An implementation for node of the 3.14.x version of the protocol can be found [here](https://github.com/Microsoft/vscode-languageserver-node). - -The 2.x version of this document can be found [here](https://github.com/Microsoft/language-server-protocol/blob/master/versions/protocol-2-x.md). -The 1.x version of this document can be found [here](https://github.com/Microsoft/language-server-protocol/blob/master/versions/protocol-1-x.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/specification-3-14.md). - -## Base Protocol - -The base protocol consists of a header and a content part (comparable to HTTP). The header and content part are -separated by a '\r\n'. - -### Header Part - -The header part consists of header fields. Each header field is comprised of a name and a value, -separated by ': ' (a colon and a space). -Each header field is terminated by '\r\n'. -Considering the last header field and the overall header itself are each terminated with '\r\n', -and that at least one header is mandatory, this means that two '\r\n' sequences always -immediately precede the content part of a message. - -Currently the following header fields are supported: - -| Header Field Name | Value Type | Description | -|:------------------|:------------|:------------| -| Content-Length | number | The length of the content part in bytes. This header is required. | -| Content-Type | string | The mime type of the content part. Defaults to application/vscode-jsonrpc; charset=utf-8 | -{: .table .table-bordered .table-responsive} - -The header part is encoded using the 'ascii' encoding. This includes the '\r\n' separating the header and content part. - -### Content Part - -Contains the actual content of the message. The content part of a message uses [JSON-RPC](http://www.jsonrpc.org/) to describe requests, responses and notifications. The content part is encoded using the charset provided in the Content-Type field. It defaults to `utf-8`, which is the only encoding supported right now. If a server or client receives a header with a different encoding than `utf-8`, then it should respond with an error. - -(Prior versions of the protocol used the string constant `utf8` which is not a correct encoding constant according to [specification](http://www.iana.org/assignments/character-sets/character-sets.xhtml).) For backwards compatibility it is highly recommended that a client and a server treats the string `utf8` as `utf-8`. - -### Example: - -``` -Content-Length: ...\r\n -\r\n -{ - "jsonrpc": "2.0", - "id": 1, - "method": "textDocument/didOpen", - "params": { - ... - } -} -``` -### Base Protocol JSON structures - -The following TypeScript definitions describe the base [JSON-RPC protocol](http://www.jsonrpc.org/specification): - -#### Abstract Message - -A general message as defined by JSON-RPC. The language server protocol always uses "2.0" as the `jsonrpc` version. - -```typescript -interface Message { - jsonrpc: string; -} -``` -#### Request Message - -A request message to describe a request between the client and the server. Every processed request must send a response back to the sender of the request. - -```typescript -interface RequestMessage extends Message { - - /** - * The request id. - */ - id: number | string; - - /** - * The method to be invoked. - */ - method: string; - - /** - * The method's params. - */ - params?: Array | object; -} -``` - -#### Response Message - -A Response Message sent as a result of a request. If a request doesn't provide a result value the receiver of a request still needs to return a response message to conform to the JSON RPC specification. The result property of the ResponseMessage should be set to `null` in this case to signal a successful request. - -```typescript -interface ResponseMessage extends Message { - /** - * The request id. - */ - id: number | string | null; - - /** - * The result of a request. This member is REQUIRED on success. - * This member MUST NOT exist if there was an error invoking the method. - */ - result?: string | number | boolean | object | null; - - /** - * The error object in case a request fails. - */ - error?: ResponseError; -} - -interface ResponseError { - /** - * A number indicating the error type that occurred. - */ - code: number; - - /** - * A string providing a short description of the error. - */ - message: string; - - /** - * A Primitive or Structured value that contains additional - * information about the error. Can be omitted. - */ - data?: D; -} - -export namespace ErrorCodes { - // Defined by JSON RPC - export const ParseError: number = -32700; - export const InvalidRequest: number = -32600; - export const MethodNotFound: number = -32601; - export const InvalidParams: number = -32602; - export const InternalError: number = -32603; - export const serverErrorStart: number = -32099; - export const serverErrorEnd: number = -32000; - export const ServerNotInitialized: number = -32002; - export const UnknownErrorCode: number = -32001; - - // Defined by the protocol. - export const RequestCancelled: number = -32800; - export const ContentModified: number = -32801; -} -``` -#### Notification Message - -A notification message. A processed notification message must not send a response back. They work like events. - -```typescript -interface NotificationMessage extends Message { - /** - * The method to be invoked. - */ - method: string; - - /** - * The notification's params. - */ - params?: Array | object; -} -``` - -#### $ Notifications and Requests - -Notification and requests whose methods start with '$/' are messages which are protocol implementation dependent and might not be implementable in all clients or servers. For example if the server implementation uses a single threaded synchronous programming language then there is little a server can do to react to a '$/cancelRequest' notification. If a server or client receives notifications starting with '$/' it is free to ignore the notification. If a server or client receives a requests starting with '$/' it must error the request with error code `MethodNotFound` (e.g. `-32601`). - -#### Cancellation Support (:arrow_right: :arrow_left:) - -The base protocol offers support for request cancellation. To cancel a request, a notification message with the following properties is sent: - -_Notification_: -* method: '$/cancelRequest' -* params: `CancelParams` defined as follows: - -```typescript -interface CancelParams { - /** - * The request id to cancel. - */ - id: number | string; -} -``` - -A request that got canceled still needs to return from the server and send a response back. It can not be left open / hanging. This is in line with the JSON RPC protocol that requires that every request sends a response back. In addition it allows for returning partial results on cancel. If the request returns an error response on cancellation it is advised to set the error code to `ErrorCodes.RequestCancelled`. - -## Language Server Protocol - -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. - -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 - -#### URI - -URI's are transferred as strings. The URI's format is defined in [http://tools.ietf.org/html/rfc3986](http://tools.ietf.org/html/rfc3986) - -``` - foo://example.com:8042/over/there?name=ferret#nose - \_/ \______________/\_________/ \_________/ \__/ - | | | | | -scheme authority path query fragment - | _____________________|__ - / \ / \ - urn:example:animal:ferret:nose -``` - -We also maintain a node module to parse a string into `scheme`, `authority`, `path`, `query`, and `fragment` URI components. The GitHub repository is [https://github.com/Microsoft/vscode-uri](https://github.com/Microsoft/vscode-uri) the npm module is [https://www.npmjs.com/package/vscode-uri](https://www.npmjs.com/package/vscode-uri). - -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. - -```typescript -type DocumentUri = string; -``` - -#### Text Documents - -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'. - -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']; -``` - -#### Position - -Position in a text document expressed as zero-based line and zero-based character offset. A position is between two characters like an 'insert' cursor in an editor. Special values like for example `-1` to denote the end of a line are not supported. - -```typescript -interface Position { - /** - * Line position in a document (zero-based). - */ - line: number; - - /** - * 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`. - * - * If the character value is greater than the line length it defaults back to the - * line length. - */ - character: number; -} -``` -#### Range - -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: -```typescript -{ - start: { line: 5, character: 23 }, - end : { line 6, character : 0 } -} -``` - -```typescript -interface Range { - /** - * The range's start position. - */ - start: Position; - - /** - * The range's end position. - */ - end: Position; -} -``` - -#### Location - -Represents a location inside a resource, such as a line inside a text file. -```typescript -interface Location { - uri: DocumentUri; - range: Range; -} -``` - -#### LocationLink - -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 `targetRange`. See also `DocumentSymbol#range` - */ - targetSelectionRange: Range; -} -``` - -#### Diagnostic - -Represents a diagnostic, such as a compiler error or warning. Diagnostic objects are only valid in the scope of a resource. - -```typescript -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?: number; - - /** - * The diagnostic's code, which might appear in the user interface. - */ - code?: number | string; - - /** - * A human-readable string describing the source of this - * diagnostic, e.g. 'typescript' or 'super lint'. - */ - source?: string; - - /** - * The diagnostic's message. - */ - message: string; - - /** - * 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[]; -} -``` - -The protocol currently supports the following diagnostic severities: - -```typescript -namespace DiagnosticSeverity { - /** - * Reports an error. - */ - export const Error = 1; - /** - * Reports a warning. - */ - export const Warning = 2; - /** - * Reports an information. - */ - export const Information = 3; - /** - * Reports a hint. - */ - export const Hint = 4; -} -``` - -```typescript -/** - * Represents a related message and source code location for a diagnostic. This should be - * used to point to code locations that cause or 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; -} -``` - -#### Command - -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[]; -} -``` - -#### TextEdit - -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; -} -``` - -#### TextEdit[] - -Complex text manipulations are described with an array of `TextEdit`'s, representing a single change to the document. - -All text edits ranges refer to positions in the original document. 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. - -#### TextDocumentEdit - -Describes textual changes on a single text document. The text document is referred to as a `VersionedTextDocumentIdentifier` 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 or do any kind of ordering. However the edits must be non overlapping. - -```typescript -export interface TextDocumentEdit { - /** - * The text document to change. - */ - textDocument: VersionedTextDocumentIdentifier; - - /** - * The edits to be applied. - */ - edits: TextEdit[]; -} -``` - -### File Resource changes - -> New in version 3.13: - -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; -} - -/** - * 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; -} - -/** - * 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; -} -``` - -#### WorkspaceEdit - -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`. - -```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)[]); -} -``` - -#### TextDocumentIdentifier - -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; -} -``` - -#### TextDocumentItem - -An item to transfer a text document from the client to the server. - -```typescript -interface TextDocumentItem { - /** - * The text document's URI. - */ - uri: DocumentUri; - - /** - * The text document's language identifier. - */ - languageId: string; - - /** - * The version number of this document (it will increase after each - * change, including undo/redo). - */ - version: number; - - /** - * The content of the opened text document. - */ - text: string; -} -``` - -Text documents have a language identifier to identify a document on the server side when it handles more than one language to avoid re-interpreting the file extension. If a document refers to one of the programming languages listed below it is recommended that clients use those ids. - -Language | Identifier --------- | ---------- -ABAP | `abap` -Windows Bat | `bat` -BibTeX | `bibtex` -Clojure | `clojure` -Coffeescript | `coffeescript` -C | `c` -C++ | `cpp` -C# | `csharp` -CSS | `css` -Diff | `diff` -Dart | `dart` -Dockerfile | `dockerfile` -F# | `fsharp` -Git | `git-commit` and `git-rebase` -Go | `go` -Groovy | `groovy` -Handlebars | `handlebars` -HTML | `html` -Ini | `ini` -Java | `java` -JavaScript | `javascript` -JavaScript React | `javascriptreact` -JSON | `json` -LaTeX | `latex` -Less | `less` -Lua | `lua` -Makefile | `makefile` -Markdown | `markdown` -Objective-C | `objective-c` -Objective-C++ | `objective-cpp` -Perl | `perl` -Perl 6 | `perl6` -PHP | `php` -Powershell | `powershell` -Pug | `jade` -Python | `python` -R | `r` -Razor (cshtml) | `razor` -Ruby | `ruby` -Rust | `rust` -SCSS | `scss` (syntax using curly brackets), `sass` (indented syntax) -Scala | `scala` -ShaderLab | `shaderlab` -Shell Script (Bash) | `shellscript` -SQL | `sql` -Swift | `swift` -TypeScript | `typescript` -TypeScript React| `typescriptreact` -TeX | `tex` -Visual Basic | `vb` -XML | `xml` -XSL | `xsl` -YAML | `yaml` -{: .table .table-bordered .table-responsive} - -#### VersionedTextDocumentIdentifier - -An identifier to denote a specific version of a text document. - -```typescript -interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. If a versioned text document identifier - * is sent from the server to the client and the file is not open in the editor - * (the server has not received an open notification before) the server can send - * `null` to indicate that the version is known and the content on disk is the - * truth (as speced with document content ownership). - * - * The version number of a document will increase after each change, including - * undo/redo. The number doesn't need to be consecutive. - */ - version: number | null; -} -``` - -#### TextDocumentPositionParams - -Was `TextDocumentPosition` in 1.0 with inlined parameters. - -A parameter literal used in requests to pass a text document and a position inside that document. - -```typescript -interface TextDocumentPositionParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The position inside the text document. - */ - position: Position; -} -``` - -#### DocumentFilter - -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`: -```typescript -{ language: 'typescript', scheme: 'file' } -{ language: 'json', pattern: '**/package.json' } -``` - -```typescript -export interface DocumentFilter { - /** - * A language id, like `typescript`. - */ - language?: string; - - /** - * A Uri [scheme](#Uri.scheme), like `file` or `untitled`. - */ - scheme?: string; - - /** - * A glob pattern, like `*.{ts,js}`. - * - * 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`) - */ - pattern?: string; -} -``` - -A document selector is the combination of one or more document filters. - -```typescript -export type DocumentSelector = DocumentFilter[]; -``` - -#### MarkupContent - - 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`. - -```typescript -/** - * Describes the content type that a client supports in various - * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. - * - * Please note that `MarkupKinds` must not start with a `$`. This kinds - * are reserved for internal usage. - */ -export namespace MarkupKind { - /** - * Plain text is supported as a content format - */ - export const PlainText: 'plaintext' = 'plaintext'; - - /** - * Markdown is supported as a content format - */ - export const Markdown: 'markdown' = 'markdown'; -} -export type MarkupKind = 'plaintext' | 'markdown'; - -/** - * A `MarkupContent` literal represents a string value which content is interpreted base on its - * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds. - * - * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues. - * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting - * - * Here is an example how such a string can be constructed using JavaScript / TypeScript: - * ```typescript - * let markdown: MarkdownContent = { - * kind: MarkupKind.Markdown, - * value: [ - * '# Header', - * 'Some text', - * '```typescript', - * 'someCode();', - * '```' - * ].join('\n') - * }; - * ``` - * - * *Please Note* that clients might sanitize the return markdown. A client could decide to - * remove HTML from the markdown to avoid script execution. - */ -export interface MarkupContent { - /** - * The type of the Markup - */ - kind: MarkupKind; - - /** - * The content itself - */ - value: string; -} -``` - -### Actual Protocol - -This section documents the actual language server protocol. It uses the following format: - -* a header describing the request -* 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 -* a _Response_: section describing the format of the response. The result item describes the returned data in case of a success. 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 spec'd 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 _Registration Options_ section describing the registration option if the request or notification supports dynamic capability registration. - -#### 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. - -#### Initialize Request (:leftwards_arrow_with_hook:) - -The initialize request is sent as the first request from the client to the server. If the server receives a request or notification before the `initialize` request it should act as follows: - -* For a request the response should be an error with `code: -32002`. The message can be picked by the server. -* Notifications should be dropped, except for the exit notification. This will allow the exit of a server without an initialize request. - -Until the server has responded to the `initialize` request with an `InitializeResult`, the client must not send any additional requests or notifications to the server. In addition the server is not allowed to send any requests or notifications to the client until it has responded with an `InitializeResult`, with the exception that during the `initialize` request the server is allowed to send the notifications `window/showMessage`, `window/logMessage` and `telemetry/event` as well as the `window/showMessageRequest` request to the client. - -The `initialize` request may only be sent once. - -_Request_: -* method: 'initialize' -* params: `InitializeParams` defined as follows: - -```typescript -interface InitializeParams { - /** - * The process Id of the parent process that started - * the server. Is null if the process has not been started by another process. - * If the parent process is not alive then the server should exit (see exit notification) its process. - */ - processId: number | null; - - /** - * The rootPath of the workspace. Is null - * if no folder is open. - * - * @deprecated in favour of rootUri. - */ - rootPath?: string | null; - - /** - * The rootUri of the workspace. Is null if no - * folder is open. If both `rootPath` and `rootUri` are set - * `rootUri` wins. - */ - rootUri: DocumentUri | null; - - /** - * User provided initialization options. - */ - initializationOptions?: any; - - /** - * The capabilities provided by the client (editor or tool) - */ - capabilities: ClientCapabilities; - - /** - * The initial trace setting. If omitted trace is disabled ('off'). - */ - trace?: 'off' | 'messages' | 'verbose'; - - /** - * The workspace folders configured in the client when the server starts. - * This property is only available if the client supports workspace folders. - * It can be `null` if the client supports workspace folders but none are - * configured. - * - * Since 3.6.0 - */ - workspaceFolders?: WorkspaceFolder[] | null; -} -``` -Where `ClientCapabilities`, `TextDocumentClientCapabilities` and `WorkspaceClientCapabilities` are defined as follows: - -##### `WorkspaceClientCapabilities` define capabilities the editor / tool provides on the workspace: - -> New in version 3.13: `ResourceOperationKind` and `FailureHandlingKind` and the client capability `workspace.workspaceEdit.resourceOperations` as well as `workspace.workspaceEdit.failureHandling`. - -```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'; -} - -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 transactionally. 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 transactionally. - * 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 succeeds. - */ - export const Undo: FailureHandlingKind = 'undo'; -} - -/** - * Workspace specific client capabilities. - */ -export interface WorkspaceClientCapabilities { - /** - * The client supports applying batch edits to the workspace by supporting - * the request 'workspace/applyEdit' - */ - applyEdit?: boolean; - - /** - * Capabilities specific to `WorkspaceEdit`s - */ - workspaceEdit?: { - /** - * 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. - */ - resourceOperations?: ResourceOperationKind[]; - - /** - * The failure handling strategy of a client if applying the workspace edit - * fails. - */ - failureHandling?: FailureHandlingKind; - }; - - /** - * Capabilities specific to the `workspace/didChangeConfiguration` notification. - */ - didChangeConfiguration?: { - /** - * Did change configuration notification supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `workspace/didChangeWatchedFiles` notification. - */ - didChangeWatchedFiles?: { - /** - * 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; - }; - - /** - * Capabilities specific to the `workspace/symbol` request. - */ - symbol?: { - /** - * 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[]; - } - }; - - /** - * Capabilities specific to the `workspace/executeCommand` request. - */ - executeCommand?: { - /** - * Execute command supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * The client has support for workspace folders. - * - * Since 3.6.0 - */ - workspaceFolders?: boolean; - - /** - * The client supports `workspace/configuration` requests. - * - * Since 3.6.0 - */ - configuration?: boolean; -} -``` - -##### `TextDocumentClientCapabilities` define capabilities the editor / tool provides on text documents. - -```typescript -/** - * Text document specific client capabilities. - */ -export interface TextDocumentClientCapabilities { - - synchronization?: { - /** - * Whether text document synchronization supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports sending will save notifications. - */ - willSave?: boolean; - - /** - * The client supports sending a will save request and - * waits for a response providing text edits which will - * be applied to the document before it is saved. - */ - willSaveWaitUntil?: boolean; - - /** - * The client supports did save notifications. - */ - didSave?: boolean; - } - - /** - * Capabilities specific to the `textDocument/completion` - */ - completion?: { - /** - * Whether completion supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `CompletionItem` specific - * capabilities. - */ - completionItem?: { - /** - * The client supports snippets as insert text. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - */ - snippetSupport?: boolean; - - /** - * The client supports commit characters on a completion item. - */ - commitCharactersSupport?: boolean - - /** - * The client supports the following content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * The client supports the deprecated property on a completion item. - */ - deprecatedSupport?: boolean; - - /** - * The client supports the preselect property on a completion item. - */ - preselectSupport?: boolean; - } - - completionItemKind?: { - /** - * The completion item 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 completion items kinds from `Text` to `Reference` as defined in - * the initial version of the protocol. - */ - valueSet?: CompletionItemKind[]; - }, - - /** - * The client supports to send additional context information for a - * `textDocument/completion` request. - */ - contextSupport?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/hover` - */ - hover?: { - /** - * Whether hover supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the follow content formats for the content - * property. The order describes the preferred format of the client. - */ - contentFormat?: MarkupKind[]; - }; - - /** - * Capabilities specific to the `textDocument/signatureHelp` - */ - signatureHelp?: { - /** - * Whether signature help supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `SignatureInformation` - * specific properties. - */ - signatureInformation?: { - /** - * The client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client capabilities specific to parameter information. - */ - parameterInformation?: { - /** - * The client supports processing label offsets instead of a - * simple label string. - * - * Since 3.14.0 - */ - labelOffsetSupport?: boolean; - } - }; - }; - - /** - * Capabilities specific to the `textDocument/references` - */ - references?: { - /** - * Whether references supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/documentHighlight` - */ - documentHighlight?: { - /** - * Whether document highlight supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/documentSymbol` - */ - documentSymbol?: { - /** - * Whether document symbol supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * Specific capabilities for the `SymbolKind`. - */ - 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; - }; - - /** - * Capabilities specific to the `textDocument/formatting` - */ - formatting?: { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/rangeFormatting` - */ - rangeFormatting?: { - /** - * Whether range formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/onTypeFormatting` - */ - onTypeFormatting?: { - /** - * Whether on type formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/declaration` - */ - declaration?: { - /** - * Whether declaration 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; - - /** - * The client supports additional metadata in the form of declaration links. - * - * Since 3.14.0 - */ - linkSupport?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/definition`. - * - * Since 3.14.0 - */ - definition?: { - /** - * Whether definition supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports additional metadata in the form of definition links. - */ - linkSupport?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/typeDefinition` - * - * Since 3.6.0 - */ - typeDefinition?: { - /** - * Whether typeDefinition 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; - - /** - * The client supports additional metadata in the form of definition links. - * - * Since 3.14.0 - */ - linkSupport?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/implementation`. - * - * Since 3.6.0 - */ - implementation?: { - /** - * 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; - - /** - * The client supports additional metadata in the form of definition links. - * - * Since 3.14.0 - */ - linkSupport?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/codeAction` - */ - codeAction?: { - /** - * Whether code action supports dynamic registration. - */ - dynamicRegistration?: boolean; - /** - * The client support code action literals as a valid - * response of the `textDocument/codeAction` request. - * - * Since 3.8.0 - */ - codeActionLiteralSupport?: { - /** - * The code action kind is support with the following value - * set. - */ - codeActionKind: { - - /** - * The code action kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - */ - valueSet: CodeActionKind[]; - }; - }; - }; - - /** - * Capabilities specific to the `textDocument/codeLens` - */ - codeLens?: { - /** - * Whether code lens supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/documentLink` - */ - documentLink?: { - /** - * Whether document link supports dynamic registration. - */ - dynamicRegistration?: boolean; - }; - - /** - * Capabilities specific to the `textDocument/documentColor` and the - * `textDocument/colorPresentation` request. - * - * Since 3.6.0 - */ - colorProvider?: { - /** - * Whether colorProvider supports dynamic registration. If this is set to `true` - * the client supports the new `(ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)` - * return value for the corresponding server capability as well. - */ - dynamicRegistration?: boolean; - } - - /** - * Capabilities specific to the `textDocument/rename` - */ - rename?: { - /** - * Whether rename supports dynamic registration. - */ - dynamicRegistration?: boolean; - /** - * The client supports testing for validity of rename operations - * before execution. - */ - prepareSupport?: boolean; - }; - - /** - * Capabilities specific to `textDocument/publishDiagnostics`. - */ - publishDiagnostics?: { - /** - * Whether the clients accepts diagnostics with related information. - */ - relatedInformation?: boolean; - }; - /** - * Capabilities specific to `textDocument/foldingRange` requests. - * - * Since 3.10.0 - */ - foldingRange?: { - /** - * Whether implementation supports dynamic registration for folding range providers. If this is set to `true` - * the client supports the new `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)` - * 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?: number; - /** - * 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; - }; -} -``` - -`ClientCapabilities` now 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). - -```typescript -interface ClientCapabilities { - /** - * Workspace specific client capabilities. - */ - workspace?: WorkspaceClientCapabilities; - - /** - * Text document specific client capabilities. - */ - textDocument?: TextDocumentClientCapabilities; - - /** - * Experimental client capabilities. - */ - experimental?: any; -} -``` - -_Response_: -* result: `InitializeResult` defined as follows: - -```typescript -interface InitializeResult { - /** - * The capabilities the language server provides. - */ - capabilities: ServerCapabilities; -} -``` -* error.code: - -```typescript -/** - * Known error codes for an `InitializeError`; - */ -export namespace InitializeError { - /** - * 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: number = 1; -} -``` - -* error.data: - -```typescript -interface InitializeError { - /** - * Indicates whether the client execute the following retry logic: - * (1) show the message provided by the ResponseError to the user - * (2) user selects retry or cancel - * (3) if user selected retry the initialize method is sent again. - */ - retry: boolean; -} -``` - -The server can signal the following capabilities: - -```typescript -/** - * Defines how the host (editor) should sync document changes to the language server. - */ -export namespace TextDocumentSyncKind { - /** - * Documents should not be synced at all. - */ - export const None = 0; - - /** - * Documents are synced by always sending the full content - * of the document. - */ - export const Full = 1; - - /** - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * send. - */ - export const Incremental = 2; -} - -/** - * Completion options. - */ -export interface CompletionOptions { - /** - * The server provides support to resolve additional - * information for a completion item. - */ - resolveProvider?: boolean; - - /** - * The characters that trigger completion automatically. - */ - triggerCharacters?: string[]; -} -/** - * Signature help options. - */ -export interface SignatureHelpOptions { - /** - * The characters that trigger signature help - * automatically. - */ - triggerCharacters?: string[]; -} - -/** - * Code Action options. - */ -export interface CodeActionOptions { - /** - * CodeActionKinds that this server may return. - * - * The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server - * may list out every specific kind they provide. - */ - codeActionKinds?: CodeActionKind[]; -} - -/** - * Code Lens options. - */ -export interface CodeLensOptions { - /** - * Code lens has a resolve provider as well. - */ - resolveProvider?: boolean; -} - -/** - * Format document on type options. - */ -export interface DocumentOnTypeFormattingOptions { - /** - * A character on which formatting should be triggered, like `}`. - */ - firstTriggerCharacter: string; - - /** - * More trigger characters. - */ - moreTriggerCharacter?: string[]; -} - -/** - * Rename options - */ -export interface RenameOptions { - /** - * Renames should be checked and tested before being executed. - */ - prepareProvider?: boolean; -} - -/** - * Document link options. - */ -export interface DocumentLinkOptions { - /** - * Document links have a resolve provider as well. - */ - resolveProvider?: boolean; -} - -/** - * Execute command options. - */ -export interface ExecuteCommandOptions { - /** - * The commands to be executed on the server - */ - commands: string[] -} - -/** - * Save options. - */ -export interface SaveOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} - -/** - * Color provider options. - */ -export interface ColorProviderOptions { -} - -/** - * Folding range provider options. - */ -export interface FoldingRangeProviderOptions { -} - -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. If omitted open close notification should not - * be sent. - */ - openClose?: boolean; - /** - * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full - * and TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None. - */ - change?: number; - /** - * If present will save notifications are sent to the server. If omitted the notification should not be - * sent. - */ - willSave?: boolean; - /** - * If present will save wait until requests are sent to the server. If omitted the request should not be - * sent. - */ - willSaveWaitUntil?: boolean; - /** - * If present save notifications are sent to the server. If omitted the notification should not be - * sent. - */ - save?: SaveOptions; -} - -/** - * Static registration options to be returned in the initialize request. - */ -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; -} - -interface ServerCapabilities { - /** - * Defines how text documents are synced. Is either a detailed structure defining each notification or - * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to `TextDocumentSyncKind.None`. - */ - textDocumentSync?: TextDocumentSyncOptions | number; - /** - * The server provides hover support. - */ - hoverProvider?: boolean; - /** - * The server provides completion support. - */ - completionProvider?: CompletionOptions; - /** - * The server provides signature help support. - */ - signatureHelpProvider?: SignatureHelpOptions; - /** - * The server provides goto definition support. - */ - definitionProvider?: boolean; - /** - * The server provides Goto Type Definition support. - * - * Since 3.6.0 - */ - typeDefinitionProvider?: boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions); - /** - * The server provides Goto Implementation support. - * - * Since 3.6.0 - */ - implementationProvider?: boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions); - /** - * The server provides find references support. - */ - referencesProvider?: boolean; - /** - * The server provides document highlight support. - */ - documentHighlightProvider?: boolean; - /** - * The server provides document symbol support. - */ - documentSymbolProvider?: boolean; - /** - * The server provides workspace symbol support. - */ - workspaceSymbolProvider?: boolean; - /** - * The server provides code actions. The `CodeActionOptions` return type is only - * valid if the client signals code action literal support via the property - * `textDocument.codeAction.codeActionLiteralSupport`. - */ - codeActionProvider?: boolean | CodeActionOptions; - /** - * The server provides code lens. - */ - codeLensProvider?: CodeLensOptions; - /** - * The server provides document formatting. - */ - documentFormattingProvider?: boolean; - /** - * The server provides document range formatting. - */ - documentRangeFormattingProvider?: boolean; - /** - * The server provides document formatting on typing. - */ - documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions; - /** - * The server provides rename support. RenameOptions may only be - * specified if the client states that it supports - * `prepareSupport` in its initial `initialize` request. - */ - renameProvider?: boolean | RenameOptions; - /** - * The server provides document link support. - */ - documentLinkProvider?: DocumentLinkOptions; - /** - * The server provides color provider support. - * - * Since 3.6.0 - */ - colorProvider?: boolean | ColorProviderOptions | (ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions); - /** - * The server provides folding provider support. - * - * Since 3.10.0 - */ - foldingRangeProvider?: boolean | FoldingRangeProviderOptions | (FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions); - /** - * The server provides go to declaration support. - * - * Since 3.14.0 - */ - declarationProvider?: boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions); - /** - * The server provides execute command support. - */ - executeCommandProvider?: ExecuteCommandOptions; - /** - * Workspace specific server capabilities - */ - workspace?: { - /** - * The server supports workspace folder. - * - * Since 3.6.0 - */ - workspaceFolders?: { - /** - * The server has support for workspace folders - */ - supported?: boolean; - /** - * Whether the server wants to receive workspace folder - * change notifications. - * - * If a strings is provided the string is treated as a 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; - } - } - /** - * Experimental server capabilities. - */ - experimental?: any; -} -``` - -#### Initialized Notification (:arrow_right:) - -The initialized notification is sent from the client to the server after the client received the result of the `initialize` request but before the client is sending any other request or notification to the server. The server can use the `initialized` notification for example to dynamically register capabilities. The `initialized` notification may only be sent once. - -_Notification_: -* method: 'initialized' -* params: `InitializedParams` defined as follows: - -```typescript -interface InitializedParams { -} -``` - -#### Shutdown Request (:leftwards_arrow_with_hook:) - -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 requests. If a server receives requests after a shutdown request those requests should be errored with `InvalidRequest`. - -_Request_: -* method: 'shutdown' -* params: void - -_Response_: -* result: null -* error: code and message set in case an exception happens during shutdown request. - -#### Exit Notification (:arrow_right:) - -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 - -#### ShowMessage Notification (:arrow_left:) - -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: number; - - /** - * 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; -} -``` - -#### ShowMessage Request (:arrow_right_hook:) - -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. - -_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: number; - - /** - * 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; -} -``` - -#### LogMessage Notification (:arrow_left:) - -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: number; - - /** - * The actual message - */ - message: string; -} -``` - -Where type is defined as above. - -#### Telemetry Notification (:arrow_left:) - -The telemetry notification is sent from the server to the client to ask the client to log a telemetry event. - -_Notification_: -* method: 'telemetry/event' -* params: 'any' - -#### Register Capability (:arrow_right_hook:) - -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). - -_Request_: -* method: 'client/registerCapability' -* params: `RegistrationParams` - -Where `RegistrationParams` are defined as follows: - -```typescript -/** - * General parameters to register for a capability. - */ -export interface Registration { - /** - * The id used to register the request. The id can be used to deregister - * the request again. - */ - id: string; - - /** - * The method / capability to register for. - */ - method: string; - - /** - * Options necessary for the registration. - */ - registerOptions?: any; -} - -export interface RegistrationParams { - registrations: Registration[]; -} -``` - -Since most of the registration options require to specify a document selector there is a base interface that can be used. - -```typescript -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; -} -``` - -An example JSON RPC message to register dynamically for the `textDocument/willSaveWaitUntil` feature on the client side is as follows (only details shown): - -```json -{ - "method": "client/registerCapability", - "params": { - "registrations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil", - "registerOptions": { - "documentSelector": [ - { "language": "javascript" } - ] - } - } - ] - } -} -``` - -This message is sent from the server to the client and after the client has successfully executed the request further `textDocument/willSaveWaitUntil` requests for JavaScript text documents are sent from the client to the server. - -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. - -#### Unregister Capability (:arrow_right_hook:) - -The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability. - -_Request_: -* method: 'client/unregisterCapability' -* params: `UnregistrationParams` - -Where `UnregistrationParams` are defined as follows: - -```typescript -/** - * General parameters to unregister a capability. - */ -export interface Unregistration { - /** - * The id used to unregister the request or notification. Usually an id - * provided during the register request. - */ - id: string; - - /** - * The method / capability to unregister for. - */ - method: string; -} - -export interface UnregistrationParams { - unregisterations: Unregistration[]; -} -``` - -An example JSON RPC message to unregister the above registered `textDocument/willSaveWaitUntil` feature looks like this: - -```json -{ - "method": "client/unregisterCapability", - "params": { - "unregisterations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil" - } - ] - } -} -``` -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. - -##### Workspace folders request (:arrow_right_hook:) - -> *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. - -_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 - -##### DidChangeWorkspaceFolders Notification (:arrow_right:) - -> *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 _ServerCapabilities/workspace/workspaceFolders_ and _ClientCapabilities/workspace/workspaceFolders_ 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: - -```typescript -export interface DidChangeWorkspaceFoldersParams { - /** - * The actual workspace folder change event. - */ - 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[]; -} -``` - -#### DidChangeConfiguration Notification (:arrow_right:) - -A notification sent from the client to the server to signal the change of configuration settings. - -_Notification_: -* method: 'workspace/didChangeConfiguration', -* params: `DidChangeConfigurationParams` defined as follows: - -```typescript -interface DidChangeConfigurationParams { - /** - * The actual changed settings - */ - settings: any; -} -``` - -#### Configuration Request (:arrow_right_hook:) - -> *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. - -_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; -} -``` - -_Response_: -* result: any[] -* error: code and message set in case an exception happens during the 'workspace/configuration' request - -#### DidChangeWatchedFiles Notification (:arrow_right:) - -The watched files notification is sent from the client to the server when the client detects changes to files watched by the language client. It is recommended that servers register for these file 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 watching mechanism and not rely on clients to provide file events. However this is not recommended due to the following reasons: - -- to our experience getting file watching on disk right is challenging, especially if it needs to be supported across multiple OSes. -- file watching is not for free especially if the implementation uses some sort of polling and keeps a file 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 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. - - -_Notification_: -* method: 'workspace/didChangeWatchedFiles' -* params: `DidChangeWatchedFilesParams` defined as follows: - -```typescript -interface DidChangeWatchedFilesParams { - /** - * The actual file events. - */ - changes: FileEvent[]; -} -``` - -Where FileEvents are described as follows: - -```typescript -/** - * An event describing a file change. - */ -interface FileEvent { - /** - * The file's URI. - */ - uri: DocumentUri; - /** - * The change type. - */ - type: number; -} - -/** - * 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; -} -``` - -_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 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`) - */ - globPattern: string; - - /** - * The kind of events of interest. If omitted it defaults - * to WatchKind.Create | WatchKind.Change | WatchKind.Delete - * which is 7. - */ - kind?: number; -} - -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; -} -``` - -#### Workspace Symbols Request (:leftwards_arrow_with_hook:) - -The workspace symbol request is sent from the client to the server to list project-wide symbols matching the query string. - -_Request_: -* method: 'workspace/symbol' -* params: `WorkspaceSymbolParams` defined as follows: - -```typescript -/** - * The parameters of a Workspace Symbol Request. - */ -interface WorkspaceSymbolParams { - /** - * A non-empty query string - */ - query: string; -} -``` - -_Response_: -* result: `SymbolInformation[]` \| `null` as defined above. -* error: code and message set in case an exception happens during the workspace symbol request. - -_Registration Options_: void - - -#### Execute a command (:leftwards_arrow_with_hook:) - -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. - -_Request:_ -* method: 'workspace/executeCommand' -* params: `ExecuteCommandParams` defined as follows: - -```typescript -export interface ExecuteCommandParams { - - /** - * 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. - -_Registration Options_: `ExecuteCommandRegistrationOptions` defined as follows: - -```typescript -/** - * Execute command registration options. - */ -export interface ExecuteCommandRegistrationOptions { - /** - * The commands to be executed on the server - */ - commands: string[] -} -``` - - -#### Applies a WorkspaceEdit (:arrow_right_hook:) - -The `workspace/applyEdit` request is sent from the server to the client to modify resource on the client side. - -_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 may be used by the server for diagnostic - * logging or to provide a suitable error for a request that - * triggered the edit. - */ - failureReason?: string; -} -``` -* error: code and message set in case an exception happens during the request. - - -#### DidOpenTextDocument Notification (:arrow_right:) - -The document open notification is sent from the client to the server to signal newly opened text documents. The document's truth is now managed by the client and the server must not try to read the document's truth using the document's Uri. Open in this sense means it is managed by the client. It doesn't necessarily mean that its content is presented in an editor. An open notification must not be sent more than once without a corresponding close notification send before. This means open and close notification must be balanced and the max open count for a particular textDocument is one. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -The `DidOpenTextDocumentParams` contain the language id the document is associated with. If the language id of a document changes, the client needs to send a `textDocument/didClose` to the server followed by a `textDocument/didOpen` with the new language id if the server handles the new language id as well. - -_Notification_: -* method: 'textDocument/didOpen' -* params: `DidOpenTextDocumentParams` defined as follows: - -```typescript -interface DidOpenTextDocumentParams { - /** - * The document that was opened. - */ - textDocument: TextDocumentItem; -} -``` - -_Registration Options_: `TextDocumentRegistrationOptions` - - -#### DidChangeTextDocument Notification (:arrow_right:) - -The document change notification is sent from the client to the server to signal changes to a text document. In 2.0 the shape of the params has changed to include proper version numbers and language ids. - -_Notification_: -* method: 'textDocument/didChange' -* params: `DidChangeTextDocumentParams` defined as follows: - -```typescript -interface DidChangeTextDocumentParams { - /** - * The document that did change. The version number points - * to the version after all provided content changes have - * been applied. - */ - textDocument: VersionedTextDocumentIdentifier; - - /** - * The actual content changes. The content changes describe single state changes - * to the document. So if there are two content changes c1 and c2 for a document - * in state S then c1 move the document to S' and c2 to S''. - */ - contentChanges: TextDocumentContentChangeEvent[]; -} - -/** - * 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. - */ -interface TextDocumentContentChangeEvent { - /** - * The range of the document that changed. - */ - range?: Range; - - /** - * The length of the range that got replaced. - */ - rangeLength?: number; - - /** - * The new text of the range/document. - */ - text: string; -} -``` - -_Registration Options_: `TextDocumentChangeRegistrationOptions` defined as follows: - -```typescript -/** - * Describe options to be used when registering for text document change events. - */ -export interface TextDocumentChangeRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * How documents are synced to the server. See TextDocumentSyncKind.Full - * and TextDocumentSyncKind.Incremental. - */ - syncKind: number; -} -``` - - -#### WillSaveTextDocument Notification (:arrow_right:) - -The document will save notification is sent from the client to the server before the document is actually saved. - -_Notification_: -* method: 'textDocument/willSave' -* params: `WillSaveTextDocumentParams` defined as follows: - -```typescript -/** - * The parameters send in a will save text document notification. - */ -export interface WillSaveTextDocumentParams { - /** - * The document that will be saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * The 'TextDocumentSaveReason'. - */ - reason: number; -} - -/** - * Represents reasons why a text document is saved. - */ -export namespace TextDocumentSaveReason { - - /** - * Manually triggered, e.g. by the user pressing save, by starting debugging, - * or by an API call. - */ - export const Manual = 1; - - /** - * Automatic after a delay. - */ - export const AfterDelay = 2; - - /** - * When the editor lost focus. - */ - export const FocusOut = 3; -} -``` - -_Registration Options_: `TextDocumentRegistrationOptions` - - -#### WillSaveWaitUntilTextDocument Request (:leftwards_arrow_with_hook:) - -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. - -_Request_: -* method: 'textDocument/willSaveWaitUntil' -* params: `WillSaveTextDocumentParams` - -_Response_: -* result:`TextEdit[]` \| `null` -* error: code and message set in case an exception happens during the `willSaveWaitUntil` request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### DidSaveTextDocument Notification (:arrow_right:) - -The document save notification is sent from the client to the server when the document was saved in the client. - -* method: 'textDocument/didSave' -* params: `DidSaveTextDocumentParams` defined as follows: - -```typescript -interface DidSaveTextDocumentParams { - /** - * The document that was saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * Optional the content when saved. Depends on the includeText value - * when the save notification was requested. - */ - text?: string; -} -``` - -_Registration Options_: `TextDocumentSaveRegistrationOptions` defined as follows: - -```typescript -export interface TextDocumentSaveRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -#### DidCloseTextDocument Notification (:arrow_right:) - -The document close notification is sent from the client to the server when the document got closed in the client. The document's truth now exists where the document's Uri points to (e.g. if the document's Uri is a file Uri the truth now exists on disk). As with the open notification the close notification is about managing the document's content. Receiving a close notification doesn't mean that the document was open in an editor before. A close notification requires a previous open notification to be sent. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -_Notification_: -* method: 'textDocument/didClose' -* params: `DidCloseTextDocumentParams` defined as follows: - -```typescript -interface DidCloseTextDocumentParams { - /** - * The document that was closed. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Registration Options_: `TextDocumentRegistrationOptions` - - -#### PublishDiagnostics Notification (:arrow_left:) - -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. -* 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. - -_Notification_: -* method: 'textDocument/publishDiagnostics' -* params: `PublishDiagnosticsParams` defined as follows: - -```typescript -interface PublishDiagnosticsParams { - /** - * The URI for which diagnostic information is reported. - */ - uri: DocumentUri; - - /** - * An array of diagnostic information items. - */ - diagnostics: Diagnostic[]; -} -``` - -#### Completion Request (:leftwards_arrow_with_hook:) - -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. The request can delay the computation of the `detail` and `documentation` properties. However, properties that are needed for the initial sorting and filtering, like `sortText`, `filterText`, `insertText`, and `textEdit` must be provided in the `textDocument/completion` response and must not be changed during resolve. - -_Request_: -* method: 'textDocument/completion' -* params: `CompletionParams` defined as follows: - -```typescript -export interface CompletionParams extends TextDocumentPositionParams { - - /** - * The completion context. This is only available if the client specifies - * to send this using `ClientCapabilities.textDocument.completion.contextSupport === true` - */ - context?: CompletionContext; -} - -/** - * How a completion was triggered - */ -export namespace CompletionTriggerKind { - /** - * Completion was triggered by typing an identifier (24x7 code - * complete), manual invocation (e.g Ctrl+Space) or via API. - */ - export const Invoked: 1 = 1; - - /** - * Completion was triggered by a trigger character specified by - * the `triggerCharacters` properties of the `CompletionRegistrationOptions`. - */ - export const TriggerCharacter: 2 = 2; - - /** - * Completion was re-triggered as the current completion list is incomplete. - */ - export const TriggerForIncompleteCompletions: 3 = 3; -} -export type CompletionTriggerKind = 1 | 2 | 3; - - -/** - * Contains additional information about the context in which a completion request is triggered. - */ -export interface CompletionContext { - /** - * How the completion was triggered. - */ - triggerKind: CompletionTriggerKind; - - /** - * The trigger character (a single character) that has trigger code complete. - * Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter` - */ - triggerCharacter?: string; -} -``` - -_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 }` - -```typescript -/** - * Represents a collection of [completion items](#CompletionItem) to be presented - * in the editor. - */ -interface CompletionList { - /** - * This list is not complete. Further typing should result in recomputing - * this list. - * - * Recomputed lists have all their items replaced (not appended) in the - * incomplete completion sessions. - */ - isIncomplete: boolean; - - /** - * The completion items. - */ - items: CompletionItem[]; -} - -/** - * Defines whether the insert text in a completion item should be interpreted as - * plain text or a snippet. - */ -namespace InsertTextFormat { - /** - * The primary text to be inserted is treated as a plain string. - */ - export const PlainText = 1; - - /** - * The primary text to be inserted is treated as a snippet. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - */ - export const Snippet = 2; -} - -type InsertTextFormat = 1 | 2; - -interface CompletionItem { - /** - * The label of this completion item. By default - * also the text that is inserted when selecting - * this completion. - */ - label: string; - - /** - * 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`. - */ - kind?: number; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - detail?: string; - - /** - * A human-readable string that represents a doc-comment. - */ - documentation?: string | MarkupContent; - - /** - * Indicates if this item is deprecated. - */ - deprecated?: boolean; - - /** - * Select this item when showing. - * - * *Note* that only one completion item can be selected and that the - * tool / client decides which item that is. The rule is that the *first* - * item of those that match best is selected. - */ - preselect?: boolean; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the label is used. - */ - sortText?: string; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the label is used. - */ - filterText?: string; - - /** - * A string that should be inserted into a document when selecting - * this completion. When `falsy` the label is used. - * - * The `insertText` is subject to interpretation by the client side. - * Some tools might not take the string literally. For example - * VS Code when code complete is requested in this example `con` - * and a completion item with an `insertText` of `console` is provided it - * will only insert `sole`. Therefore it is recommended to use `textEdit` instead - * since it avoids additional client side interpretation. - */ - insertText?: string; - - /** - * The format of the insert text. The format applies to both the `insertText` property - * and the `newText` property of a provided `textEdit`. If ommitted defaults to - * `InsertTextFormat.PlainText`. - */ - insertTextFormat?: InsertTextFormat; - - /** - * An edit which is applied to a document when selecting this completion. When an edit is provided the value of - * `insertText` is ignored. - * - * *Note:* The range of the edit must be a single line range and it must contain the position at which completion - * has been requested. - */ - textEdit?: TextEdit; - - /** - * 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. - * - * Additional text edits should be used to change text unrelated to the current cursor position - * (for example adding an import statement at the top of the file if the completion item will - * insert an unqualified type). - */ - additionalTextEdits?: TextEdit[]; - - /** - * An optional set of characters that when pressed while this completion is active will accept it first and - * then type that character. *Note* that all commit characters should have `length=1` and that superfluous - * characters will be ignored. - */ - commitCharacters?: string[]; - - /** - * An optional command that is executed *after* inserting this completion. *Note* that - * additional modifications to the current document should be described with the - * additionalTextEdits-property. - */ - command?: Command; - - /** - * A data entry field that is preserved on a completion item between - * a completion and a completion resolve request. - */ - data?: any -} - -/** - * The kind of a completion entry. - */ -namespace CompletionItemKind { - export const Text = 1; - export const Method = 2; - export const Function = 3; - export const Constructor = 4; - export const Field = 5; - export const Variable = 6; - export const Class = 7; - export const Interface = 8; - export const Module = 9; - export const Property = 10; - export const Unit = 11; - export const Value = 12; - export const Enum = 13; - export const Keyword = 14; - export const Snippet = 15; - export const Color = 16; - export const File = 17; - export const Reference = 18; - export const Folder = 19; - export const EnumMember = 20; - export const Constant = 21; - export const Struct = 22; - export const Event = 23; - export const Operator = 24; - export const TypeParameter = 25; -} -``` -* error: code and message set in case an exception happens during the completion request. - -_Registration Options_: `CompletionRegistrationOptions` options defined as follows: - -```typescript -export interface CompletionRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * Most tools trigger completion request automatically without explicitly requesting - * it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user - * starts to type an identifier. For example if the user types `c` in a JavaScript file - * code complete will automatically pop up present `console` besides others as a - * completion item. Characters that make up identifiers don't need to be listed here. - * - * If code complete should automatically be trigger on characters not being valid inside - * an identifier (for example `.` in JavaScript) list them in `triggerCharacters`. - */ - triggerCharacters?: string[]; - - /** - * The list of all possible characters that commit a completion. This field can be used - * if clients don't support individual commmit characters per completion item. See - * `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`. - * - * If a server provides both `allCommitCharacters` and commit characters on an individual - * completion item the ones on the completion item win. - * - * Since 3.2.0 - */ - allCommitCharacters?: string[]; - - /** - * The server provides support to resolve additional - * information for a completion item. - */ - resolveProvider?: boolean; -} -``` - -Completion items support snippets (see `InsertTextFormat.Snippet`). The snippet format is as follows: - -##### Snippet Syntax - -The `body` of a snippet can use special constructs to control cursors and the text being inserted. The following are supported features and their syntaxes: - -##### Tab stops - -With tab stops, you can make the editor cursor move inside a snippet. Use `$1`, `$2` to specify cursor locations. The number is the order in which tab stops will be visited, whereas `$0` denotes the final cursor position. Multiple tab stops are linked and updated in sync. - -##### Placeholders - -Placeholders are tab stops with values, like `${1:foo}`. The placeholder text will be inserted and selected such that it can be easily changed. Placeholders can be nested, like `${1:another ${2:placeholder}}`. - -##### Choice - -Placeholders can have choices as values. The syntax is a comma separated enumeration of values, enclosed with the pipe-character, for example `${1|one,two,three|}`. When the snippet is inserted and the placeholder selected, choices will prompt the user to pick one of the values. - -##### Variables - -With `$name` or `${name:default}` you can insert the value of a variable. When a variable isn’t set, its *default* or the empty string is inserted. When a variable is unknown (that is, its name isn’t defined) the name of the variable is inserted and it is transformed into a placeholder. - -The following variables can be used: - -* `TM_SELECTED_TEXT` The currently selected text or the empty string -* `TM_CURRENT_LINE` The contents of the current line -* `TM_CURRENT_WORD` The contents of the word under cursor or the empty string -* `TM_LINE_INDEX` The zero-index based line number -* `TM_LINE_NUMBER` The one-index based line number -* `TM_FILENAME` The filename of the current document -* `TM_FILENAME_BASE` The filename of the current document without its extensions -* `TM_DIRECTORY` The directory of the current document -* `TM_FILEPATH` The full file path of the current document - -##### Variable Transforms - -Transformations allow you to modify the value of a variable before it is inserted. The definition of a transformation consists of three parts: - -1. A regular expression that is matched against the value of a variable, or the empty string when the variable cannot be resolved. -2. A "format string" that allows to reference matching groups from the regular expression. The format string allows for conditional inserts and simple modifications. -3. Options that are passed to the regular expression. - -The following example inserts the name of the current file without its ending, so from `foo.txt` it makes `foo`. - -``` -${TM_FILENAME/(.*)\..+$/$1/} - | | | | - | | | |-> no options - | | | - | | |-> references the contents of the first - | | capture group - | | - | |-> regex to capture everything before - | the final `.suffix` - | - |-> resolves to the filename -``` - -##### Grammar - -Below is the EBNF ([extended Backus-Naur form](https://en.wikipedia.org/wiki/Extended_Backus-Naur_form)) for snippets. With `\` (backslash), you can escape `$`, `}` and `\`. Within choice elements, the backslash also escapes comma and pipe characters. - -``` -any ::= tabstop | placeholder | choice | variable | text -tabstop ::= '$' int | '${' int '}' -placeholder ::= '${' int ':' any '}' -choice ::= '${' int '|' text (',' text)* '|}' -variable ::= '$' var | '${' var }' - | '${' var ':' any '}' - | '${' var '/' regex '/' (format | text)+ '/' options '}' -format ::= '$' int | '${' int '}' - | '${' int ':' '/upcase' | '/downcase' | '/capitalize' '}' - | '${' int ':+' if '}' - | '${' int ':?' if ':' else '}' - | '${' int ':-' else '}' | '${' int ':' else '}' -regex ::= JavaScript Regular Expression value (ctor-string) -options ::= JavaScript Regular Expression option (ctor-options) -var ::= [_a-zA-Z] [_a-zA-Z0-9]* -int ::= [0-9]+ -text ::= .* -``` - -#### Completion Item Resolve Request (:leftwards_arrow_with_hook:) - -The request is sent from the client to the server to resolve additional information for a given completion item. - -_Request_: -* method: 'completionItem/resolve' -* params: `CompletionItem` - -_Response_: -* result: `CompletionItem` -* error: code and message set in case an exception happens during the completion resolve request. - -#### Hover Request (:leftwards_arrow_with_hook:) - -The hover request is sent from the client to the server to request hover information at a given text document position. - -_Request_: -* method: 'textDocument/hover' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_Response_: -* result: `Hover` \| `null` defined as follows: - -```typescript -/** - * The result of a hover request. - */ -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: - -```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. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting - * - * 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. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Signature Help Request (:leftwards_arrow_with_hook:) - -The signature help request is sent from the client to the server to request signature information at a given cursor position. - -_Request_: -* method: 'textDocument/signatureHelp' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_Response_: -* result: `SignatureHelp` \| `null` defined as follows: - -```typescript -/** - * Signature help represents the signature of something - * callable. There can be multiple signature but only one - * active and only one active parameter. - */ -interface SignatureHelp { - /** - * One or more signatures. - */ - signatures: SignatureInformation[]; - - /** - * The active signature. If omitted or the value lies outside the - * range of `signatures` the value defaults to zero or is ignored if - * `signatures.length === 0`. Whenever possible implementors should - * make an active decision about the active signature and shouldn't - * rely on a default value. - * In future version of the protocol this property might become - * mandatory to better express this. - */ - activeSignature?: number; - - /** - * The active parameter of the active signature. If omitted or the value - * lies outside the range of `signatures[activeSignature].parameters` - * defaults to 0 if the active signature has parameters. If - * the active signature has no parameters it is ignored. - * In future version of the protocol this property might become - * mandatory to better express the active parameter if the - * active signature does have any. - */ - activeParameter?: number; -} - -/** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ -interface SignatureInformation { - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; - - /** - * The parameters of this signature. - */ - parameters?: ParameterInformation[]; -} - -/** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ -interface ParameterInformation { - - /** - * The label of this parameter information. - * - * Either a string or an inclusive start and exclusive end offsets within its containing - * signature label. (see SignatureInformation.label). The offsets are based on a UTF-16 - * string representation as `Position` and `Range` does. - * - * *Note*: a label of type string should be a substring of its containing signature label. - * Its intended use case is to highlight the parameter label part in the `SignatureInformation.label`. - */ - label: string | [number, number]; - - /** - * The human-readable doc-comment of this parameter. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; -} -``` - -* error: code and message set in case an exception happens during the signature help request. - -_Registration Options_: `SignatureHelpRegistrationOptions` defined as follows: - -```typescript -export interface SignatureHelpRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * The characters that trigger signature help - * automatically. - */ - triggerCharacters?: string[]; -} -``` -#### Goto Declaration Request (:leftwards_arrow_with_hook:) - -> *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 introduce with version 3.14.0 and depends in the corresponding client capability `clientCapabilities.textDocument.declaration.linkSupport`. - -_Request_: -* method: 'textDocument/declaration' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_Response_: -* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationlink)[] \|`null` -* error: code and message set in case an exception happens during the declaration request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Goto Definition Request (:leftwards_arrow_with_hook:) - -> *Since version 3.14.0* - -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 introduce with version 3.14.0 and depends in the corresponding client capability `clientCapabilities.textDocument.definition.linkSupport`. - -_Request_: -* method: 'textDocument/definition' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_Response_: -* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationlink)[] \| `null` -* error: code and message set in case an exception happens during the definition request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Goto Type Definition Request (:leftwards_arrow_with_hook:) - -> *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 introduce with version 3.14.0 and depends in the corresponding client capability `clientCapabilities.textDocument.typeDefinition.linkSupport`. - -_Request_: -* method: 'textDocument/typeDefinition' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_Response_: -* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationlink)[] \| `null` -* error: code and message set in case an exception happens during the definition request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Goto Implementation Request (:leftwards_arrow_with_hook:) - -> *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 introduce with version 3.14.0 and depends in the corresponding client capability `clientCapabilities.implementation.typeDefinition.linkSupport`. - -_Request_: -* method: 'textDocument/implementation' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_Response_: -* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationlink)[] \| `null` -* error: code and message set in case an exception happens during the definition request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Find References Request (:leftwards_arrow_with_hook:) - -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. - -_Request_: -* method: 'textDocument/references' -* params: `ReferenceParams` defined as follows: - -```typescript -interface ReferenceParams extends TextDocumentPositionParams { - context: ReferenceContext -} - -interface ReferenceContext { - /** - * Include the declaration of the current symbol. - */ - includeDeclaration: boolean; -} -``` -_Response_: -* result: [`Location`](#location)[] \| `null` -* error: code and message set in case an exception happens during the reference request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Document Highlights Request (:leftwards_arrow_with_hook:) - -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. - -_Request_: -* method: 'textDocument/documentHighlight' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_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. - * - */ -interface DocumentHighlight { - /** - * The range this highlight applies to. - */ - range: Range; - - /** - * The highlight kind, default is DocumentHighlightKind.Text. - */ - kind?: number; -} - -/** - * 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; -} -``` - -* error: code and message set in case an exception happens during the document highlight request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Document Symbols Request (:leftwards_arrow_with_hook:) - -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. - -_Request_: -* method: 'textDocument/documentSymbol' -* params: `DocumentSymbolParams` defined as follows: - -```typescript -interface DocumentSymbolParams { - /** - * 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; -} - -/** - * 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 class 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; - - /** - * Indicates if this symbol is deprecated. - */ - 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. - */ -interface SymbolInformation { - /** - * The name of this symbol. - */ - name: string; - - /** - * The kind of this symbol. - */ - kind: number; - - /** - * Indicates if this symbol is deprecated. - */ - 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; -} - -``` - -* error: code and message set in case an exception happens during the document symbol request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Code Action Request (:leftwards_arrow_with_hook:) - -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 the mode should be used. - -When the command is selected the server should be contacted again (via the `workspace/executeCommand`) request to execute the command. - -> *Since version 3.8.0:* support for CodeAction literals to enable the following scenarios: - -- the ability to directly return a workspace edit from the code action request. This avoids having another server roundtrip to execute an actual code action. However server providers should be aware that if the code action is expensive to compute or the edits are huge it might still be beneficial if the result is simply a command and the actual edit is only computed when needed. -- the ability to group code actions using a kind. Clients are allowed to ignore that information. However it allows them to better group code action for example into corresponding menus (e.g. all refactor code actions into a refactor menu). - -Clients need to announce their support for code action literals and code action kinds via the corresponding client capability `textDocument.codeAction.codeActionLiteralSupport`. - -_Request_: -* method: 'textDocument/codeAction' -* params: `CodeActionParams` defined as follows: - -```typescript -/** - * Params for the CodeActionRequest - */ -interface CodeActionParams { - /** - * The document in which the command was invoked. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range for which the command was invoked. - */ - range: Range; - - /** - * Context carrying additional information. - */ - context: CodeActionContext; -} - -/** - * The kind of a code action. - * - * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`. - * - * The set of kinds is open and client needs to announce the kinds it supports to the server during - * initialization. - */ -export type CodeActionKind = string; - -/** - * A set of predefined code action kinds - */ -export namespace CodeActionKind { - - /** - * Empty kind. - */ - export const Empty: CodeActionKind = ''; - - /** - * Base kind for quickfix actions: 'quickfix' - */ - export const QuickFix: CodeActionKind = 'quickfix'; - - /** - * Base kind for refactoring actions: 'refactor' - */ - export const Refactor: CodeActionKind = 'refactor'; - - /** - * Base kind for refactoring extraction actions: 'refactor.extract' - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - export const RefactorExtract: CodeActionKind = 'refactor.extract'; - - /** - * Base kind for refactoring inline actions: 'refactor.inline' - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - export const RefactorInline: CodeActionKind = 'refactor.inline'; - - /** - * Base kind for refactoring rewrite actions: 'refactor.rewrite' - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - Move method to base class - * - ... - */ - export const RefactorRewrite: CodeActionKind = 'refactor.rewrite'; - - /** - * Base kind for source actions: `source` - * - * Source code actions apply to the entire file. - */ - export const Source: CodeActionKind = 'source'; - - /** - * Base kind for an organize imports source action: `source.organizeImports` - */ - export const SourceOrganizeImports: CodeActionKind = 'source.organizeImports'; -} - -/** - * Contains additional diagnostic information about the context in which - * a code action is run. - */ -interface CodeActionContext { - /** - * An array of diagnostics. - */ - diagnostics: Diagnostic[]; - - /** - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out by the client before being shown. So servers - * can omit computing them. - */ - only?: CodeActionKind[]; -} -``` - -_Response_: -* result: `(Command | CodeAction)[]` \| `null` where `CodeAction` is defined as follows: - -```typescript -/** - * A code action represents a change that can be performed in code, e.g. to fix a problem or - * to refactor code. - * - * A CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed. - */ -export interface CodeAction { - - /** - * A short, human-readable, title for this code action. - */ - title: string; - - /** - * The kind of the code action. - * - * Used to filter code actions. - */ - kind?: CodeActionKind; - - /** - * The diagnostics that this code action resolves. - */ - diagnostics?: Diagnostic[]; - - /** - * The workspace edit this code action performs. - */ - edit?: WorkspaceEdit; - - /** - * A command this code action executes. If a code action - * provides an edit and a command, first the edit is - * executed and then the command. - */ - command?: Command; -} -``` - -* error: code and message set in case an exception happens during the code action request. - -_Registration Options_: `CodeActionRegistrationOptions` defined as follows: - -```typescript -export interface CodeActionRegistrationOptions extends TextDocumentRegistrationOptions, CodeActionOptions { -} -``` - - -#### Code Lens Request (:leftwards_arrow_with_hook:) - -The code lens request is sent from the client to the server to compute code lenses for a given text document. - -_Request_: -* method: 'textDocument/codeLens' -* params: `CodeLensParams` defined as follows: - -```typescript -interface CodeLensParams { - /** - * 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 -} -``` -* error: code and message set in case an exception happens during the code lens request. - -_Registration Options_: `CodeLensRegistrationOptions` defined as follows: - -```typescript -export interface CodeLensRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * Code lens has a resolve provider as well. - */ - resolveProvider?: boolean; -} -``` - -#### Code Lens Resolve Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Link Request (:leftwards_arrow_with_hook:) - -The document links request is sent from the client to the server to request the location of links in a document. - -_Request_: -* method: 'textDocument/documentLink' -* params: `DocumentLinkParams`, defined as follows: - -```typescript -interface DocumentLinkParams { - /** - * The document to provide document links for. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: -* result: An array of `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; - /** - * A data entry field that is preserved on a document link between a - * DocumentLinkRequest and a DocumentLinkResolveRequest. - */ - data?: any; -} -``` -* error: code and message set in case an exception happens during the document link request. - -_Registration Options_: `DocumentLinkRegistrationOptions` defined as follows: - -```typescript -export interface DocumentLinkRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * Document links have a resolve provider as well. - */ - resolveProvider?: boolean; -} -``` - -#### Document Link Resolve Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Color Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The document color request is sent from the client to the server to list all color references found in a given text document. Along with the range, a color value in RGB is returned. - -Clients can use the result to decorate color references in an editor. For example: -- Color boxes showing the actual color next to the reference -- Show a color picker when a color reference is edited - -_Request_: - -* method: 'textDocument/documentColor' -* params: `DocumentColorParams` defined as follows - -```ts -interface DocumentColorParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: -* result: `ColorInformation[]` defined as follows: - -```typescript -interface ColorInformation { - /** - * The range in the document where this color appears. - */ - range: Range; - - /** - * The actual color value for this color range. - */ - color: Color; -} - -/** - * Represents a color in RGBA space. - */ -interface Color { - - /** - * The red component of this color in the range [0-1]. - */ - readonly red: number; - - /** - * The green component of this color in the range [0-1]. - */ - readonly green: number; - - /** - * The blue component of this color in the range [0-1]. - */ - readonly blue: number; - - /** - * The alpha component of this color in the range [0-1]. - */ - readonly alpha: number; -} -``` -* error: code and message set in case an exception happens during the 'textDocument/documentColor' request - -#### Color Presentation Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The color presentation request is sent from the client to the server to obtain a list of presentations for a color value at a given location. Clients can use the result to -- modify a color reference. -- show in a color picker and let users pick one of the presentations - - -_Request_: - -* method: 'textDocument/colorPresentation' -* params: `ColorPresentationParams` defined as follows - -```typescript -interface ColorPresentationParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The color information to request presentations for. - */ - color: Color; - - /** - * The range where the color would be inserted. Serves as a context. - */ - range: Range; -} -``` - -_Response_: -* result: `ColorPresentation[]` defined as follows: - -```typescript -interface ColorPresentation { - /** - * The label of this color presentation. It will be shown on the color - * picker header. By default this is also the text that is inserted when selecting - * this color presentation. - */ - label: string; - /** - * An [edit](#TextEdit) which is applied to a document when selecting - * this presentation for the color. When `falsy` the [label](#ColorPresentation.label) - * is used. - */ - textEdit?: TextEdit; - /** - * An optional array of additional [text edits](#TextEdit) that are applied when - * selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves. - */ - additionalTextEdits?: TextEdit[]; -} -``` - -* error: code and message set in case an exception happens during the 'textDocument/colorPresentation' request - -#### Document Formatting Request (:leftwards_arrow_with_hook:) - -The document formatting request is sent from the client to the server to format a whole document. - -_Request_: -* method: 'textDocument/formatting' -* params: `DocumentFormattingParams` defined as follows - -```typescript -interface DocumentFormattingParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The format options. - */ - options: FormattingOptions; -} - -/** - * Value-object describing what options formatting should use. - */ -interface FormattingOptions { - /** - * Size of a tab in spaces. - */ - tabSize: number; - - /** - * Prefer spaces over tabs. - */ - insertSpaces: boolean; - - /** - * Signature for further properties. - */ - [key: string]: boolean | number | string; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textedit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the formatting request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Document Range Formatting Request (:leftwards_arrow_with_hook:) - -The document range formatting request is sent from the client to the server to format a given range in a document. - -_Request_: -* method: 'textDocument/rangeFormatting', -* params: `DocumentRangeFormattingParams` defined as follows: - -```typescript -interface DocumentRangeFormattingParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range to format - */ - range: Range; - - /** - * The format options - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textedit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the range formatting request. - -_Registration Options_: `TextDocumentRegistrationOptions` - -#### Document on Type Formatting Request (:leftwards_arrow_with_hook:) - -The document on type formatting request is sent from the client to the server to format parts of the document during typing. - -_Request_: -* method: 'textDocument/onTypeFormatting' -* params: `DocumentOnTypeFormattingParams` defined as follows: - -```typescript -interface DocumentOnTypeFormattingParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The position at which this request was sent. - */ - position: Position; - - /** - * The character that has been typed. - */ - ch: string; - - /** - * The format options. - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textedit) \| `null` describing the modification to the document. -* error: code and message set in case an exception happens during the range formatting request. - -_Registration Options_: `DocumentOnTypeFormattingRegistrationOptions` defined as follows: - -```typescript -export interface DocumentOnTypeFormattingRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * A character on which formatting should be triggered, like `}`. - */ - firstTriggerCharacter: string; - /** - * More trigger characters. - */ - moreTriggerCharacter?: string[] -} -``` -#### Rename Request (:leftwards_arrow_with_hook:) - -The rename request is sent from the client to the server to ask the server to compute a workspace change so that the client can perform a workspace-wide rename of a symbol. - -_Request_: -* method: 'textDocument/rename' -* params: `RenameParams` defined as follows - -```typescript -interface RenameParams { - /** - * The document to rename. - */ - textDocument: TextDocumentIdentifier; - - /** - * The position at which this request was sent. - */ - position: Position; - - /** - * The new name of the symbol. If the given name is not valid the - * request must return a [ResponseError](#ResponseError) with an - * appropriate message set. - */ - newName: string; -} -``` - -_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. - -_Registration Options_: `RenameRegistrationOptions` defined as follows: - -```typescript -export interface RenameRegistrationOptions extends TextDocumentRegistrationOptions { - /** - * Renames should be checked and tested for validity before being executed. - */ - prepareProvider?: boolean; -} -``` - -#### Prepare Rename Request (:leftwards_arrow_with_hook:) - -> *Since version 3.12.0* - -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' -* params: [`TextDocumentPositionParams`](#textdocumentpositionparams) - -_Response_: -* result: [`Range`](#range) \| `{ range: Range, placeholder: string }` \| `null` describing the range of the string to rename and optionally a placeholder text of the string content to be renamed. 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 an exception happens during the prepare rename request. - -#### Folding Range Request (:leftwards_arrow_with_hook:) - -> *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. - -_Request_: - -* method: 'textDocument/foldingRange' -* params: `FoldingRangeParams` defined as follows - -```typescript -export interface FoldingRangeParams { - /** - * 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. - */ -export interface FoldingRange { - - /** - * The zero-based line number from where the folded range starts. - */ - startLine: number; - - /** - * The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line. - */ - startCharacter?: number; - - /** - * The zero-based line number where the folded range ends. - */ - endLine: number; - - /** - * The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line. - */ - endCharacter?: number; - - /** - * 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; -} -``` - -* error: code and message set in case an exception happens during the 'textDocument/foldingRange' request - -_Registration Options_: `TextDocumentRegistrationOptions` - - -### Implementation considerations - -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: - -- if a client sends a request to the server and the client state changes in a way that the result will be invalid it should cancel the server request and ignore the result. If necessary it can resend the request to receive an up to date result. -- if a server detects a state change 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 appropriate. -- 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 exists unexpectedly it should try to restart the server. However clients should be careful to not restart a crashing server endlessly. VS Code for example doesn't restart a server if it crashes 5 times in the last 180 seconds. - -### Change Log - -#### 3.14.0 (12/13/2018) - -* Add support for signature label offsets. -* Add support for location links. -* Add support for `textDocument/declaration` request. - -#### 3.13.0 (9/11/2018) - -* Add support for file and folder operations (create, rename, move) to workspace edits. - -#### 3.12.0 (8/23/2018) - -* Add support for `textDocument/prepareRename` request. - -#### 3.11.0 (8/21/2018) - -* Add support for CodeActionOptions to allow a server to provide a list of code action it supports. - -#### 3.10.0 (7/23/2018) - -* Add support for hierarchical document symbols as a valid response to a `textDocument/documentSymbol` request. -* Add support for folding ranges as a valid response to a `textDocument/foldingRange` request. - -#### 3.9.0 (7/10/2018) - -* Add support for `preselect` property in `CompletionItem` - -#### 3.8.0 (6/11/2018) - -* Added support for CodeAction literals to the `textDocument/codeAction` request. -* ColorServerCapabilities.colorProvider can also be a boolean -* Corrected ColorPresentationParams.colorInfo to color (as in the `d.ts` and in implementations) - -#### 3.7.0 (4/5/2018) - -* Added support for related information to Diagnostics. - -#### 3.6.0 (2/22/2018) - -Merge the proposed protocol for workspace folders, configuration, go to type definition, go to implementation and document color provider into the main branch of the specification. For details see: - -* [Get Workspace Folders](https://microsoft.github.io/language-server-protocol/specification#workspace_workspaceFolders) -* [DidChangeWorkspaceFolders Notification](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeWorkspaceFolders) -* [Get Configuration](https://microsoft.github.io/language-server-protocol/specification#workspace_configuration) -* [Go to Type Definition](https://microsoft.github.io/language-server-protocol/specification#textDocument_typeDefinition) -* [Go to Implementation](https://microsoft.github.io/language-server-protocol/specification#textDocument_implementation) -* [Document Color](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor) -* [Color Presentation](https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation) - -In addition we enhanced the `CompletionTriggerKind` with a new value `TriggerForIncompleteCompletions: 3 = 3` to signal the a completion request got trigger since the last result was incomplete. - -#### 3.5.0 - -Decided to skip this version to bring the protocol version number in sync the with npm module vscode-languageserver-protocol. - -#### 3.4.0 (11/27/2017) - -* [extensible completion item and symbol kinds](https://github.com/Microsoft/language-server-protocol/issues/129) - -#### 3.3.0 (11/24/2017) - -* Added support for `CompletionContext` -* Added support for `MarkupContent` -* Removed old New and Updated markers. - -#### 3.2.0 (09/26/2017) - -* Added optional `commitCharacters` property to the `CompletionItem` - -#### 3.1.0 (02/28/2017) - -* Make the `WorkspaceEdit` changes backwards compatible. -* Updated the specification to correctly describe the breaking changes from 2.x to 3.x around `WorkspaceEdit`and `TextDocumentEdit`. - -#### 3.0 Version - -- add support for client feature flags to support that servers can adapt to different client capabilities. An example is the new `textDocument/willSaveWaitUntil` request which not all clients might be able to support. If the feature is disabled in the client capabilities sent on the initialize request, the server can't rely on receiving the request. -- add support to experiment with new features. The new `ClientCapabilities.experimental` section together with feature flags allow servers to provide experimental feature without the need of ALL clients to adopt them immediately. -- servers can more dynamically react to client features. Capabilities can now be registered and unregistered after the initialize request using the new `client/registerCapability` and `client/unregisterCapability`. This for example allows servers to react to settings or configuration changes without a restart. -- add support for `textDocument/willSave` notification and `textDocument/willSaveWaitUntil` request. -- add support for `textDocument/documentLink` request. -- add a `rootUri` property to the initializeParams in favor of the `rootPath` property. diff --git a/language-server-protocol/_specifications/specification-3-15.md b/language-server-protocol/_specifications/specification-3-15.md deleted file mode 100644 index 657b8ffbd..000000000 --- a/language-server-protocol/_specifications/specification-3-15.md +++ /dev/null @@ -1,5897 +0,0 @@ ---- -title: Specification -shortTitle: 3.15 (Previous) -layout: specifications -sectionid: specification-3-15 -toc: specification-3-15-toc -fullTitle: Language Server Protocol Specification - 3.15 -index: 2 ---- - -This document describes the 3.15.x version of the language server protocol. An implementation for node of the 3.15.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-15.md). - -## What's new in 3.15 - -All new 3.15 features are tagged with a corresponding since version 3.15 text or in JSDoc using `@since 3.15.0` annotation. Major new features are: - -- [general progress support](#progress), [work done progress](#workDoneProgress) and [partial result progress](#partialResults) -- support for [selection ranges](#textDocument_selectionRange) - -## Base Protocol - -The base protocol consists of a header and a content part (comparable to HTTP). The header and content part are -separated by a '\r\n'. - -### Header Part - -The header part consists of header fields. Each header field is comprised of a name and a value, separated by ': ' (a colon and a space). The structure of header fields conform to the [HTTP semantic](https://tools.ietf.org/html/rfc7230#section-3.2). Each header field is terminated by '\r\n'. Considering the last header field and the overall header itself are each terminated with '\r\n', and that at least one header is mandatory, this means that two '\r\n' sequences always immediately precede the content part of a message. - -Currently the following header fields are supported: - -| Header Field Name | Value Type | Description | -|:------------------|:------------|:------------| -| Content-Length | number | The length of the content part in bytes. This header is required. | -| Content-Type | string | The mime type of the content part. Defaults to application/vscode-jsonrpc; charset=utf-8 | -{: .table .table-bordered .table-responsive} - -The header part is encoded using the 'ascii' encoding. This includes the '\r\n' separating the header and content part. - -### Content Part - -Contains the actual content of the message. The content part of a message uses [JSON-RPC](http://www.jsonrpc.org/) to describe requests, responses and notifications. The content part is encoded using the charset provided in the Content-Type field. It defaults to `utf-8`, which is the only encoding supported right now. If a server or client receives a header with a different encoding than `utf-8` it should respond with an error. - -(Prior versions of the protocol used the string constant `utf8` which is not a correct encoding constant according to [specification](http://www.iana.org/assignments/character-sets/character-sets.xhtml).) For backwards compatibility it is highly recommended that a client and a server treats the string `utf8` as `utf-8`. - -### Example: - -``` -Content-Length: ...\r\n -\r\n -{ - "jsonrpc": "2.0", - "id": 1, - "method": "textDocument/didOpen", - "params": { - ... - } -} -``` -### Base Protocol JSON structures - -The following TypeScript definitions describe the base [JSON-RPC protocol](http://www.jsonrpc.org/specification): - -#### Abstract Message - -A general message as defined by JSON-RPC. The language server protocol always uses "2.0" as the `jsonrpc` version. - -```typescript -interface Message { - jsonrpc: string; -} -``` -#### Request Message - -A request message to describe a request between the client and the server. Every processed request must send a response back to the sender of the request. - -```typescript -interface RequestMessage extends Message { - - /** - * The request id. - */ - id: number | string; - - /** - * The method to be invoked. - */ - method: string; - - /** - * The method's params. - */ - params?: array | object; -} -``` - -#### Response Message - -A Response Message sent as a result of a request. If a request doesn't provide a result value the receiver of a request still needs to return a response message to conform to the JSON RPC specification. The result property of the ResponseMessage should be set to `null` in this case to signal a successful request. - -```typescript -interface ResponseMessage extends Message { - /** - * The request id. - */ - id: number | string | null; - - /** - * The result of a request. This member is REQUIRED on success. - * This member MUST NOT exist if there was an error invoking the method. - */ - result?: string | number | boolean | object | null; - - /** - * The error object in case a request fails. - */ - error?: ResponseError; -} - -interface ResponseError { - /** - * A number indicating the error type that occurred. - */ - code: number; - - /** - * A string providing a short description of the error. - */ - message: string; - - /** - * A primitive or structured value that contains additional - * information about the error. Can be omitted. - */ - data?: string | number | boolean | array | object | null; -} - -export namespace ErrorCodes { - // Defined by JSON RPC - export const ParseError: number = -32700; - export const InvalidRequest: number = -32600; - export const MethodNotFound: number = -32601; - export const InvalidParams: number = -32602; - export const InternalError: number = -32603; - export const serverErrorStart: number = -32099; - export const serverErrorEnd: number = -32000; - export const ServerNotInitialized: number = -32002; - export const UnknownErrorCode: number = -32001; - - // Defined by the protocol. - export const RequestCancelled: number = -32800; - export const ContentModified: number = -32801; -} -``` -#### Notification Message - -A notification message. A processed notification message must not send a response back. They work like events. - -```typescript -interface NotificationMessage extends Message { - /** - * The method to be invoked. - */ - method: string; - - /** - * The notification's params. - */ - params?: array | object; -} -``` - -#### $ Notifications and Requests - -Notification and requests whose methods start with '$/' are messages which are protocol implementation dependent and might not be implementable in all clients or servers. For example if the server implementation uses a single threaded synchronous programming language then there is little a server can do to react to a '$/cancelRequest' notification. If a server or client receives notifications starting with '$/' it is free to ignore the notification. If a server or client receives a requests starting with '$/' it must error the request with error code `MethodNotFound` (e.g. `-32601`). - -#### Cancellation Support (:arrow_right: :arrow_left:) - -The base protocol offers support for request cancellation. To cancel a request, a notification message with the following properties is sent: - -_Notification_: -* method: '$/cancelRequest' -* params: `CancelParams` defined as follows: - -```typescript -interface CancelParams { - /** - * The request id to cancel. - */ - id: number | string; -} -``` - -A request that got canceled still needs to return from the server and send a response back. It can not be left open / hanging. This is in line with the JSON RPC protocol that requires that every request sends a response back. In addition it allows for returning partial results on cancel. If the request returns an error response on cancellation it is advised to set the error code to `ErrorCodes.RequestCancelled`. - -#### Progress Support (:arrow_right: :arrow_left:) - -> *Since version 3.15.0* - -The base protocol offers also support to report progress in a generic fashion. This mechanism can be used to report any kind of progress including work done progress (usually used to report progress in the user interface using a progress bar) and partial result progress to support streaming of results. - -A progress notification has the following properties: - -_Notification_: -* method: '$/progress' -* params: `ProgressParams` defined as follows: - -```typescript -type ProgressToken = number | string; -interface ProgressParams { - /** - * The progress token provided by the client or server. - */ - token: ProgressToken; - - /** - * The progress data. - */ - value: T; -} -``` - -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 - -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. - -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 - -#### URI - -URI's are transferred as strings. The URI's format is defined in [http://tools.ietf.org/html/rfc3986](http://tools.ietf.org/html/rfc3986) - -``` - foo://example.com:8042/over/there?name=ferret#nose - \_/ \______________/\_________/ \_________/ \__/ - | | | | | -scheme authority path query fragment - | _____________________|__ - / \ / \ - urn:example:animal:ferret:nose -``` - -We also maintain a node module to parse a string into `scheme`, `authority`, `path`, `query`, and `fragment` URI components. The GitHub repository is [https://github.com/Microsoft/vscode-uri](https://github.com/Microsoft/vscode-uri) the npm module is [https://www.npmjs.com/package/vscode-uri](https://www.npmjs.com/package/vscode-uri). - -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. - -```typescript -type DocumentUri = string; -``` - -#### Text Documents - -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'. - -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']; -``` - -#### Position - -Position in a text document expressed as zero-based line and zero-based character offset. A position is between two characters like an 'insert' cursor in an editor. Special values like for example `-1` to denote the end of a line are not supported. - -```typescript -interface Position { - /** - * Line position in a document (zero-based). - */ - line: number; - - /** - * 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`. - * - * If the character value is greater than the line length it defaults back - * to the line length. - */ - character: number; -} -``` -#### Range - -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: -```typescript -{ - start: { line: 5, character: 23 }, - end : { line: 6, character: 0 } -} -``` - -```typescript -interface Range { - /** - * The range's start position. - */ - start: Position; - - /** - * The range's end position. - */ - end: Position; -} -``` - -#### Location - -Represents a location inside a resource, such as a line inside a text file. -```typescript -interface Location { - uri: DocumentUri; - range: Range; -} -``` - -#### LocationLink - -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. - * For example, if the target 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, for example, the name of a function. - * Must be contained by the `targetRange`. - * See also `DocumentSymbol#range` - */ - targetSelectionRange: Range; -} -``` - -#### Diagnostic - -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?: number | string; - - /** - * 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[]; -} -``` - -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, for example, 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; -} -``` - -#### Command - -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[]; -} -``` - -#### TextEdit - -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; -} -``` - -#### TextEdit[] - -Complex text manipulations are described with an array of `TextEdit`'s, representing a single change to the document. - -All text edits ranges refer to positions in the document they 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. - -#### TextDocumentEdit - -Describes textual changes on a single text document. The text document is referred to as a `VersionedTextDocumentIdentifier` 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: VersionedTextDocumentIdentifier; - - /** - * The edits to be applied. - */ - edits: TextEdit[]; -} -``` - -### File Resource changes - -> New in version 3.13: - -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; -} - -/** - * 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; -} - -/** - * 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; -} -``` - -#### WorkspaceEdit - -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`. - -```typescript -export interface WorkspaceEdit { - /** - * Holds changes to existing resources. - */ - changes?: { [uri: DocumentUri]: TextEdit[]; }; - - /** - * The client capability `workspace.workspaceEdit.resourceOperations` - * determines whether document changes are either an array of - * `TextDocumentEdit`s to express changes to different text documents, - * where each text document edit addresses a specific version - * of a text document, or it can contains the 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 doesn't support `documentChanges` or - * `workspace.workspaceEdit.resourceOperations`, then only plain - * `TextEdit`s using the `changes` property are supported. - */ - documentChanges?: ( - TextDocumentEdit[] | - (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[] - ); -} -``` - -##### WorkspaceEditClientCapabilities - -> 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: - -* 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; -} - -/** - * 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 transactionally. - * 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'; -} -``` - -#### TextDocumentIdentifier - -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; -} -``` - -#### TextDocumentItem - -An item to transfer a text document from the client to the server. - -```typescript -interface TextDocumentItem { - /** - * The text document's URI. - */ - uri: DocumentUri; - - /** - * The text document's language identifier. - */ - languageId: string; - - /** - * The version number of this document (it will increase after each - * change, including undo/redo). - */ - version: number; - - /** - * The content of the opened text document. - */ - text: string; -} -``` - -Text documents have a language identifier to identify a document on the server side when it handles more than one language to avoid re-interpreting the file extension. If a document refers to one of the programming languages listed below it is recommended that clients use those ids. - -Language | Identifier --------- | ---------- -ABAP | `abap` -Windows Bat | `bat` -BibTeX | `bibtex` -Clojure | `clojure` -Coffeescript | `coffeescript` -C | `c` -C++ | `cpp` -C# | `csharp` -CSS | `css` -Diff | `diff` -Dart | `dart` -Dockerfile | `dockerfile` -Elixir | `elixir` -Erlang | `erlang` -F# | `fsharp` -Git | `git-commit` and `git-rebase` -Go | `go` -Groovy | `groovy` -Handlebars | `handlebars` -HTML | `html` -Ini | `ini` -Java | `java` -JavaScript | `javascript` -JavaScript React | `javascriptreact` -JSON | `json` -LaTeX | `latex` -Less | `less` -Lua | `lua` -Makefile | `makefile` -Markdown | `markdown` -Objective-C | `objective-c` -Objective-C++ | `objective-cpp` -Perl | `perl` -Perl 6 | `perl6` -PHP | `php` -Powershell | `powershell` -Pug | `jade` -Python | `python` -R | `r` -Razor (cshtml) | `razor` -Ruby | `ruby` -Rust | `rust` -SCSS | `scss` (syntax using curly brackets), `sass` (indented syntax) -Scala | `scala` -ShaderLab | `shaderlab` -Shell Script (Bash) | `shellscript` -SQL | `sql` -Swift | `swift` -TypeScript | `typescript` -TypeScript React| `typescriptreact` -TeX | `tex` -Visual Basic | `vb` -XML | `xml` -XSL | `xsl` -YAML | `yaml` -{: .table .table-bordered .table-responsive} - -#### VersionedTextDocumentIdentifier - -An identifier to denote a specific version of a text document. - -```typescript -interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. - * If a versioned text document identifier is sent from the server to the - * client and the file is not open in the editor (the server has not - * received an open notification before), the server can send `null` to - * indicate that the version is known and the content on disk is the - * master (as specified with document content ownership). - * - * The version number of a document will increase after each change, - * including undo/redo. The number doesn't need to be consecutive. - */ - version: number | null; -} -``` - -#### TextDocumentPositionParams - -Was `TextDocumentPosition` in 1.0 with inlined parameters. - -A parameter literal used in requests to pass a text document and a position inside that document. - -```typescript -interface TextDocumentPositionParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The position inside the text document. - */ - position: Position; -} -``` - -#### DocumentFilter - -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`: -```typescript -{ language: 'typescript', scheme: 'file' } -{ language: 'json', pattern: '**/package.json' } -``` - -```typescript -export interface DocumentFilter { - /** - * A language id, like `typescript`. - */ - language?: string; - - /** - * A Uri [scheme](#Uri.scheme), like `file` or `untitled`. - */ - scheme?: string; - - /** - * A glob pattern, like `*.{ts,js}`. - * - * 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`) - */ - pattern?: string; -} -``` - -A document selector is the combination of one or more document filters. - -```typescript -export type DocumentSelector = DocumentFilter[]; -``` - -#### StaticRegistrationOptions - -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. - -```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 - -Options to dynamically register for requests for a set of text documents. - -```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; -} -``` - -#### MarkupContent - - 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 can contain fenced code blocks like in [GitHub issues](https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting) - -```typescript -/** - * Describes the content type that a client supports in various - * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. - * - * Please note that `MarkupKinds` must not start with a `$`. This kinds - * are reserved for internal usage. - */ -export namespace MarkupKind { - /** - * Plain text is supported as a content format - */ - export const PlainText: 'plaintext' = 'plaintext'; - - /** - * Markdown is supported as a content format - */ - export const Markdown: 'markdown' = 'markdown'; -} -export type MarkupKind = 'plaintext' | 'markdown'; - -/** - * A `MarkupContent` literal represents a string value, which content is - * interpreted base on its kind flag. - * Currently the protocol supports `plaintext` and `markdown` as markup kinds. - * - * If the kind is `markdown`, then the value can contain fenced code blocks - * like in GitHub issues. - * - * An example how such a string is constructed using JavaScript / TypeScript: - * ```typescript - * let markdown: MarkdownContent = { - * kind: MarkupKind.Markdown, - * value: [ - * '# Header', - * 'Some text', - * '```typescript', - * 'someCode();', - * '```' - * ].join('\n') - * }; - * ``` - * - * *Please Note* that clients might sanitize the returned Markdown. - * A client could decide to remove HTML from the Markdown to avoid - * script execution. - */ -export interface MarkupContent { - /** - * The type of the Markup - */ - kind: MarkupKind; - - /** - * The content itself - */ - value: string; -} -``` - -#### Work Done Progress - -> *Since version 3.15.0* - -Work done progress is reported using the generic [`$/progress`](#progress) notification. The value payload of a work done progress notification can be of three different forms. - -##### Work Done Progress Begin - -To start progress reporting a `$/progress` notification with the following payload must be sent: - -```typescript -export interface WorkDoneProgressBegin { - - kind: 'begin'; - - /** - * Mandatory title of the progress operation. Used to briefly inform about - * the kind of operation being performed. - * - * Examples: "Indexing" or "Linking dependencies". - */ - title: string; - - /** - * Controls if a cancel button should show to allow the user to cancel the - * long running operation. - * Clients that don't support cancellation can ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. - */ - percentage?: number; -} -``` - -##### Work Done Progress Report - -Reporting progress is done using the following payload: - -```typescript -export interface WorkDoneProgressReport { - - kind: 'report'; - - /** - * Controls enablement state of a cancel button. T - * This property is only valid if a cancel button is requested in - * the `WorkDoneProgressStart` payload. - * - * Clients that don't support cancellation or don't support controlling - * the button's enablement state are allowed to ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. - */ - percentage?: number; -} -``` - -##### Work Done Progress End - -Signaling the end of a progress reporting is done using the following payload: - -```typescript -export interface WorkDoneProgressEnd { - - kind: 'end'; - - /** - * Optional, a final message indicating to for example indicate the outcome - * of the operation. - */ - message?: string; -} -``` - -##### Initiating Work Done Progress - -Work Done progress can be initiated in two different ways: - -1. by the sender of a request (mostly clients) using the predefined `workDoneToken` property in the requests parameter literal. The document will refer to this kind of progress as client initiated progress. -1. by a server using the request `window/workDoneProgress/create`. The document will refer to this kind of progress as server initiated progress. - -###### Client Initiated Progress - -Consider a client sending a `textDocument/reference` request to a server and the client accepts work done progress reporting on that request. To signal this to the server the client would add a `workDoneToken` property to the reference request parameters. Something like this: - -```json -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae" -} -``` - -The corresponding type definition for the parameter property looks like this: - -```typescript -export interface WorkDoneProgressParams { - /** - * An optional token that a server can use to report work done progress. - */ - workDoneToken?: ProgressToken; -} -``` - -A server uses the `workDoneToken` to report progress for the specific `textDocument/reference`. For the above request the `$/progress` notification params look like this: - -```json -{ - "token": "1d546990-40a3-4b77-b134-46622995f6ae", - "value": { - "kind": "begin", - "title": "Finding references for A#foo", - "cancellable": false, - "message": "Processing file X.ts", - "percentage": 0 - } -} -``` - -There is no specific client capability signaling whether a client will send a progress token per request. The reason for this is that this is in many clients not a static aspect and might even change for every request instance for the same request type. So the capability is signal on every request instance by the presence of a `workDoneToken` property. - -To avoid that clients set up a progress monitor user interface before sending a request but the server doesn't actually report any progress a server needs to signal general work done progress reporting support in the corresponding server capability. For the above find references example a server would signal such a support by setting the `referencesProvider` property in the server capabilities as follows: - -```json -{ - "referencesProvider": { - "workDoneProgress": true - } -} -``` - -The corresponding type definition for the server capability looks like this: - -```typescript -export interface WorkDoneProgressOptions { - workDoneProgress?: boolean; -} -``` -###### Server Initiated Progress - -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. - -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: - -```typescript - /** - * Window specific client capabilities. - */ - window?: { - /** - * Whether client supports server initiated progress using the - * `window/workDoneProgress/create` request. - */ - workDoneProgress?: boolean; - } -``` - -#### Partial Result Progress - -> *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: - -```json -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae", - // The token used to report partial result progress. - "partialResultToken": "5f6f349e-4f81-4a3b-afff-ee04bff96804" -} -``` - -The `partialResultToken` is then used to report partial results for the find references request. - -If a server reports partial result via a corresponding `$/progress`, the whole result must be reported using n `$/progress` notifications. The final response has to be empty in terms of result values. This avoids confusion about how the final result should be interpreted, e.g. as another partial result or as a replacing result. - -If the response errors the provided partial results should be treated as follows: - -- 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. - -#### PartialResultParams - -A parameter literal used to pass a partial result token. - -```typescript -export interface PartialResultParams { - /** - * An optional token that a server can use to report partial results - * (for example, streaming) to the client. - */ - partialResultToken?: ProgressToken; -} -``` - -### Actual Protocol - -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. -* 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 _Registration Options_ section describing the registration option if the request or notification supports dynamic capability registration. - -#### 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. - -#### Initialize Request (:leftwards_arrow_with_hook:) - -The initialize request is sent as the first request from the client to the server. If the server receives a request or notification before the `initialize` request it should act as follows: - -* For a request the response should be an error with `code: -32002`. The message can be picked by the server. -* Notifications should be dropped, except for the exit notification. This will allow the exit of a server without an initialize request. - -Until the server has responded to the `initialize` request with an `InitializeResult`, the client must not send any additional requests or notifications to the server. In addition the server is not allowed to send any requests or notifications to the client until it has responded with an `InitializeResult`, with the exception that during the `initialize` request the server is allowed to send the notifications `window/showMessage`, `window/logMessage` and `telemetry/event` as well as the `window/showMessageRequest` request to the client. In case the client sets up a progress token in the initialize params (e.g. property `workDoneToken`) the server is also allowed to use that token (and only that token) using the `$/progress` notification sent from the server to the client. - -The `initialize` request may only be sent once. - -_Request_: -* method: 'initialize' -* params: `InitializeParams` defined as follows: - -```typescript -interface InitializeParams extends WorkDoneProgressParams { - /** - * The process ID of the parent process that started the server. - * Is null if the process has not been started by another process. - * If the parent process is not alive, then the server should exit - * (see exit notification) its process. - */ - processId: number | null; - - /** - * Information about the client - * - * @since 3.15.0 - */ - clientInfo?: { - /** - * The name of the client as defined by the client. - */ - name: string; - - /** - * The client's version as defined by the client. - */ - version?: string; - }; - - /** - * The rootPath of the workspace. Is null - * if no folder is open. - * - * @deprecated in favour of rootUri. - */ - rootPath?: string | null; - - /** - * The rootUri of the workspace. Is null if no - * folder is open. If both `rootPath` and `rootUri` are set - * `rootUri` wins. - */ - rootUri: DocumentUri | null; - - /** - * User provided initialization options. - */ - initializationOptions?: any; - - /** - * The capabilities provided by the client (editor or tool) - */ - capabilities: ClientCapabilities; - - /** - * The initial trace setting. If omitted trace is disabled ('off'). - */ - trace?: 'off' | 'messages' | 'verbose'; - - /** - * The workspace folders configured in the client when the server starts. - * This property is only available if the client supports workspace folders. - * It can be `null` if the client supports workspace folders but none are - * configured. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFolder[] | null; -} -``` -Where `ClientCapabilities` and `TextDocumentClientCapabilities` are defined as follows: - - -##### `TextDocumentClientCapabilities` define capabilities the editor / tool provides on text documents. - -```typescript -/** - * Text document specific client capabilities. - */ -export interface TextDocumentClientCapabilities { - - synchronization?: TextDocumentSyncClientCapabilities; - - /** - * Capabilities specific to the `textDocument/completion` request. - */ - completion?: CompletionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/hover` request. - */ - hover?: HoverClientCapabilities; - - /** - * Capabilities specific to the `textDocument/signatureHelp` request. - */ - signatureHelp?: SignatureHelpClientCapabilities; - - /** - * Capabilities specific to the `textDocument/declaration` request. - * - * @since 3.14.0 - */ - declaration?: DeclarationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/definition` request. - */ - definition?: DefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/typeDefinition` request. - * - * @since 3.6.0 - */ - typeDefinition?: TypeDefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/implementation` request. - * - * @since 3.6.0 - */ - implementation?: ImplementationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/references` request. - */ - references?: ReferenceClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentHighlight` request. - */ - documentHighlight?: DocumentHighlightClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentSymbol` request. - */ - documentSymbol?: DocumentSymbolClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeAction` request. - */ - codeAction?: CodeActionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeLens` request. - */ - codeLens?: CodeLensClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentLink` request. - */ - documentLink?: DocumentLinkClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentColor` and the - * `textDocument/colorPresentation` request. - * - * @since 3.6.0 - */ - colorProvider?: DocumentColorClientCapabilities; - - /** - * Capabilities specific to the `textDocument/formatting` request. - */ - formatting?: DocumentFormattingClientCapabilities - - /** - * Capabilities specific to the `textDocument/rangeFormatting` request. - */ - rangeFormatting?: DocumentRangeFormattingClientCapabilities; - - /** request. - * Capabilities specific to the `textDocument/onTypeFormatting` request. - */ - onTypeFormatting?: DocumentOnTypeFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/rename` request. - */ - rename?: RenameClientCapabilities; - - /** - * Capabilities specific to the `textDocument/publishDiagnostics` - * notification. - */ - publishDiagnostics?: PublishDiagnosticsClientCapabilities; - - /** - * Capabilities specific to the `textDocument/foldingRange` request. - * - * @since 3.10.0 - */ - foldingRange?: FoldingRangeClientCapabilities; - - /** - * Capabilities specific to the `textDocument/selectionRange` request. - * - * @since 3.15.0 - */ - selectionRange?: SelectionRangeClientCapabilities; -} -``` - -`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). - -```typescript -interface ClientCapabilities { - /** - * Workspace specific client capabilities. - */ - workspace?: { - /** - * The client supports applying batch edits - * to the workspace by supporting the request - * 'workspace/applyEdit' - */ - applyEdit?: boolean; - - /** - * Capabilities specific to `WorkspaceEdit`s - */ - workspaceEdit?: WorkspaceEditClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeConfiguration` - * notification. - */ - didChangeConfiguration?: DidChangeConfigurationClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeWatchedFiles` - * notification. - */ - didChangeWatchedFiles?: DidChangeWatchedFilesClientCapabilities; - - /** - * Capabilities specific to the `workspace/symbol` request. - */ - symbol?: WorkspaceSymbolClientCapabilities; - - /** - * Capabilities specific to the `workspace/executeCommand` request. - */ - executeCommand?: ExecuteCommandClientCapabilities; - - /** - * The client has support for workspace folders. - * - * Since 3.6.0 - */ - workspaceFolders?: boolean; - - /** - * The client supports `workspace/configuration` requests. - * - * Since 3.6.0 - */ - configuration?: boolean; - }; - - /** - * Text document specific client capabilities. - */ - textDocument?: TextDocumentClientCapabilities; - - /** - * 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. - * - * Since 3.15.0 - */ - workDoneProgress?: boolean; - } - - /** - * Experimental client capabilities. - */ - experimental?: any; -} -``` - -_Response_: -* result: `InitializeResult` defined as follows: - -```typescript -interface InitializeResult { - /** - * The capabilities the language server provides. - */ - capabilities: ServerCapabilities; - - /** - * Information about the server. - * - * @since 3.15.0 - */ - serverInfo?: { - /** - * The name of the server as defined by the server. - */ - name: string; - - /** - * The server's version as defined by the server. - */ - version?: string; - }; -} -``` -* error.code: - -```typescript -/** - * Known error codes for an `InitializeError`; - */ -export namespace InitializeError { - /** - * If the protocol version provided by the client can't be handled by - * the server. - * @deprecated This initialize error was replaced by client capabilities. - * There is no version handshake in version 3.0x - */ - export const unknownProtocolVersion: number = 1; -} -``` - -* error.data: - -```typescript -interface InitializeError { - /** - * Indicates whether the client execute the following retry logic: - * (1) show the message provided by the ResponseError to the user - * (2) user selects retry or cancel - * (3) if user selected retry the initialize method is sent again. - */ - retry: boolean; -} -``` - -The server can signal the following capabilities: - -```typescript -interface ServerCapabilities { - /** - * Defines how text documents are synced. - * Is either a detailed structure defining each notification - * or for backwards compatibility, the TextDocumentSyncKind number. - * If omitted, it defaults to `TextDocumentSyncKind.None`. - */ - textDocumentSync?: TextDocumentSyncOptions | number; - - /** - * The server provides completion support. - */ - completionProvider?: CompletionOptions; - - /** - * The server provides hover support. - */ - hoverProvider?: boolean | HoverOptions; - - /** - * The server provides signature help support. - */ - signatureHelpProvider?: SignatureHelpOptions; - - /** - * The server provides go to declaration support. - * - * @since 3.14.0 - */ - declarationProvider?: boolean | DeclarationOptions - | DeclarationRegistrationOptions; - - /** - * The server provides goto definition support. - */ - definitionProvider?: boolean | DefinitionOptions; - - /** - * The server provides goto type definition support. - * - * @since 3.6.0 - */ - typeDefinitionProvider?: boolean | TypeDefinitionOptions - | TypeDefinitionRegistrationOptions; - - /** - * The server provides goto implementation support. - * - * @since 3.6.0 - */ - implementationProvider?: boolean | ImplementationOptions - | ImplementationRegistrationOptions; - - /** - * The server provides find references support. - */ - referencesProvider?: boolean | ReferenceOptions; - - /** - * The server provides document highlight support. - */ - documentHighlightProvider?: boolean | DocumentHighlightOptions; - - /** - * The server provides document symbol support. - */ - documentSymbolProvider?: boolean | DocumentSymbolOptions; - - /** - * The server provides code actions. - * The `CodeActionOptions` return type is only valid if the client signals - * code action literal support via the property - * `textDocument.codeAction.codeActionLiteralSupport`. - */ - codeActionProvider?: boolean | CodeActionOptions; - - /** - * The server provides CodeLens. - */ - codeLensProvider?: CodeLensOptions; - - /** - * The server provides document link support. - */ - documentLinkProvider?: DocumentLinkOptions; - - /** - * The server provides color provider support. - * - * @since 3.6.0 - */ - colorProvider?: boolean | DocumentColorOptions - | DocumentColorRegistrationOptions; - - /** - * The server provides document formatting. - */ - documentFormattingProvider?: boolean | DocumentFormattingOptions; - - /** - * The server provides document range formatting. - */ - documentRangeFormattingProvider?: boolean | DocumentRangeFormattingOptions; - - /** - * The server provides document formatting on typing. - */ - documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions; - - /** - * The server provides rename support. RenameOptions may only be - * specified if the client states that it supports - * `prepareSupport` in its initial `initialize` request. - */ - renameProvider?: boolean | RenameOptions; - - /** - * The server provides folding provider support. - * - * @since 3.10.0 - */ - foldingRangeProvider?: boolean | FoldingRangeOptions - | FoldingRangeRegistrationOptions; - - /** - * The server provides execute command support. - */ - executeCommandProvider?: ExecuteCommandOptions; - - /** - * The server provides selection range support. - * - * @since 3.15.0 - */ - selectionRangeProvider?: boolean | SelectionRangeOptions - | SelectionRangeRegistrationOptions; - - /** - * The server provides workspace symbol support. - */ - workspaceSymbolProvider?: boolean | WorkspaceSymbolOptions; - - /** - * Workspace specific server capabilities - */ - workspace?: { - /** - * The server supports workspace folder. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFoldersServerCapabilities; - } - - /** - * Experimental server capabilities. - */ - experimental?: any; -} -``` - -#### Initialized Notification (:arrow_right:) - -The initialized notification is sent from the client to the server after the client received the result of the `initialize` request but before the client is sending any other request or notification to the server. The server can use the `initialized` notification for example to dynamically register capabilities. The `initialized` notification may only be sent once. - -_Notification_: -* method: 'initialized' -* params: `InitializedParams` defined as follows: - -```typescript -interface InitializedParams { -} -``` - -#### Shutdown Request (:leftwards_arrow_with_hook:) - -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. 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. - -#### Exit Notification (:arrow_right:) - -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 - -#### ShowMessage Notification (:arrow_left:) - -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: number; - - /** - * 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; -} -``` - -#### ShowMessage Request (:arrow_right_hook:) - -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. - -_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: number; - - /** - * 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; -} -``` - -#### LogMessage Notification (:arrow_left:) - -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: number; - - /** - * The actual message - */ - message: string; -} -``` - -#### Creating Work Done Progress (:arrow_right_hook:) - -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`. - -#### Canceling a Work Done Progress (:arrow_right:) - -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`. - -_Notification_: - -* method: 'window/workDoneProgress/cancel' -* params: `WorkDoneProgressCancelParams` defined as follows: - -```typescript -export interface WorkDoneProgressCancelParams { - /** - * The token to be used to report progress. - */ - token: ProgressToken; -} -``` - -#### Telemetry Notification (:arrow_left:) - -The telemetry notification is sent from the server to the client to ask the client to log a telemetry event. - -_Notification_: -* method: 'telemetry/event' -* params: 'any' - -#### Register Capability (:arrow_right_hook:) - -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). - -Server must not register the same capability both statically through the initialize result and dynamically for the same document selector. If a server wants to support both static and dynamic registration it needs to check the client capability in the initialize request and only register the capability statically if the client doesn't support dynamic registration for that capability. - -_Request_: -* method: 'client/registerCapability' -* params: `RegistrationParams` - -Where `RegistrationParams` are defined as follows: - -```typescript -/** - * General parameters to register for a capability. - */ -export interface Registration { - /** - * The id used to register the request. The id can be used to deregister - * the request again. - */ - id: string; - - /** - * The method / capability to register for. - */ - method: string; - - /** - * Options necessary for the registration. - */ - registerOptions?: any; -} - -export interface RegistrationParams { - registrations: Registration[]; -} -``` - -Since most of the registration options require to specify a document selector there is a base interface that can be used. See `TextDocumentRegistrationOptions`. - -An example JSON RPC message to register dynamically for the `textDocument/willSaveWaitUntil` feature on the client side is as follows (only details shown): - -```json -{ - "method": "client/registerCapability", - "params": { - "registrations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil", - "registerOptions": { - "documentSelector": [ - { "language": "javascript" } - ] - } - } - ] - } -} -``` - -This message is sent from the server to the client and after the client has successfully executed the request further `textDocument/willSaveWaitUntil` requests for JavaScript text documents are sent from the client to the server. - -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. - -#### Unregister Capability (:arrow_right_hook:) - -The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability. - -_Request_: -* method: 'client/unregisterCapability' -* params: `UnregistrationParams` - -Where `UnregistrationParams` are defined as follows: - -```typescript -/** - * General parameters to unregister a capability. - */ -export interface Unregistration { - /** - * The id used to unregister the request or notification. Usually an id - * provided during the register request. - */ - id: string; - - /** - * The method / capability to unregister for. - */ - method: string; -} - -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 - // of the specification. - unregisterations: Unregistration[]; -} -``` - -An example JSON RPC message to unregister the above registered `textDocument/willSaveWaitUntil` feature looks like this: - -```json -{ - "method": "client/unregisterCapability", - "params": { - "unregisterations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil" - } - ] - } -} -``` -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. - -##### Workspace folders request (:arrow_right_hook:) - -> *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 - -##### DidChangeWorkspaceFolders Notification (:arrow_right:) - -> *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: - -```typescript -export interface DidChangeWorkspaceFoldersParams { - /** - * The actual workspace folder change event. - */ - 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[]; -} -``` - -#### DidChangeConfiguration Notification (:arrow_right:) - -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: - -```typescript -export interface DidChangeConfigurationClientCapabilities { - /** - * Did change configuration notification supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Notification_: -* method: 'workspace/didChangeConfiguration', -* params: `DidChangeConfigurationParams` defined as follows: - -```typescript -interface DidChangeConfigurationParams { - /** - * The actual changed settings - */ - settings: any; -} -``` - -#### Configuration Request (:arrow_right_hook:) - -> *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 - -```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; -} -``` - -_Response_: -* result: any[] -* error: code and message set in case an exception happens during the 'workspace/configuration' request - -#### DidChangeWatchedFiles Notification (:arrow_right:) - -The watched files notification is sent from the client to the server when the client detects changes to files watched by the language client. It is recommended that servers register for these file 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 watching mechanism and not rely on clients to provide file events. However this is not recommended due to the following reasons: - -- to our experience getting file watching on disk right is challenging, especially if it needs to be supported across multiple OSes. -- file watching is not for free especially if the implementation uses some sort of polling and keeps a file 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 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 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`) - */ - globPattern: string; - - /** - * The kind of events of interest. If omitted it defaults - * to WatchKind.Create | WatchKind.Change | WatchKind.Delete - * which is 7. - */ - kind?: number; -} - -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; -} -``` - -_Notification_: -* method: 'workspace/didChangeWatchedFiles' -* params: `DidChangeWatchedFilesParams` defined as follows: - -```typescript -interface DidChangeWatchedFilesParams { - /** - * The actual file events. - */ - changes: FileEvent[]; -} -``` - -Where FileEvents are described as follows: - -```typescript -/** - * An event describing a file change. - */ -interface FileEvent { - /** - * The file's URI. - */ - uri: DocumentUri; - /** - * The change type. - */ - type: number; -} - -/** - * 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; -} -``` - -#### Workspace Symbols Request (:leftwards_arrow_with_hook:) - -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[]; - } -} -``` - -_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. - -#### Execute a command (:leftwards_arrow_with_hook:) - -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. - -#### Applies a WorkspaceEdit (:arrow_right_hook:) - -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 may be used by the server for diagnostic - * logging or to provide a suitable error for a request that - * triggered the edit. - */ - failureReason?: string; -} -``` -* error: code and message set in case an exception happens during the request. - -#### Text Document Synchronization - -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 Capability_: -* property path (optional): `textDocument.synchronization.dynamicRegistration` -* property type: `boolean` - -Controls whether text document synchronization supports dynamic registration. - -_Server Capability_: -* 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): - -```typescript -/** - * Defines how the host (editor) should sync document changes - * to the language server. - */ -export namespace TextDocumentSyncKind { - /** - * Documents should not be synced at all. - */ - export const None = 0; - - /** - * Documents are synced by always sending the full content - * of the document. - */ - export const Full = 1; - - /** - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * send. - */ - export const Incremental = 2; -} - -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. - * If omitted open close notification should not be sent. - */ - openClose?: boolean; - - /** - * Change notifications are sent to the server. - * See TextDocumentSyncKind.None, TextDocumentSyncKind.Full, - * and TextDocumentSyncKind.Incremental. - * If omitted, it defaults to TextDocumentSyncKind.None. - */ - change?: TextDocumentSyncKind; -} -``` - -#### DidOpenTextDocument Notification (:arrow_right:) - -The document open notification is sent from the client to the server to signal newly opened text documents. The document's content is now managed by the client and the server must not try to read the document's content using the document's Uri. Open in this sense means it is managed by the client. It doesn't necessarily mean that its content is presented in an editor. An open notification must not be sent more than once without a corresponding close notification send before. This means open and close notification must be balanced and the max open count for a particular textDocument is one. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -The `DidOpenTextDocumentParams` contain the language id the document is associated with. If the language Id of a document changes, the client needs to send a `textDocument/didClose` to the server followed by a `textDocument/didOpen` with the new language id if the server handles the new language id as well. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: [`TextDocumentRegistrationOptions`](#textDocumentRegistrationOptions) - -_Notification_: -* method: 'textDocument/didOpen' -* params: `DidOpenTextDocumentParams` defined as follows: - -```typescript -interface DidOpenTextDocumentParams { - /** - * The document that was opened. - */ - textDocument: TextDocumentItem; -} -``` - -#### DidChangeTextDocument Notification (:arrow_right:) - -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 and language ids. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentChangeRegistrationOptions` defined as follows: -```typescript -/** - * Describe options to be used when registering for text document change events. - */ -export interface TextDocumentChangeRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * How documents are synced to the server. See TextDocumentSyncKind.Full - * and TextDocumentSyncKind.Incremental. - */ - syncKind: TextDocumentSyncKind; -} -``` - -_Notification_: -* method: 'textDocument/didChange' -* params: `DidChangeTextDocumentParams` defined as follows: - -```typescript -interface DidChangeTextDocumentParams { - /** - * The document that did change. The version number points - * to the version after all provided content changes have - * been applied. - */ - textDocument: VersionedTextDocumentIdentifier; - - /** - * The actual content changes. - * The content changes describe single state changes to the document. - * If there are two content changes c1 (at array index 0) and - * c2 (at array index 1) for a document in state S, then c1 moves the - * document from S to S' and c2 from S' to S''. - * So c1 is computed on the state S and c2 is computed on the state S'. - * - * To mirror the content of a document using change events, - * use the following approach: - * - start with the same initial content - * - apply the 'textDocument/didChange' notifications - * in the order you receive them. - * - apply the `TextDocumentContentChangeEvent`s - * in a single notification in the order you receive them. - */ - contentChanges: TextDocumentContentChangeEvent[]; -} - -/** - * 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. - */ -export type TextDocumentContentChangeEvent = { - /** - * The range of the document that changed. - */ - range: Range; - - /** - * The optional length of the range that got replaced. - * - * @deprecated use range instead. - */ - rangeLength?: number; - - /** - * The new text for the provided range. - */ - text: string; -} | { - /** - * The new text of the whole document. - */ - text: string; -} -``` - -#### WillSaveTextDocument Notification (:arrow_right:) - -The document will save notification is sent from the client to the server before the document is actually saved. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.willSave` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSave` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSave` notifications. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: 'textDocument/willSave' -* params: `WillSaveTextDocumentParams` defined as follows: - -```typescript -/** - * The parameters send in a will save text document notification. - */ -export interface WillSaveTextDocumentParams { - /** - * The document that will be saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * The 'TextDocumentSaveReason'. - */ - reason: number; -} - -/** - * Represents reasons why a text document is saved. - */ -export namespace TextDocumentSaveReason { - - /** - * Manually triggered, for example, by the user pressing save, - * by starting debugging, or by an API call. - */ - export const Manual = 1; - - /** - * Automatic after a delay. - */ - export const AfterDelay = 2; - - /** - * When the editor lost focus. - */ - export const FocusOut = 3; -} -``` - -#### WillSaveWaitUntilTextDocument Request (:leftwards_arrow_with_hook:) - -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. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.willSaveWaitUntil` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSaveWaitUntil` requests. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSaveWaitUntil` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSaveWaitUntil` requests. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Request_: -* method: 'textDocument/willSaveWaitUntil' -* params: `WillSaveTextDocumentParams` - -_Response_: -* result:[`TextEdit[]`](#textEdit) \| `null` -* error: code and message set in case an exception happens during the `willSaveWaitUntil` request. - -#### DidSaveTextDocument Notification (:arrow_right:) - -The document save notification is sent from the client to the server when the document was saved in the client. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.didSave` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/didSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.save` -* property type: `boolean | SaveOptions` where `SaveOptions` is defined as follows: - -```typescript -export interface SaveOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -The capability indicates that the server is interested in `textDocument/didSave` notifications. - -_Registration Options_: `TextDocumentSaveRegistrationOptions` defined as follows: -```typescript -export interface TextDocumentSaveRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -_Notification_: -* method: 'textDocument/didSave' -* params: `DidSaveTextDocumentParams` defined as follows: - -```typescript -interface DidSaveTextDocumentParams { - /** - * The document that was saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * Optional the content when saved. Depends on the includeText value - * when the save notification was requested. - */ - text?: string; -} -``` - -#### DidCloseTextDocument Notification (:arrow_right:) - -The document close notification is sent from the client to the server when the document got closed in the client. The document's master now exists where the document's Uri points to (e.g. if the document's Uri is a file Uri the master now exists on disk). As with the open notification the close notification is about managing the document's content. Receiving a close notification doesn't mean that the document was open in an editor before. A close notification requires a previous open notification to be sent. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: 'textDocument/didClose' -* params: `DidCloseTextDocumentParams` defined as follows: - -```typescript -interface DidCloseTextDocumentParams { - /** - * The document that was closed. - */ - textDocument: TextDocumentIdentifier; -} -``` - -The final structure of the `TextDocumentSyncClientCapabilities` and the `TextDocumentSyncOptions` server options look like this - -```typescript -export interface TextDocumentSyncClientCapabilities { - /** - * Whether text document synchronization supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports sending will save notifications. - */ - willSave?: boolean; - - /** - * The client supports sending a will save request and - * waits for a response providing text edits which will - * be applied to the document before it is saved. - */ - willSaveWaitUntil?: boolean; - - /** - * The client supports did save notifications. - */ - didSave?: boolean; -} - -/** - * Defines how the host (editor) should sync document changes - * to the language server. - */ -export namespace TextDocumentSyncKind { - /** - * Documents should not be synced at all. - */ - export const None = 0; - - /** - * Documents are synced by always sending the full content - * of the document. - */ - export const Full = 1; - - /** - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * send. - */ - export const Incremental = 2; -} - -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. - * If omitted, open close notification should not be sent. - */ - openClose?: boolean; - /** - * Change notifications are sent to the server. - * See TextDocumentSyncKind.None, TextDocumentSyncKind.Full, - * and TextDocumentSyncKind.Incremental. - * If omitted, it defaults to TextDocumentSyncKind.None. - */ - change?: number; - /** - * If present will save notifications are sent to the server. - * If omitted, the notification should not be sent. - */ - willSave?: boolean; - /** - * If present will save wait until requests are sent to the server. - * If omitted, the request should not be sent. - */ - willSaveWaitUntil?: boolean; - /** - * If present save notifications are sent to the server. - * If omitted, the notification should not be sent. - */ - save?: boolean | SaveOptions; -} -``` - -#### PublishDiagnostics Notification (:arrow_left:) - -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. -* 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.publishDiagnostics` -* property type `PublishDiagnosticsClientCapabilities` defined as follows: - -```typescript -export interface PublishDiagnosticsClientCapabilities { - /** - * 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; -} -``` - -_Notification_: -* method: 'textDocument/publishDiagnostics' -* params: `PublishDiagnosticsParams` defined as follows: - -```typescript -interface PublishDiagnosticsParams { - /** - * The URI for which diagnostic information is reported. - */ - uri: DocumentUri; - - /** - * The version number of the document the diagnostics are published for. - * Optional. - * @since 3.15.0 - */ - version?: number; - - /** - * An array of diagnostic information items. - */ - diagnostics: Diagnostic[]; -} -``` - -#### Completion Request (:leftwards_arrow_with_hook:) - -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). 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. The request can only delay the computation of the `detail` and `documentation` properties. Other properties like `sortText`, `filterText`, `insertText`, `textEdit` and `additionalTextEdits` must be provided in the `textDocument/completion` response and must not be changed during resolve. - -_Client Capability_: -* property name (optional): `textDocument.completion` -* property type: `CompletionClientCapabilities` defined as follows: - -```typescript -export interface CompletionClientCapabilities { - /** - * Whether completion supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `CompletionItem` specific - * capabilities. - */ - completionItem?: { - /** - * Client supports snippets as insert text. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. - * Placeholders with equal identifiers are linked, so that typing in - * one will update others as well. - */ - snippetSupport?: boolean; - - /** - * Client supports commit characters on a completion item. - */ - commitCharactersSupport?: boolean - - /** - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client supports the deprecated property on a completion item. - */ - deprecatedSupport?: boolean; - - /** - * Client supports the preselect property on a completion item. - */ - preselectSupport?: boolean; - - /** - * Client supports the tag property on a completion item. - * Clients supporting tags have to handle unknown tags gracefully. - * Clients especially need to preserve unknown tags when sending - * a completion item back to the server in a resolve call. - * - * @since 3.15.0 - */ - tagSupport?: { - /** - * The tags supported by the client. - */ - valueSet: CompletionItemTag[] - } - }; - - completionItemKind?: { - /** - * The completion item 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 completion items kinds from `Text` to `Reference` as defined in - * the initial version of the protocol. - */ - valueSet?: CompletionItemKind[]; - }; - - /** - * The client supports to send additional context information for a - * `textDocument/completion` request. - */ - contextSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `completionProvider` -* property type: `CompletionOptions` defined as follows: - -```typescript -/** - * Completion options. - */ -export interface CompletionOptions extends WorkDoneProgressOptions { - /** - * Most tools trigger completion request automatically without explicitly - * requesting it using a keyboard shortcut (for example Ctrl+Space). - * Typically they do so when the user starts to type an identifier. - * For example, if the user types `c` in a JavaScript file, code complete - * will automatically display `console` along with others as a - * completion item. - * Characters that make up identifiers don't need to be listed here. - * - * If code complete should automatically be triggered on characters - * not being valid inside an identifier (for example `.` in JavaScript), - * list them in `triggerCharacters`. - */ - triggerCharacters?: string[]; - - /** - * The list of all possible characters that commit a completion. - * This field can be used if clients don't support individual commit - * characters per completion item. See `ClientCapabilities.` - * `textDocument.completion.completionItem.commitCharactersSupport`. - * - * If a server provides both `allCommitCharacters` and commit characters - * on an individual completion item, the ones on the completion item win. - * - * @since 3.2.0 - */ - allCommitCharacters?: string[]; - - /** - * The server provides support to resolve additional - * information for a completion item. - */ - resolveProvider?: boolean; -} -``` - -_Registration Options_: `CompletionRegistrationOptions` options defined as follows: -```typescript -export interface CompletionRegistrationOptions - extends TextDocumentRegistrationOptions, CompletionOptions { -} -``` - -_Request_: -* method: 'textDocument/completion' -* params: `CompletionParams` defined as follows: - -```typescript -export interface CompletionParams - extends TextDocumentPositionParams, WorkDoneProgressParams, - PartialResultParams { - /** - * The completion context. - * This is only available if the client specifies to send this using - * `ClientCapabilities.textDocument.completion.contextSupport === true` - */ - context?: CompletionContext; -} - -/** - * How a completion was triggered - */ -export namespace CompletionTriggerKind { - /** - * Completion was triggered by typing an identifier (24x7 code - * complete), manual invocation (e.g Ctrl+Space) or via API. - */ - export const Invoked: 1 = 1; - - /** - * Completion was triggered by a trigger character specified by - * the `triggerCharacters` properties of `CompletionRegistrationOptions`. - */ - export const TriggerCharacter: 2 = 2; - - /** - * Completion was re-triggered as the current completion list is incomplete. - */ - export const TriggerForIncompleteCompletions: 3 = 3; -} -export type CompletionTriggerKind = 1 | 2 | 3; - - -/** - * Contains additional information about the context in which a completion - * request is triggered. - */ -export interface CompletionContext { - /** - * How the completion was triggered. - */ - triggerKind: CompletionTriggerKind; - - /** - * The trigger character (single character) that has trigger code complete. - * Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter` - */ - triggerCharacter?: string; -} -``` - -_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 }` - -```typescript -/** - * Represents a collection of [completion items](#CompletionItem) to be - * presented in the editor. - */ -export interface CompletionList { - /** - * This list is not complete. Further typing should result in recomputing - * this list. - * - * Recomputed lists have all their items replaced (not appended) in the - * incomplete completion sessions. - */ - isIncomplete: boolean; - - /** - * The completion items. - */ - items: CompletionItem[]; -} - -/** - * Defines whether the insert text in a completion item should be interpreted as - * plain text or a snippet. - */ -export namespace InsertTextFormat { - /** - * The primary text to be inserted is treated as a plain string. - */ - export const PlainText = 1; - - /** - * The primary text to be inserted is treated as a snippet. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - */ - export const Snippet = 2; -} - -export type InsertTextFormat = 1 | 2; - -/** - * Completion item tags are extra annotations that tweak the rendering of - * a completion item. - * - * @since 3.15.0 - */ -export namespace CompletionItemTag { - /** - * Render a completion as obsolete, usually using a strike-out. - */ - export const Deprecated = 1; -} - -export type CompletionItemTag = 1; - -export interface CompletionItem { - /** - * The label of this completion item. By default - * also the text that is inserted when selecting - * this completion. - */ - label: string; - - /** - * 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`. - */ - kind?: number; - - /** - * Tags for this completion item. - * - * @since 3.15.0 - */ - tags?: CompletionItemTag[]; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - detail?: string; - - /** - * A human-readable string that represents a doc-comment. - */ - documentation?: string | MarkupContent; - - /** - * Indicates if this item is deprecated. - * - * @deprecated Use `tags` instead if supported. - */ - deprecated?: boolean; - - /** - * Select this item when showing. - * - * *Note* that only one completion item can be selected and that the - * tool / client decides which item that is. The rule is that the *first* - * item of those that match best is selected. - */ - preselect?: boolean; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the label is used. - */ - sortText?: string; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the label is used. - */ - filterText?: string; - - /** - * A string that should be inserted into a document when selecting - * this completion. When `falsy` the label is used. - * - * The `insertText` is subject to interpretation by the client side. - * Some tools might not take the string literally. - * For example, VS Code when code complete is requested in this example - * `con` and a completion item with an `insertText` of - * `console` is provided, it will only insert `sole`. - * Therefore, it is recommended to use `textEdit` instead since it avoids - * additional client side interpretation. - */ - insertText?: string; - - /** - * 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`. - */ - insertTextFormat?: InsertTextFormat; - - /** - * An edit that is applied to a document when selecting this completion. - * When an edit is provided, the value of `insertText` is ignored. - * - * *Note:* The range of the edit must be a single line range and it must - * contain the position at which completion has been requested. - */ - textEdit?: TextEdit; - - /** - * 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. - * - * Additional text edits should be used to change text unrelated to the - * current cursor position (for example adding an import statement at the - * top of the file if the completion item will insert an unqualified type). - */ - additionalTextEdits?: TextEdit[]; - - /** - * An optional set of characters that when pressed, while this completion - * is active, will accept it first and then type that character. - * *Note* that all commit characters should have `length=1` and that - * superfluous characters will be ignored. - */ - commitCharacters?: string[]; - - /** - * An optional command that is executed *after* inserting this completion. - * *Note* that additional modifications to the current document should be - * described with the additionalTextEdits-property. - */ - command?: Command; - - /** - * A data entry field that is preserved on a completion item between - * a completion and a completion resolve request. - */ - data?: any -} - -/** - * The kind of a completion entry. - */ -export namespace CompletionItemKind { - export const Text = 1; - export const Method = 2; - export const Function = 3; - export const Constructor = 4; - export const Field = 5; - export const Variable = 6; - export const Class = 7; - export const Interface = 8; - export const Module = 9; - export const Property = 10; - export const Unit = 11; - export const Value = 12; - export const Enum = 13; - export const Keyword = 14; - export const Snippet = 15; - export const Color = 16; - export const File = 17; - export const Reference = 18; - export const Folder = 19; - export const EnumMember = 20; - export const Constant = 21; - export const Struct = 22; - export const Event = 23; - export const Operator = 24; - export const TypeParameter = 25; -} -``` -* partial result: `CompletionItem[]` or `CompletionList` followed by `CompletionItem[]`. If the first provided result item is of type `CompletionList` subsequent partial results of `CompletionItem[]` add to the `items` property of the `CompletionList`. -* error: code and message set in case an exception happens during the completion request. - -Completion items support snippets (see `InsertTextFormat.Snippet`). The snippet format is as follows: - -##### Snippet Syntax - -The `body` of a snippet can use special constructs to control cursors and the text being inserted. The following are supported features and their syntaxes: - -##### Tab stops - -With tab stops, you can make the editor cursor move inside a snippet. Use `$1`, `$2` to specify cursor locations. The number is the order in which tab stops will be visited, whereas `$0` denotes the final cursor position. Multiple tab stops are linked and updated in sync. - -##### Placeholders - -Placeholders are tab stops with values, like `${1:foo}`. The placeholder text will be inserted and selected such that it can be easily changed. Placeholders can be nested, like `${1:another ${2:placeholder}}`. - -##### Choice - -Placeholders can have choices as values. The syntax is a comma separated enumeration of values, enclosed with the pipe-character, for example `${1|one,two,three|}`. When the snippet is inserted and the placeholder selected, choices will prompt the user to pick one of the values. - -##### Variables - -With `$name` or `${name:default}` you can insert the value of a variable. When a variable isn’t set, its *default* or the empty string is inserted. When a variable is unknown (that is, its name isn’t defined) the name of the variable is inserted and it is transformed into a placeholder. - -The following variables can be used: - -* `TM_SELECTED_TEXT` The currently selected text or the empty string -* `TM_CURRENT_LINE` The contents of the current line -* `TM_CURRENT_WORD` The contents of the word under cursor or the empty string -* `TM_LINE_INDEX` The zero-index based line number -* `TM_LINE_NUMBER` The one-index based line number -* `TM_FILENAME` The filename of the current document -* `TM_FILENAME_BASE` The filename of the current document without its extensions -* `TM_DIRECTORY` The directory of the current document -* `TM_FILEPATH` The full file path of the current document - -##### Variable Transforms - -Transformations allow you to modify the value of a variable before it is inserted. The definition of a transformation consists of three parts: - -1. A regular expression that is matched against the value of a variable, or the empty string when the variable cannot be resolved. -2. A "format string" that allows to reference matching groups from the regular expression. The format string allows for conditional inserts and simple modifications. -3. Options that are passed to the regular expression. - -The following example inserts the name of the current file without its ending, so from `foo.txt` it makes `foo`. - -``` -${TM_FILENAME/(.*)\..+$/$1/} - | | | | - | | | |-> no options - | | | - | | |-> references the contents of the first - | | capture group - | | - | |-> regex to capture everything before - | the final `.suffix` - | - |-> resolves to the filename -``` - -##### Grammar - -Below is the EBNF ([extended Backus-Naur form](https://en.wikipedia.org/wiki/Extended_Backus-Naur_form)) for snippets. With `\` (backslash), you can escape `$`, `}` and `\`. Within choice elements, the backslash also escapes comma and pipe characters. - -``` -any ::= tabstop | placeholder | choice | variable | text -tabstop ::= '$' int | '${' int '}' -placeholder ::= '${' int ':' any '}' -choice ::= '${' int '|' text (',' text)* '|}' -variable ::= '$' var | '${' var }' - | '${' var ':' any '}' - | '${' var '/' regex '/' (format | text)+ '/' options '}' -format ::= '$' int | '${' int '}' - | '${' int ':' '/upcase' | '/downcase' | '/capitalize' '}' - | '${' int ':+' if '}' - | '${' int ':?' if ':' else '}' - | '${' int ':-' else '}' | '${' int ':' else '}' -regex ::= JavaScript Regular Expression value (ctor-string) -options ::= JavaScript Regular Expression option (ctor-options) -var ::= [_a-zA-Z] [_a-zA-Z0-9]* -int ::= [0-9]+ -text ::= .* -``` - -#### Completion Item Resolve Request (:leftwards_arrow_with_hook:) - -The request is sent from the client to the server to resolve additional information for a given completion item. - -_Request_: -* method: 'completionItem/resolve' -* params: `CompletionItem` - -_Response_: -* result: `CompletionItem` -* error: code and message set in case an exception happens during the completion resolve request. - -#### Hover Request (:leftwards_arrow_with_hook:) - -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: - -```typescript -export interface HoverClientCapabilities { - /** - * Whether hover supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * Client supports the follow content formats for the content - * property. 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: - -```typescript -export interface HoverOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `HoverRegistrationOptions` defined as follows: -```typescript -export interface HoverRegistrationOptions - extends TextDocumentRegistrationOptions, HoverOptions { -} -``` - -_Request_: -* method: 'textDocument/hover' -* params: `HoverParams` defined as follows: - -```typescript -export interface HoverParams - extends TextDocumentPositionParams, WorkDoneProgressParams { -} -``` - -_Response_: -* result: `Hover` \| `null` defined as follows: - -```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: - -```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, meaning 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. - -#### Signature Help Request (:leftwards_arrow_with_hook:) - -The signature help request is sent from the client to the server to request signature information at a given cursor position. - -_Client Capability_: -* property name (optional): `textDocument.signatureHelp` -* property type: `SignatureHelpClientCapabilities` defined as follows: - -```typescript -export interface SignatureHelpClientCapabilities { - /** - * Whether signature help supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `SignatureInformation` - * specific properties. - */ - signatureInformation?: { - /** - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client capabilities specific to parameter information. - */ - parameterInformation?: { - /** - * The client supports processing label offsets instead of a - * simple label string. - * - * @since 3.14.0 - */ - labelOffsetSupport?: boolean; - }; - }; - - /** - * The client supports to send additional context information for a - * `textDocument/signatureHelp` request. A client that opts into - * contextSupport will also support the `retriggerCharacters` on - * `SignatureHelpOptions`. - * - * @since 3.15.0 - */ - contextSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `signatureHelpProvider` -* property type: `SignatureHelpOptions` defined as follows: - -```typescript -export interface SignatureHelpOptions extends WorkDoneProgressOptions { - /** - * The characters that trigger signature help - * automatically. - */ - triggerCharacters?: string[]; - - /** - * List of characters that re-trigger signature help. - * - * These trigger characters are only active when signature help is already - * showing. - * All trigger characters are also counted as re-trigger characters. - * - * @since 3.15.0 - */ - retriggerCharacters?: string[]; -} -``` - -_Registration Options_: `SignatureHelpRegistrationOptions` defined as follows: -```typescript -export interface SignatureHelpRegistrationOptions - extends TextDocumentRegistrationOptions, SignatureHelpOptions { -} -``` - -_Request_: -* method: 'textDocument/signatureHelp' -* params: `SignatureHelpParams` defined as follows: - -```typescript -export interface SignatureHelpParams extends TextDocumentPositionParams, - WorkDoneProgressParams { - /** - * The signature help context. - * This is only available if the client specifies to send this using the - * client capability `textDocument.signatureHelp.contextSupport === true`. - * - * @since 3.15.0 - */ - context?: SignatureHelpContext; -} - -/** - * How a signature help was triggered. - * - * @since 3.15.0 - */ -export namespace SignatureHelpTriggerKind { - /** - * Signature help was invoked manually by the user or by a command. - */ - export const Invoked: 1 = 1; - /** - * Signature help was triggered by a trigger character. - */ - export const TriggerCharacter: 2 = 2; - /** - * Signature help was triggered by the cursor moving or - * by the document content changing. - */ - export const ContentChange: 3 = 3; -} -export type SignatureHelpTriggerKind = 1 | 2 | 3; - -/** - * Additional information about the context in which a - * signature help request was triggered. - * - * @since 3.15.0 - */ -export interface SignatureHelpContext { - /** - * Action that caused signature help to be triggered. - */ - triggerKind: SignatureHelpTriggerKind; - - /** - * Character that caused signature help to be triggered. - * - * This is undefined when - * `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`. - */ - triggerCharacter?: string; - - /** - * `true` if signature help was already showing when it was triggered. - * - * Retriggers occur when the signature help is already active and can be - * caused by actions such as typing a trigger character, a cursor move, - * or document content changes. - */ - isRetrigger: boolean; - - /** - * The currently active `SignatureHelp`. - * - * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field - * updated based on the user navigating through available signatures. - */ - activeSignatureHelp?: SignatureHelp; -} -``` - -_Response_: -* result: `SignatureHelp` \| `null` defined as follows: - -```typescript -/** - * Signature help represents the signature of something - * callable. There can be multiple signature but only one - * active and only one active parameter. - */ -export interface SignatureHelp { - /** - * One or more signatures. If no signatures are available the signature help - * request should return `null`. - */ - signatures: SignatureInformation[]; - - /** - * The active signature. If omitted or the value lies outside the - * 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. - * - * In future version of the protocol this property might become - * mandatory to better express this. - */ - activeSignature?: number; - - /** - * The active parameter of the active signature. If omitted or the value - * lies outside the range of `signatures[activeSignature].parameters` - * defaults to 0 if the active signature has parameters. If - * the active signature has no parameters it is ignored. - * In future version of the protocol this property might become - * mandatory to better express the active parameter if the - * active signature does have any. - */ - activeParameter?: number; -} - -/** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ -export interface SignatureInformation { - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; - - /** - * The parameters of this signature. - */ - parameters?: ParameterInformation[]; -} - -/** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ -export interface ParameterInformation { - - /** - * The label of this parameter information. - * - * Either a string or an inclusive start and exclusive end offsets within - * its containing signature label. (see SignatureInformation.label). - * The offsets are based on a UTF-16 string representation - * as `Position` and `Range` does. - * - * *Note*: a label of type string should be a substring of its containing - * signature label. Its intended use case is to highlight the - * parameter label part in the `SignatureInformation.label`. - */ - label: string | [number, number]; - - /** - * The human-readable doc-comment of this parameter. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; -} -``` - -* error: code and message set in case an exception happens during the signature help request. - -#### Goto Declaration Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Goto Definition Request (:leftwards_arrow_with_hook:) - -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. - -#### Goto Type Definition Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Goto Implementation Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Find References Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Highlights Request (:leftwards_arrow_with_hook:) - -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?: number; -} - -/** - * 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; -} -``` - -* partial result: `DocumentHighlight[]` -* error: code and message set in case an exception happens during the document highlight request. - -#### Document Symbols Request (:leftwards_arrow_with_hook:) - -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. - -_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; -} -``` - -_Server Capability_: -* property name (optional): `documentSymbolProvider` -* property type: `boolean | DocumentSymbolOptions` where `DocumentSymbolOptions` is defined as follows: - -```typescript -export interface DocumentSymbolOptions extends WorkDoneProgressOptions { -} -``` - -_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; -} - -/** - * 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, for example, 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; - - /** - * Indicates if this symbol is deprecated. - */ - 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 client's 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, for example, 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; - - /** - * Indicates if this symbol is deprecated. - */ - 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. - -#### Code Action Request (:leftwards_arrow_with_hook:) - -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 the mode should be used. - -When the command is selected the server should be contacted again (via the `workspace/executeCommand`) request to execute the command. - -> *Since version 3.8.0:* support for CodeAction literals to enable the following scenarios: - -- the ability to directly return a workspace edit from the code action request. This avoids having another server roundtrip to execute an actual code action. However server providers should be aware that if the code action is expensive to compute or the edits are huge it might still be beneficial if the result is simply a command and the actual edit is only computed when needed. -- the ability to group code actions using a kind. Clients are allowed to ignore that information. However it allows them to better group code action for example into corresponding menus (e.g. all refactor code actions into a refactor menu). - -Clients need to announce their support for code action literals (e.g. literals of type `CodeAction`) and code action kinds via the corresponding client capability `codeAction.codeActionLiteralSupport`. - -_Client Capability_: -* property name (optional): `textDocument.codeAction` -* property type: `CodeActionClientCapabilities` defined as follows: - -```typescript -export interface CodeActionClientCapabilities { - /** - * Whether code action supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports code action literals as a valid - * response of the `textDocument/codeAction` request. - * - * @since 3.8.0 - */ - codeActionLiteralSupport?: { - /** - * The code action kind is supported with the following value - * set. - */ - codeActionKind: { - - /** - * The code action kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - */ - valueSet: CodeActionKind[]; - }; - }; - - /** - * Whether code action supports the `isPreferred` property. - * @since 3.15.0 - */ - isPreferredSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `codeActionProvider` -* property type: `boolean | CodeActionOptions` where `CodeActionOptions` is defined as follows: - -```typescript -export interface CodeActionOptions extends WorkDoneProgressOptions { - /** - * CodeActionKinds that this server may return. - * - * The list of kinds may be generic, such as `CodeActionKind.Refactor`, - * or the server may list out every specific kind they provide. - */ - codeActionKinds?: CodeActionKind[]; -} -``` - -_Registration Options_: `CodeActionRegistrationOptions` defined as follows: -```typescript -export interface CodeActionRegistrationOptions - extends TextDocumentRegistrationOptions, CodeActionOptions { -} -``` - -_Request_: -* method: 'textDocument/codeAction' -* params: `CodeActionParams` defined as follows: - -```typescript -/** - * Params for the CodeActionRequest - */ -export interface CodeActionParams - extends WorkDoneProgressParams, PartialResultParams { - /** - * The document in which the command was invoked. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range for which the command was invoked. - */ - range: Range; - - /** - * Context carrying additional information. - */ - context: CodeActionContext; -} - -/** - * The kind of a code action. - * - * Kinds are a hierarchical list of identifiers separated by `.`, - * e.g. `"refactor.extract.function"`. - * - * The set of kinds is open and the client needs to announce the kinds it - * supports to the server during initialization. - */ -export type CodeActionKind = string; - -/** - * A set of predefined code action kinds. - */ -export namespace CodeActionKind { - - /** - * Empty kind. - */ - export const Empty: CodeActionKind = ''; - - /** - * Base kind for quickfix actions: 'quickfix'. - */ - export const QuickFix: CodeActionKind = 'quickfix'; - - /** - * Base kind for refactoring actions: 'refactor'. - */ - export const Refactor: CodeActionKind = 'refactor'; - - /** - * Base kind for refactoring extraction actions: 'refactor.extract'. - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - export const RefactorExtract: CodeActionKind = 'refactor.extract'; - - /** - * Base kind for refactoring inline actions: 'refactor.inline'. - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - export const RefactorInline: CodeActionKind = 'refactor.inline'; - - /** - * Base kind for refactoring rewrite actions: 'refactor.rewrite'. - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - Move method to base class - * - ... - */ - export const RefactorRewrite: CodeActionKind = 'refactor.rewrite'; - - /** - * Base kind for source actions: `source`. - * - * Source code actions apply to the entire file. - */ - export const Source: CodeActionKind = 'source'; - - /** - * Base kind for an organize imports source action `source.organizeImports`. - */ - export const SourceOrganizeImports: CodeActionKind - = 'source.organizeImports'; -} - -/** - * Contains additional diagnostic information about the context in which - * a code action is run. - */ -export interface CodeActionContext { - /** - * An array of diagnostics known on the client side overlapping the range - * provided to the `textDocument/codeAction` request. - * They are provided so that the server knows which errors are currently - * presented to the user for the given range. There is no guarantee that - * these accurately reflect the error state of the resource. - * The primary parameter to compute code actions is the provided range. - */ - diagnostics: Diagnostic[]; - - /** - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out by the client before - * being shown, so servers can omit computing them. - */ - only?: CodeActionKind[]; -} -``` - -_Response_: -* result: `(Command | CodeAction)[]` \| `null` where `CodeAction` is defined as follows: - -```typescript -/** - * A code action represents a change that can be performed in code. - * For example, to fix a problem or to refactor code. - * - * A CodeAction must set either `edit` and/or a `command`. - * If both are supplied, the `edit` is applied first, then the `command` - * is executed. - */ -export interface CodeAction { - - /** - * A short, human-readable, title for this code action. - */ - title: string; - - /** - * The kind of the code action. - * - * Used to filter code actions. - */ - kind?: CodeActionKind; - - /** - * The diagnostics that this code action resolves. - */ - diagnostics?: Diagnostic[]; - - /** - * Marks this as a preferred action. - * Preferred actions are used by the `auto fix` command and can be - * targeted by keybindings. - * - * A quick fix should be marked preferred if it properly addresses the - * underlying error. - * A refactoring should be marked preferred if it is the most reasonable - * choice of actions to take. - * - * @since 3.15.0 - */ - isPreferred?: boolean; - - /** - * The workspace edit this code action performs. - */ - edit?: WorkspaceEdit; - - /** - * A command this code action executes. If a code action - * provides an edit and a command, first the edit is - * executed and then the command. - */ - command?: Command; -} -``` -* partial result: `(Command | CodeAction)[]` -* error: code and message set in case an exception happens during the code action request. - -#### Code Lens Request (:leftwards_arrow_with_hook:) - -The CodeLens request is sent from the client to the server to compute CodeLens for a given text document. - -_Client Capability_: -* property name (optional): `textDocument.codeLens` -* property type: `CodeLensClientCapabilities` defined as follows: - -```typescript -export interface CodeLensClientCapabilities { - /** - * Whether CodeLens 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 CodeLens for. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: -* result: `CodeLens[]` \| `null` defined as follows: - -```typescript -/** - * A CodeLense represents a command that should be shown along with - * source text, like the number of references, a way to run tests, etc. - * - * A CodeLens is _unresolved_ when no command is associated to it. - * For performance reasons, the creation of a CodeLens and resolving should - * be done in two stages. - */ -interface CodeLens { - /** - * The range in which the CodeLens is valid. Should only span a single line. - */ - range: Range; - - /** - * The command this CodeLens represents. - */ - command?: Command; - - /** - * A data entry field that is preserved on a CodeLens item between - * a CodeLens and a CodeLens resolve request. - */ - data?: any -} -``` -* partial result: `CodeLens[]` -* error: code and message set in case an exception happens during the CodeLens request. - -#### Code Lens Resolve Request (:leftwards_arrow_with_hook:) - -The CodeLens resolve request is sent from the client to the server to resolve the command for a given CodeLens item. - -_Request_: -* method: 'codeLens/resolve' -* params: `CodeLens` - -_Response_: -* result: `CodeLens` -* error: code and message set in case an exception happens during the CodeLens resolve request. - -#### Document Link Request (:leftwards_arrow_with_hook:) - -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, it 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. - -#### Document Link Resolve Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Color Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The document color request is sent from the client to the server to list all color references found in a given text document. Along with the range, a color value in RGB is returned. - -Clients can use the result to decorate color references in an editor. For example: -- Color boxes showing the actual color next to the reference -- Show a color picker when a color reference is edited - -_Client Capability_: -* property name (optional): `textDocument.colorProvider` -* property type: `DocumentColorClientCapabilities` defined as follows: - -```typescript -export interface DocumentColorClientCapabilities { - /** - * Whether document color supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `colorProvider` -* property type: `boolean | DocumentColorOptions | DocumentColorRegistrationOptions` where `DocumentColorOptions` is defined as follows: - -```typescript -export interface DocumentColorOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentColorRegistrationOptions` defined as follows: -```typescript -export interface DocumentColorRegistrationOptions - extends TextDocumentRegistrationOptions, StaticRegistrationOptions, - DocumentColorOptions { -} -``` - -_Request_: - -* method: 'textDocument/documentColor' -* params: `DocumentColorParams` defined as follows - -```typescript -interface DocumentColorParams - extends WorkDoneProgressParams, PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: -* result: `ColorInformation[]` defined as follows: - -```typescript -interface ColorInformation { - /** - * The range in the document where this color appears. - */ - range: Range; - - /** - * The actual color value for this color range. - */ - color: Color; -} - -/** - * Represents a color in RGBA space. - */ -interface Color { - - /** - * The red component of this color in the range [0-1]. - */ - readonly red: number; - - /** - * The green component of this color in the range [0-1]. - */ - readonly green: number; - - /** - * The blue component of this color in the range [0-1]. - */ - readonly blue: number; - - /** - * The alpha component of this color in the range [0-1]. - */ - readonly alpha: number; -} -``` -* partial result: `ColorInformation[]` -* error: code and message set in case an exception happens during the 'textDocument/documentColor' request - -#### Color Presentation Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The color presentation request is sent from the client to the server to obtain a list of presentations for a color value at a given location. Clients can use the result to -- modify a color reference. -- show in a color picker and let users pick one of the presentations - -This request has no special capabilities and registration options since it is send as a resolve request for the `textDocument/documentColor` request. - -_Request_: - -* method: 'textDocument/colorPresentation' -* params: `ColorPresentationParams` defined as follows - -```typescript -interface ColorPresentationParams - extends WorkDoneProgressParams, PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The color information to request presentations for. - */ - color: Color; - - /** - * The range where the color would be inserted. Serves as a context. - */ - range: Range; -} -``` - -_Response_: -* result: `ColorPresentation[]` defined as follows: - -```typescript -interface ColorPresentation { - /** - * The label of this color presentation. It will be shown on the color - * picker header. - * By default, this is also the text that is inserted when selecting - * this color presentation. - */ - label: string; - /** - * An [edit](#TextEdit) which is applied to a document when selecting - * this presentation for the color. - * When `falsy`, the [label](#ColorPresentation.label) is used. - */ - textEdit?: TextEdit; - /** - * An optional array of additional [text edits](#TextEdit) that are - * applied when selecting this color presentation. - * Edits must not overlap with the main [edit](#ColorPresentation.textEdit) - * nor with themselves. - */ - additionalTextEdits?: TextEdit[]; -} -``` - -* partial result: `ColorPresentation[]` -* error: code and message set in case an exception happens during the 'textDocument/colorPresentation' request - -#### Document Formatting Request (:leftwards_arrow_with_hook:) - -The document formatting request is sent from the client to the server to format a whole document. - -_Client Capability_: -* property name (optional): `textDocument.formatting` -* property type: `DocumentFormattingClientCapabilities` defined as follows: - -```typescript -export interface DocumentFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentFormattingProvider` -* property type: `boolean | DocumentFormattingOptions` where `DocumentFormattingOptions` is defined as follows: - -```typescript -export interface DocumentFormattingOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: -```typescript -export interface DocumentFormattingRegistrationOptions - extends TextDocumentRegistrationOptions, DocumentFormattingOptions { -} -``` - -_Request_: -* method: 'textDocument/formatting' -* params: `DocumentFormattingParams` defined as follows - -```typescript -interface DocumentFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The format options. - */ - options: FormattingOptions; -} - -/** - * Value-object describing what options formatting should use. - */ -interface FormattingOptions { - /** - * Size of a tab in spaces. - */ - tabSize: number; - - /** - * Prefer spaces over tabs. - */ - insertSpaces: boolean; - - /** - * Trim trailing whitespace on a line. - * - * @since 3.15.0 - */ - trimTrailingWhitespace?: boolean; - - /** - * Insert a newline character at the end of the file if one does not exist. - * - * @since 3.15.0 - */ - insertFinalNewline?: boolean; - - /** - * Trim all newlines after the final newline at the end of the file. - * - * @since 3.15.0 - */ - trimFinalNewlines?: boolean; - - /** - * Signature for further properties. - */ - [key: string]: boolean | number | string; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the formatting request. - -#### Document Range Formatting Request (:leftwards_arrow_with_hook:) - -The document range formatting request is sent from the client to the server to format a given range in a document. - -_Client Capability_: -* property name (optional): `textDocument.rangeFormatting` -* property type: `DocumentRangeFormattingClientCapabilities` defined as follows: - -```typescript -export interface DocumentRangeFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentRangeFormattingProvider` -* property type: `boolean | DocumentRangeFormattingOptions` where `DocumentRangeFormattingOptions` is defined as follows: - -```typescript -export interface DocumentRangeFormattingOptions - extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: -```typescript -export interface DocumentRangeFormattingRegistrationOptions - extends TextDocumentRegistrationOptions, DocumentRangeFormattingOptions { -} -``` - -_Request_: -* method: 'textDocument/rangeFormatting', -* params: `DocumentRangeFormattingParams` defined as follows: - -```typescript -interface DocumentRangeFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range to format - */ - range: Range; - - /** - * The format options - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the range formatting request. - -#### Document on Type Formatting Request (:leftwards_arrow_with_hook:) - -The document on type formatting request is sent from the client to the server to format parts of the document during typing. - -_Client Capability_: -* property name (optional): `textDocument.onTypeFormatting` -* property type: `DocumentOnTypeFormattingClientCapabilities` defined as follows: - -```typescript -export interface DocumentOnTypeFormattingClientCapabilities { - /** - * Whether on type formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentOnTypeFormattingProvider` -* property type: `DocumentOnTypeFormattingOptions` defined as follows: - -```typescript -export interface DocumentOnTypeFormattingOptions { - /** - * A character on which formatting should be triggered, like `}`. - */ - firstTriggerCharacter: string; - - /** - * More trigger characters. - */ - moreTriggerCharacter?: string[]; -} -``` - -_Registration Options_: `DocumentOnTypeFormattingRegistrationOptions` defined as follows: -```typescript -export interface DocumentOnTypeFormattingRegistrationOptions - extends TextDocumentRegistrationOptions, DocumentOnTypeFormattingOptions { -} -``` - -_Request_: -* method: 'textDocument/onTypeFormatting' -* params: `DocumentOnTypeFormattingParams` defined as follows: - -```typescript -interface DocumentOnTypeFormattingParams extends TextDocumentPositionParams { - /** - * The character that has been typed. - */ - ch: string; - - /** - * The format options. - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document. -* error: code and message set in case an exception happens during the range formatting request. - -#### Rename Request (:leftwards_arrow_with_hook:) - -The rename request is sent from the client to the server to ask the server to compute a workspace change so that the client can perform a workspace-wide rename of a symbol. - -_Client Capability_: -* property name (optional): `textDocument.rename` -* property type: `RenameClientCapabilities` defined as follows: - -```typescript -export interface RenameClientCapabilities { - /** - * Whether rename supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * Client supports testing for validity of rename operations - * before execution. - * - * @since version 3.12.0 - */ - prepareSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `renameProvider` -* property type: `boolean | RenameOptions` where `RenameOptions` is defined as follows: - -`RenameOptions` may only be specified if the client states that it supports `prepareSupport` in its initial `initialize` request. - -```typescript -export interface RenameOptions extends WorkDoneProgressOptions { - /** - * Renames should be checked and tested before being executed. - */ - prepareProvider?: boolean; -} -``` - -_Registration Options_: `RenameRegistrationOptions` defined as follows: -```typescript -export interface RenameRegistrationOptions - extends TextDocumentRegistrationOptions, RenameOptions { -} -``` - -_Request_: -* method: 'textDocument/rename' -* params: `RenameParams` defined as follows - -```typescript -interface RenameParams - extends TextDocumentPositionParams, WorkDoneProgressParams { - /** - * The new name of the symbol. If the given name is not valid the - * request must return a [ResponseError](#ResponseError) with an - * appropriate message set. - */ - newName: string; -} -``` - -_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. - -#### Prepare Rename Request (:leftwards_arrow_with_hook:) - -> *Since version 3.12.0* - -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' -* params: `PrepareRenameParams` defined as follows: -```typescript -export interface PrepareRenameParams extends TextDocumentPositionParams { -} -``` - -_Response_: -* result: [`Range`](#range) \| `{ range: Range, placeholder: string }` \| `null` describing the range of the string to rename and optionally a placeholder text of the string content to be renamed. 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. - -#### Folding Range Request (:leftwards_arrow_with_hook:) - -> *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 the 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?: number; - /** - * If set, the client signals that it only supports folding complete lines. - * If set, the 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. - */ -export interface FoldingRange { - - /** - * The zero-based line number from where the folded range starts. - */ - startLine: number; - - /** - * The zero-based character offset from where the folded range starts. - * If not defined, defaults to the length of the start line. - */ - startCharacter?: number; - - /** - * The zero-based line number where the folded range ends. - */ - endLine: number; - - /** - * The zero-based character offset before the folded range ends. - * If not defined, defaults to the length of the end line. - */ - endCharacter?: number; - - /** - * 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 - -#### Selection Range Request (:leftwards_arrow_with_hook:) - -> *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. - -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 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 - -### Implementation considerations - -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: - -- if a client sends a request to the server and the client state changes in a way that the result will be invalid it should cancel the server request and ignore the result. If necessary it can resend the request to receive an up to date result. -- if a server detects a state change 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 appropriate. -- 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. - -### Change Log - -#### 3.15.0 (01/14/2020) - -* Add generic progress reporting support. -* Add specific work done progress reporting support to requests where applicable. -* Add specific partial result progress support to requests where applicable. -* Add support for `textDocument/selectionRange`. -* Add support for server and client information. -* Add signature help context. -* Add Erlang and Elixir to the list of supported programming languages -* Add `version` on `PublishDiagnosticsParams` -* Add `CodeAction#isPreferred` support. -* Add `CompletionItem#tag` support. -* Add `Diagnostic#tag` support. -* Add `DocumentLink#tooltip` support. -* Add `trimTrailingWhitespace`, `insertFinalNewline` and `trimFinalNewlines` to `FormattingOptions`. -* Clarified `WorkspaceSymbolParams#query` parameter. - - -#### 3.14.0 (12/13/2018) - -* Add support for signature label offsets. -* Add support for location links. -* Add support for `textDocument/declaration` request. - -#### 3.13.0 (9/11/2018) - -* Add support for file and folder operations (create, rename, move) to workspace edits. - -#### 3.12.0 (8/23/2018) - -* Add support for `textDocument/prepareRename` request. - -#### 3.11.0 (8/21/2018) - -* Add support for CodeActionOptions to allow a server to provide a list of code action it supports. - -#### 3.10.0 (7/23/2018) - -* Add support for hierarchical document symbols as a valid response to a `textDocument/documentSymbol` request. -* Add support for folding ranges as a valid response to a `textDocument/foldingRange` request. - -#### 3.9.0 (7/10/2018) - -* Add support for `preselect` property in `CompletionItem` - -#### 3.8.0 (6/11/2018) - -* Added support for CodeAction literals to the `textDocument/codeAction` request. -* ColorServerCapabilities.colorProvider can also be a boolean -* Corrected ColorPresentationParams.colorInfo to color (as in the `d.ts` and in implementations) - -#### 3.7.0 (4/5/2018) - -* Added support for related information to Diagnostics. - -#### 3.6.0 (2/22/2018) - -Merge the proposed protocol for workspace folders, configuration, go to type definition, go to implementation and document color provider into the main branch of the specification. For details see: - -* [Get Workspace Folders](https://microsoft.github.io/language-server-protocol/specification#workspace_workspaceFolders) -* [DidChangeWorkspaceFolders Notification](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeWorkspaceFolders) -* [Get Configuration](https://microsoft.github.io/language-server-protocol/specification#workspace_configuration) -* [Go to Type Definition](https://microsoft.github.io/language-server-protocol/specification#textDocument_typeDefinition) -* [Go to Implementation](https://microsoft.github.io/language-server-protocol/specification#textDocument_implementation) -* [Document Color](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor) -* [Color Presentation](https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation) - -In addition we enhanced the `CompletionTriggerKind` with a new value `TriggerForIncompleteCompletions: 3 = 3` to signal the a completion request got trigger since the last result was incomplete. - -#### 3.5.0 - -Decided to skip this version to bring the protocol version number in sync the with npm module vscode-languageserver-protocol. - -#### 3.4.0 (11/27/2017) - -* [extensible completion item and symbol kinds](https://github.com/Microsoft/language-server-protocol/issues/129) - -#### 3.3.0 (11/24/2017) - -* Added support for `CompletionContext` -* Added support for `MarkupContent` -* Removed old New and Updated markers. - -#### 3.2.0 (09/26/2017) - -* Added optional `commitCharacters` property to the `CompletionItem` - -#### 3.1.0 (02/28/2017) - -* Make the `WorkspaceEdit` changes backwards compatible. -* Updated the specification to correctly describe the breaking changes from 2.x to 3.x around `WorkspaceEdit`and `TextDocumentEdit`. - -#### 3.0 Version - -- add support for client feature flags to support that servers can adapt to different client capabilities. An example is the new `textDocument/willSaveWaitUntil` request which not all clients might be able to support. If the feature is disabled in the client capabilities sent on the initialize request, the server can't rely on receiving the request. -- add support to experiment with new features. The new `ClientCapabilities.experimental` section together with feature flags allow servers to provide experimental feature without the need of ALL clients to adopt them immediately. -- servers can more dynamically react to client features. Capabilities can now be registered and unregistered after the initialize request using the new `client/registerCapability` and `client/unregisterCapability`. This for example allows servers to react to settings or configuration changes without a restart. -- add support for `textDocument/willSave` notification and `textDocument/willSaveWaitUntil` request. -- add support for `textDocument/documentLink` request. -- add a `rootUri` property to the initializeParams in favor of the `rootPath` property. diff --git a/language-server-protocol/_specifications/specification-3-16.md b/language-server-protocol/_specifications/specification-3-16.md deleted file mode 100644 index 133503c4a..000000000 --- a/language-server-protocol/_specifications/specification-3-16.md +++ /dev/null @@ -1,8277 +0,0 @@ ---- -title: Specification -shortTitle: 3.16 (Current) -layout: specifications -sectionid: specification-3-16 -toc: specification-3-16-toc -fullTitle: Language Server Protocol Specification - 3.16 -index: 2 ---- - -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). - -**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). - -## What's new in 3.16 - -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: - -- 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) - -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. - -## Base Protocol - -The base protocol consists of a header and a content part (comparable to HTTP). The header and content part are -separated by a '\r\n'. - -### Header Part - -The header part consists of header fields. Each header field is comprised of a name and a value, separated by ': ' (a colon and a space). The structure of header fields conform to the [HTTP semantic](https://tools.ietf.org/html/rfc7230#section-3.2). Each header field is terminated by '\r\n'. Considering the last header field and the overall header itself are each terminated with '\r\n', and that at least one header is mandatory, this means that two '\r\n' sequences always immediately precede the content part of a message. - -Currently the following header fields are supported: - -| Header Field Name | Value Type | Description | -|:------------------|:------------|:------------| -| Content-Length | number | The length of the content part in bytes. This header is required. | -| Content-Type | string | The mime type of the content part. Defaults to application/vscode-jsonrpc; charset=utf-8 | -{: .table .table-bordered .table-responsive} - -The header part is encoded using the 'ascii' encoding. This includes the '\r\n' separating the header and content part. - -### Content Part - -Contains the actual content of the message. The content part of a message uses [JSON-RPC](http://www.jsonrpc.org/) to describe requests, responses and notifications. The content part is encoded using the charset provided in the Content-Type field. It defaults to `utf-8`, which is the only encoding supported right now. If a server or client receives a header with a different encoding than `utf-8` it should respond with an error. - -(Prior versions of the protocol used the string constant `utf8` which is not a correct encoding constant according to [specification](http://www.iana.org/assignments/character-sets/character-sets.xhtml).) For backwards compatibility it is highly recommended that a client and a server treats the string `utf8` as `utf-8`. - -### Example: - -``` -Content-Length: ...\r\n -\r\n -{ - "jsonrpc": "2.0", - "id": 1, - "method": "textDocument/didOpen", - "params": { - ... - } -} -``` -### Base Protocol JSON structures - -The following TypeScript definitions describe the base [JSON-RPC protocol](http://www.jsonrpc.org/specification): - -#### Numbers - -The protocol use the following definitions for integers, unsigned integers and decimal numbers: - -```typescript -/** - * Defines an integer number in the range of -2^31 to 2^31 - 1. - */ -export type integer = number; -``` - -```typescript -/** - * Defines an unsigned integer number in the range of 0 to 2^31 - 1. - */ -export type uinteger = number; -``` - -```typescript -/** - * Defines a decimal number. Since decimal numbers are very - * rare in the language server specification we denote the - * exact range with every decimal using the mathematics - * interval notation (e.g. [0, 1] denotes all decimals d with - * 0 <= d <= 1. - */ -export type decimal = number; -``` - -#### Abstract Message - -A general message as defined by JSON-RPC. The language server protocol always uses "2.0" as the `jsonrpc` version. - -```typescript -interface Message { - jsonrpc: string; -} -``` -#### Request Message - -A request message to describe a request between the client and the server. Every processed request must send a response back to the sender of the request. - -```typescript -interface RequestMessage extends Message { - - /** - * The request id. - */ - id: integer | string; - - /** - * The method to be invoked. - */ - method: string; - - /** - * The method's params. - */ - params?: array | object; -} -``` - -#### Response Message - -A Response Message sent as a result of a request. If a request doesn't provide a result value the receiver of a request still needs to return a response message to conform to the JSON RPC specification. The result property of the ResponseMessage should be set to `null` in this case to signal a successful request. - -```typescript -interface ResponseMessage extends Message { - /** - * The request id. - */ - id: integer | string | null; - - /** - * The result of a request. This member is REQUIRED on success. - * This member MUST NOT exist if there was an error invoking the method. - */ - result?: string | number | boolean | object | null; - - /** - * The error object in case a request fails. - */ - error?: ResponseError; -} - -interface ResponseError { - /** - * A number indicating the error type that occurred. - */ - code: integer; - - /** - * A string providing a short description of the error. - */ - message: string; - - /** - * A primitive or structured value that contains additional - * information about the error. Can be omitted. - */ - data?: string | number | boolean | array | object | null; -} - -export namespace ErrorCodes { - // Defined by JSON RPC - export const ParseError: integer = -32700; - export const InvalidRequest: integer = -32600; - export const MethodNotFound: integer = -32601; - export const InvalidParams: integer = -32602; - export const InternalError: integer = -32603; - - /** - * This is the start range of JSON RPC reserved error codes. - * It doesn't denote a real error code. No LSP error codes should - * be defined between the start and end range. For backwards - * compatibility the `ServerNotInitialized` and the `UnknownErrorCode` - * are left in the range. - * - * @since 3.16.0 - */ - export const jsonrpcReservedErrorRangeStart: integer = -32099; - /** @deprecated use jsonrpcReservedErrorRangeStart */ - export const serverErrorStart: integer = jsonrpcReservedErrorRangeStart; - - /** - * Error code indicating that a server received a notification or - * request before the server has received the `initialize` request. - */ - export const ServerNotInitialized: integer = -32002; - export const UnknownErrorCode: integer = -32001; - - /** - * This is the end range of JSON RPC reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - export const jsonrpcReservedErrorRangeEnd = -32000; - /** @deprecated use jsonrpcReservedErrorRangeEnd */ - export const serverErrorEnd: integer = jsonrpcReservedErrorRangeEnd; - - /** - * This is the start range of LSP reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - export const lspReservedErrorRangeStart: integer = -32899; - - export const ContentModified: integer = -32801; - export const RequestCancelled: integer = -32800; - - /** - * This is the end range of LSP reserved error codes. - * It doesn't denote a real error code. - * - * @since 3.16.0 - */ - export const lspReservedErrorRangeEnd: integer = -32800; -} -``` -#### Notification Message - -A notification message. A processed notification message must not send a response back. They work like events. - -```typescript -interface NotificationMessage extends Message { - /** - * The method to be invoked. - */ - method: string; - - /** - * The notification's params. - */ - params?: array | object; -} -``` - -#### $ Notifications and Requests - -Notification and requests whose methods start with '\$/' are messages which are protocol implementation dependent and might not be implementable in all clients or servers. For example if the server implementation uses a single threaded synchronous programming language then there is little a server can do to react to a `$/cancelRequest` notification. If a server or client receives notifications starting with '\$/' it is free to ignore the notification. If a server or client receives a request starting with '\$/' it must error the request with error code `MethodNotFound` (e.g. `-32601`). - -#### Cancellation Support (:arrow_right: :arrow_left:) - -The base protocol offers support for request cancellation. To cancel a request, a notification message with the following properties is sent: - -_Notification_: -* method: '$/cancelRequest' -* params: `CancelParams` defined as follows: - -```typescript -interface CancelParams { - /** - * The request id to cancel. - */ - id: integer | string; -} -``` - -A request that got canceled still needs to return from the server and send a response back. It can not be left open / hanging. This is in line with the JSON RPC protocol that requires that every request sends a response back. In addition it allows for returning partial results on cancel. If the request returns an error response on cancellation it is advised to set the error code to `ErrorCodes.RequestCancelled`. - -#### Progress Support (:arrow_right: :arrow_left:) - -> *Since version 3.15.0* - -The base protocol offers also support to report progress in a generic fashion. This mechanism can be used to report any kind of progress including work done progress (usually used to report progress in the user interface using a progress bar) and partial result progress to support streaming of results. - -A progress notification has the following properties: - -_Notification_: -* method: '$/progress' -* params: `ProgressParams` defined as follows: - -```typescript -type ProgressToken = integer | string; - -interface ProgressParams { - /** - * The progress token provided by the client or server. - */ - token: ProgressToken; - - /** - * The progress data. - */ - value: T; -} -``` - -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 - -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. - -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 - -#### URI - -URI's are transferred as strings. The URI's format is defined in [https://tools.ietf.org/html/rfc3986](https://tools.ietf.org/html/rfc3986) - -``` - foo://example.com:8042/over/there?name=ferret#nose - \_/ \______________/\_________/ \_________/ \__/ - | | | | | -scheme authority path query fragment - | _____________________|__ - / \ / \ - urn:example:animal:ferret:nose -``` - -We also maintain a node module to parse a string into `scheme`, `authority`, `path`, `query`, and `fragment` URI components. The GitHub repository is [https://github.com/Microsoft/vscode-uri](https://github.com/Microsoft/vscode-uri) the npm module is [https://www.npmjs.com/package/vscode-uri](https://www.npmjs.com/package/vscode-uri). - -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. - -```typescript -type DocumentUri = string; -``` - -There is also a tagging interface for normal non document URIs. It maps to a `string` as well. - -```typescript -type URI = string; -``` - -#### Regular Expressions - -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: - -* the client will announce which regular expression engine it will use. This will allow server that are written for a very specific client make full use of the regular expression capabilities of the client -* the specification will define a set of regular expression features that should be supported by a client. Instead of writing a new specification LSP will refer to the [ECMAScript Regular Expression specification](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) and remove features from it that are not necessary in the context of LSP or hard to implement for other clients. - -_Client Capability_: - -The following client capability is used to announce a client's regular expression engine - -* property path (optional): `general.regularExpressions` -* property type: `RegularExpressionsClientCapabilities` defined as follows: - -```typescript -/** - * Client capabilities specific to regular expressions. - */ -export interface RegularExpressionsClientCapabilities { - /** - * The engine's name. - */ - engine: string; - - /** - * The engine's version. - */ - version?: string; -} -``` - -The following table lists the well known engine values. Please note that the table should be driven by the community which integrates LSP into existing clients. It is not the goal of the spec to list all available regular expression engines. - -Engine | Version | Documentation -------- | ------- | ------------- -ECMAScript | `ES2020` | [ECMAScript 2020](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) & [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions) - -_Regular Expression Subset_: - -The following features from the [ECMAScript 2020](https://tc39.es/ecma262/#sec-regexp-regular-expression-objects) regular expression specification are NOT mandatory for a client: - -- *Assertions*: Lookahead assertion, Negative lookahead assertion, lookbehind assertion, negative lookbehind assertion. -- *Character classes*: matching control characters using caret notation (e.g. `\cX`) and matching UTF-16 code units (e.g. `\uhhhh`). -- *Group and ranges*: named capturing groups. -- *Unicode property escapes*: none of the features needs to be supported. - -The only regular expression flag that a client needs to support is 'i' to specify a case insensitive search. - -### Enumerations - -The protocol supports two kind of enumerations: (a) integer based enumerations and (b) strings based enumerations. Integer based enumerations usually start with `1`. The ones 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. - -#### Text Documents - -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'. - -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']; -``` - -#### Position - -Position in a text document expressed as zero-based line and zero-based character offset. A position is between two characters like an 'insert' cursor in an editor. Special values like for example `-1` to denote the end of a line are not supported. - -```typescript -interface Position { - /** - * Line position in a document (zero-based). - */ - 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`. - * - * If the character value is greater than the line length it defaults back - * to the line length. - */ - character: uinteger; -} -``` -#### Range - -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: -```typescript -{ - start: { line: 5, character: 23 }, - end : { line: 6, character: 0 } -} -``` - -```typescript -interface Range { - /** - * The range's start position. - */ - start: Position; - - /** - * The range's end position. - */ - end: Position; -} -``` - -#### Location - -Represents a location inside a resource, such as a line inside a text file. -```typescript -interface Location { - uri: DocumentUri; - range: Range; -} -``` - -#### LocationLink - -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 - * `targetRange`. See also `DocumentSymbol#range` - */ - targetSelectionRange: Range; -} -``` - -#### Diagnostic - -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; -} -``` - -#### Command - -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[]; -} -``` - -#### TextEdit & AnnotatedTextEdit - -> 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; -} -``` - -#### TextEdit[] - -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 they 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. - -#### TextDocumentEdit - -> 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)[]; -} -``` - -### File Resource changes - -> 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; -} -``` - -#### WorkspaceEdit - -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; - }; -} -``` - -##### WorkspaceEditClientCapabilities - -> 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'; -} -``` - -#### TextDocumentIdentifier - -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; -} -``` - -#### TextDocumentItem - -An item to transfer a text document from the client to the server. - -```typescript -interface TextDocumentItem { - /** - * The text document's URI. - */ - uri: DocumentUri; - - /** - * The text document's language identifier. - */ - languageId: string; - - /** - * The version number of this document (it will increase after each - * change, including undo/redo). - */ - version: integer; - - /** - * The content of the opened text document. - */ - text: string; -} -``` - -Text documents have a language identifier to identify a document on the server side when it handles more than one language to avoid re-interpreting the file extension. If a document refers to one of the programming languages listed below it is recommended that clients use those ids. - -Language | Identifier --------- | ---------- -ABAP | `abap` -Windows Bat | `bat` -BibTeX | `bibtex` -Clojure | `clojure` -Coffeescript | `coffeescript` -C | `c` -C++ | `cpp` -C# | `csharp` -CSS | `css` -Diff | `diff` -Dart | `dart` -Dockerfile | `dockerfile` -Elixir | `elixir` -Erlang | `erlang` -F# | `fsharp` -Git | `git-commit` and `git-rebase` -Go | `go` -Groovy | `groovy` -Handlebars | `handlebars` -HTML | `html` -Ini | `ini` -Java | `java` -JavaScript | `javascript` -JavaScript React | `javascriptreact` -JSON | `json` -LaTeX | `latex` -Less | `less` -Lua | `lua` -Makefile | `makefile` -Markdown | `markdown` -Objective-C | `objective-c` -Objective-C++ | `objective-cpp` -Perl | `perl` -Perl 6 | `perl6` -PHP | `php` -Powershell | `powershell` -Pug | `jade` -Python | `python` -R | `r` -Razor (cshtml) | `razor` -Ruby | `ruby` -Rust | `rust` -SCSS | `scss` (syntax using curly brackets), `sass` (indented syntax) -Scala | `scala` -ShaderLab | `shaderlab` -Shell Script (Bash) | `shellscript` -SQL | `sql` -Swift | `swift` -TypeScript | `typescript` -TypeScript React| `typescriptreact` -TeX | `tex` -Visual Basic | `vb` -XML | `xml` -XSL | `xsl` -YAML | `yaml` -{: .table .table-bordered .table-responsive} - -#### VersionedTextDocumentIdentifier - -An identifier to denote a specific version of a text document. This information usually flows from the client to the server. - -```typescript -interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. - * - * The version number of a document will increase after each change, - * including undo/redo. The number doesn't need to be consecutive. - */ - version: integer; -} -``` - -An identifier which optionally denotes a specific version of a text document. This information usually flows from the server to the client. - -```typescript -interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier { - /** - * The version number of this document. If an optional versioned text document - * identifier is sent from the server to the client and the file is not - * open in the editor (the server has not received an open notification - * before) the server can send `null` to indicate that the version is - * known and the content on disk is the master (as specified with document - * content ownership). - * - * The version number of a document will increase after each change, - * including undo/redo. The number doesn't need to be consecutive. - */ - version: integer | null; -} -``` - -#### TextDocumentPositionParams - -Was `TextDocumentPosition` in 1.0 with inlined parameters. - -A parameter literal used in requests to pass a text document and a position inside that document. It is up to the client to decide how a selection is converted into a position when issuing a request for a text document. The client can for example honor or ignore the selection direction to make LSP request consistent with features implemented internally. - -```typescript -interface TextDocumentPositionParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The position inside the text document. - */ - position: Position; -} -``` - -#### DocumentFilter - -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`: -```typescript -{ language: 'typescript', scheme: 'file' } -{ language: 'json', pattern: '**/package.json' } -``` - -```typescript -export interface DocumentFilter { - /** - * A language id, like `typescript`. - */ - language?: string; - - /** - * A Uri [scheme](#Uri.scheme), like `file` or `untitled`. - */ - scheme?: string; - - /** - * A glob pattern, like `*.{ts,js}`. - * - * 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`) - */ - pattern?: string; -} -``` - -A document selector is the combination of one or more document filters. - -```typescript -export type DocumentSelector = DocumentFilter[]; -``` - -#### StaticRegistrationOptions - -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. - -```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 - -Options to dynamically register for requests for a set of text documents. - -```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; -} -``` - -#### MarkupContent - - 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/). - -```typescript -/** - * Describes the content type that a client supports in various - * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. - * - * Please note that `MarkupKinds` must not start with a `$`. This kinds - * are reserved for internal usage. - */ -export namespace MarkupKind { - /** - * Plain text is supported as a content format - */ - export const PlainText: 'plaintext' = 'plaintext'; - - /** - * Markdown is supported as a content format - */ - export const Markdown: 'markdown' = 'markdown'; -} -export type MarkupKind = 'plaintext' | 'markdown'; - -/** - * A `MarkupContent` literal represents a string value which content is - * interpreted base on its kind flag. Currently the protocol supports - * `plaintext` and `markdown` as markup kinds. - * - * If the kind is `markdown` then the value can contain fenced code blocks like - * in GitHub issues. - * - * Here is an example how such a string can be constructed using - * JavaScript / TypeScript: - * ```typescript - * let markdown: MarkdownContent = { - * kind: MarkupKind.Markdown, - * value: [ - * '# Header', - * 'Some text', - * '```typescript', - * 'someCode();', - * '```' - * ].join('\n') - * }; - * ``` - * - * *Please Note* that clients might sanitize the return markdown. A client could - * decide to remove HTML from the markdown to avoid script execution. - */ -export interface MarkupContent { - /** - * The type of the Markup - */ - kind: MarkupKind; - - /** - * The content itself - */ - value: string; -} -``` - -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 -/** - * Client capabilities specific to the used markdown parser. - * - * @since 3.16.0 - */ -export interface MarkdownClientCapabilities { - /** - * The name of the parser. - */ - parser: string; - - /** - * The version of the parser. - */ - version?: string; -} -``` - -Known markdown parsers used by clients right now are: - -Parser | Version | Documentation ------- | ------- | ------------- -marked | 1.1.0 | [Marked Documentation](https://marked.js.org/) - - -#### Work Done Progress - -> *Since version 3.15.0* - -Work done progress is reported using the generic [`$/progress`](#progress) notification. The value payload of a work done progress notification can be of three different forms. - -##### Work Done Progress Begin - -To start progress reporting a `$/progress` notification with the following payload must be sent: - -```typescript -export interface WorkDoneProgressBegin { - - kind: 'begin'; - - /** - * Mandatory title of the progress operation. Used to briefly inform about - * the kind of operation being performed. - * - * Examples: "Indexing" or "Linking dependencies". - */ - title: string; - - /** - * Controls if a cancel button should show to allow the user to cancel the - * long running operation. Clients that don't support cancellation are - * allowed to ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. The value range is [0, 100] - */ - percentage?: uinteger; -} -``` - -##### Work Done Progress Report - -Reporting progress is done using the following payload: - -```typescript -export interface WorkDoneProgressReport { - - kind: 'report'; - - /** - * Controls enablement state of a cancel button. This property is only valid - * if a cancel button got requested in the `WorkDoneProgressBegin` payload. - * - * Clients that don't support cancellation or don't support control the - * button's enablement state are allowed to ignore the setting. - */ - cancellable?: boolean; - - /** - * Optional, more detailed associated progress message. Contains - * complementary information to the `title`. - * - * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". - * If unset, the previous progress message (if any) is still valid. - */ - message?: string; - - /** - * Optional progress percentage to display (value 100 is considered 100%). - * If not provided infinite progress is assumed and clients are allowed - * to ignore the `percentage` value in subsequent in report notifications. - * - * The value should be steadily rising. Clients are free to ignore values - * that are not following this rule. The value range is [0, 100] - */ - percentage?: uinteger; -} -``` - -##### Work Done Progress End - -Signaling the end of a progress reporting is done using the following payload: - -```typescript -export interface WorkDoneProgressEnd { - - kind: 'end'; - - /** - * Optional, a final message indicating to for example indicate the outcome - * of the operation. - */ - message?: string; -} -``` - -##### Initiating Work Done Progress - -Work Done progress can be initiated in two different ways: - -1. by the sender of a request (mostly clients) using the predefined `workDoneToken` property in the requests parameter literal. The document will refer to this kind of progress as client initiated progress. -1. by a server using the request `window/workDoneProgress/create`. The document will refer to this kind of progress as server initiated progress. - -###### Client Initiated Progress - -Consider a client sending a `textDocument/reference` request to a server and the client accepts work done progress reporting on that request. To signal this to the server the client would add a `workDoneToken` property to the reference request parameters. Something like this: - -```json -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae" -} -``` - -The corresponding type definition for the parameter property looks like this: - -```typescript -export interface WorkDoneProgressParams { - /** - * An optional token that a server can use to report work done progress. - */ - workDoneToken?: ProgressToken; -} -``` - -A server uses the `workDoneToken` to report progress for the specific `textDocument/reference`. For the above request the `$/progress` notification params look like this: - -```json -{ - "token": "1d546990-40a3-4b77-b134-46622995f6ae", - "value": { - "kind": "begin", - "title": "Finding references for A#foo", - "cancellable": false, - "message": "Processing file X.ts", - "percentage": 0 - } -} -``` - -The token received via the `workDoneToken` property in a request's param literal is only valid as long as the request has not send a response back. - -There is no specific client capability signaling whether a client will send a progress token per request. The reason for this is that this is in many clients not a static aspect and might even change for every request instance for the same request type. So the capability is signal on every request instance by the presence of a `workDoneToken` property. - -To avoid that clients set up a progress monitor user interface before sending a request but the server doesn't actually report any progress a server needs to signal general work done progress reporting support in the corresponding server capability. For the above find references example a server would signal such a support by setting the `referencesProvider` property in the server capabilities as follows: - -```json -{ - "referencesProvider": { - "workDoneProgress": true - } -} -``` - -The corresponding type definition for the server capability looks like this: - -```typescript -export interface WorkDoneProgressOptions { - workDoneProgress?: boolean; -} -``` -###### Server Initiated Progress - -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). - -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: - -```typescript - /** - * Window specific client capabilities. - */ - window?: { - /** - * Whether client supports server initiated progress using the - * `window/workDoneProgress/create` request. - */ - workDoneProgress?: boolean; - }; -``` - -#### Partial Result Progress - -> *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: - -```json -{ - "textDocument": { - "uri": "file:///folder/file.ts" - }, - "position": { - "line": 9, - "character": 5 - }, - "context": { - "includeDeclaration": true - }, - // The token used to report work done progress. - "workDoneToken": "1d546990-40a3-4b77-b134-46622995f6ae", - // The token used to report partial result progress. - "partialResultToken": "5f6f349e-4f81-4a3b-afff-ee04bff96804" -} -``` - -The `partialResultToken` is then used to report partial results for the find references request. - -If a server reports partial result via a corresponding `$/progress`, the whole result must be reported using n `$/progress` notifications. The final response has to be empty in terms of result values. This avoids confusion about how the final result should be interpreted, e.g. as another partial result or as a replacing result. - -If the response errors the provided partial results should be treated as follows: - -- 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. - -#### PartialResultParams - -A parameter literal used to pass a partial result token. - -```typescript -export interface PartialResultParams { - /** - * An optional token that a server can use to report partial results (e.g. - * streaming) to the client. - */ - partialResultToken?: ProgressToken; -} -``` - -#### TraceValue - -A `TraceValue` represents the level of verbosity with which the server systematically reports its execution trace using [$/logTrace](#logTrace) notifications. -The initial trace value is set by the client at initialization and can be modified later using the [$/setTrace](#setTrace) notification. - -```typescript -export type TraceValue = 'off' | 'messages' | 'verbose'; -``` - -### Actual Protocol - -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. - -#### Initialize Request (:leftwards_arrow_with_hook:) - -The initialize request is sent as the first request from the client to the server. If the server receives a request or notification before the `initialize` request it should act as follows: - -* For a request the response should be an error with `code: -32002`. The message can be picked by the server. -* Notifications should be dropped, except for the exit notification. This will allow the exit of a server without an initialize request. - -Until the server has responded to the `initialize` request with an `InitializeResult`, the client must not send any additional requests or notifications to the server. In addition the server is not allowed to send any requests or notifications to the client until it has responded with an `InitializeResult`, with the exception that during the `initialize` request the server is allowed to send the notifications `window/showMessage`, `window/logMessage` and `telemetry/event` as well as the `window/showMessageRequest` request to the client. In case the client sets up a progress token in the initialize params (e.g. property `workDoneToken`) the server is also allowed to use that token (and only that token) using the `$/progress` notification sent from the server to the client. - -The `initialize` request may only be sent once. - -_Request_: -* method: 'initialize' -* params: `InitializeParams` defined as follows: - -```typescript -interface InitializeParams extends WorkDoneProgressParams { - /** - * The process Id of the parent process that started the server. Is null if - * the process has not been started by another process. If the parent - * process is not alive then the server should exit (see exit notification) - * its process. - */ - processId: integer | null; - - /** - * Information about the client - * - * @since 3.15.0 - */ - clientInfo?: { - /** - * The name of the client as defined by the client. - */ - name: string; - - /** - * The client's version as defined by the client. - */ - version?: string; - }; - - /** - * The locale the client is currently showing the user interface - * in. This must not necessarily be the locale of the operating - * system. - * - * Uses IETF language tags as the value's syntax - * (See https://en.wikipedia.org/wiki/IETF_language_tag) - * - * @since 3.16.0 - */ - locale?: string; - - /** - * The rootPath of the workspace. Is null - * if no folder is open. - * - * @deprecated in favour of `rootUri`. - */ - rootPath?: string | null; - - /** - * The rootUri of the workspace. Is null if no - * folder is open. If both `rootPath` and `rootUri` are set - * `rootUri` wins. - * - * @deprecated in favour of `workspaceFolders` - */ - rootUri: DocumentUri | null; - - /** - * User provided initialization options. - */ - initializationOptions?: any; - - /** - * The capabilities provided by the client (editor or tool) - */ - capabilities: ClientCapabilities; - - /** - * The initial trace setting. If omitted trace is disabled ('off'). - */ - trace?: TraceValue; - - /** - * The workspace folders configured in the client when the server starts. - * This property is only available if the client supports workspace folders. - * It can be `null` if the client supports workspace folders but none are - * configured. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFolder[] | null; -} -``` -Where `ClientCapabilities` and `TextDocumentClientCapabilities` are defined as follows: - - -##### TextDocumentClientCapabilities - -`TextDocumentClientCapabilities` define capabilities the editor / tool provides on text documents. - -```typescript -/** - * Text document specific client capabilities. - */ -export interface TextDocumentClientCapabilities { - - synchronization?: TextDocumentSyncClientCapabilities; - - /** - * Capabilities specific to the `textDocument/completion` request. - */ - completion?: CompletionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/hover` request. - */ - hover?: HoverClientCapabilities; - - /** - * Capabilities specific to the `textDocument/signatureHelp` request. - */ - signatureHelp?: SignatureHelpClientCapabilities; - - /** - * Capabilities specific to the `textDocument/declaration` request. - * - * @since 3.14.0 - */ - declaration?: DeclarationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/definition` request. - */ - definition?: DefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/typeDefinition` request. - * - * @since 3.6.0 - */ - typeDefinition?: TypeDefinitionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/implementation` request. - * - * @since 3.6.0 - */ - implementation?: ImplementationClientCapabilities; - - /** - * Capabilities specific to the `textDocument/references` request. - */ - references?: ReferenceClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentHighlight` request. - */ - documentHighlight?: DocumentHighlightClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentSymbol` request. - */ - documentSymbol?: DocumentSymbolClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeAction` request. - */ - codeAction?: CodeActionClientCapabilities; - - /** - * Capabilities specific to the `textDocument/codeLens` request. - */ - codeLens?: CodeLensClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentLink` request. - */ - documentLink?: DocumentLinkClientCapabilities; - - /** - * Capabilities specific to the `textDocument/documentColor` and the - * `textDocument/colorPresentation` request. - * - * @since 3.6.0 - */ - colorProvider?: DocumentColorClientCapabilities; - - /** - * Capabilities specific to the `textDocument/formatting` request. - */ - formatting?: DocumentFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/rangeFormatting` request. - */ - rangeFormatting?: DocumentRangeFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/onTypeFormatting` request. - */ - onTypeFormatting?: DocumentOnTypeFormattingClientCapabilities; - - /** - * Capabilities specific to the `textDocument/rename` request. - */ - rename?: RenameClientCapabilities; - - /** - * Capabilities specific to the `textDocument/publishDiagnostics` - * notification. - */ - publishDiagnostics?: PublishDiagnosticsClientCapabilities; - - /** - * Capabilities specific to the `textDocument/foldingRange` request. - * - * @since 3.10.0 - */ - foldingRange?: FoldingRangeClientCapabilities; - - /** - * Capabilities specific to the `textDocument/selectionRange` request. - * - * @since 3.15.0 - */ - selectionRange?: SelectionRangeClientCapabilities; - - /** - * Capabilities specific to the `textDocument/linkedEditingRange` request. - * - * @since 3.16.0 - */ - linkedEditingRange?: LinkedEditingRangeClientCapabilities; - - /** - * Capabilities specific to the various call hierarchy requests. - * - * @since 3.16.0 - */ - callHierarchy?: CallHierarchyClientCapabilities; - - /** - * Capabilities specific to the various semantic token requests. - * - * @since 3.16.0 - */ - semanticTokens?: SemanticTokensClientCapabilities; - - /** - * Capabilities specific to the `textDocument/moniker` request. - * - * @since 3.16.0 - */ - moniker?: MonikerClientCapabilities; -} -``` - -`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). - -```typescript -interface ClientCapabilities { - /** - * Workspace specific client capabilities. - */ - workspace?: { - /** - * The client supports applying batch edits - * to the workspace by supporting the request - * 'workspace/applyEdit' - */ - applyEdit?: boolean; - - /** - * Capabilities specific to `WorkspaceEdit`s - */ - workspaceEdit?: WorkspaceEditClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeConfiguration` - * notification. - */ - didChangeConfiguration?: DidChangeConfigurationClientCapabilities; - - /** - * Capabilities specific to the `workspace/didChangeWatchedFiles` - * notification. - */ - didChangeWatchedFiles?: DidChangeWatchedFilesClientCapabilities; - - /** - * Capabilities specific to the `workspace/symbol` request. - */ - symbol?: WorkspaceSymbolClientCapabilities; - - /** - * Capabilities specific to the `workspace/executeCommand` request. - */ - executeCommand?: ExecuteCommandClientCapabilities; - - /** - * The client has support for workspace folders. - * - * @since 3.6.0 - */ - workspaceFolders?: boolean; - - /** - * The client supports `workspace/configuration` requests. - * - * @since 3.6.0 - */ - configuration?: boolean; - - /** - * Capabilities specific to the semantic token requests scoped to the - * workspace. - * - * @since 3.16.0 - */ - semanticTokens?: SemanticTokensWorkspaceClientCapabilities; - - /** - * Capabilities specific to the code lens requests scoped to the - * workspace. - * - * @since 3.16.0 - */ - codeLens?: CodeLensWorkspaceClientCapabilities; - - /** - * The client has support for file requests/notifications. - * - * @since 3.16.0 - */ - fileOperations?: { - /** - * Whether the client supports dynamic registration for file - * requests/notifications. - */ - dynamicRegistration?: boolean; - - /** - * The client has support for sending didCreateFiles notifications. - */ - didCreate?: boolean; - - /** - * The client has support for sending willCreateFiles requests. - */ - willCreate?: boolean; - - /** - * The client has support for sending didRenameFiles notifications. - */ - didRename?: boolean; - - /** - * The client has support for sending willRenameFiles requests. - */ - willRename?: boolean; - - /** - * The client has support for sending didDeleteFiles notifications. - */ - didDelete?: boolean; - - /** - * The client has support for sending willDeleteFiles requests. - */ - willDelete?: boolean; - }; - }; - - /** - * Text document specific client capabilities. - */ - textDocument?: TextDocumentClientCapabilities; - - /** - * 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. - * - * @since 3.15.0 - */ - workDoneProgress?: boolean; - - /** - * Capabilities specific to the showMessage request - * - * @since 3.16.0 - */ - showMessage?: ShowMessageRequestClientCapabilities; - - /** - * Client capabilities for the show document request. - * - * @since 3.16.0 - */ - showDocument?: ShowDocumentClientCapabilities; - }; - - /** - * General client capabilities. - * - * @since 3.16.0 - */ - general?: { - /** - * Client capabilities specific to regular expressions. - * - * @since 3.16.0 - */ - regularExpressions?: RegularExpressionsClientCapabilities; - - /** - * Client capabilities specific to the client's markdown parser. - * - * @since 3.16.0 - */ - markdown?: MarkdownClientCapabilities; - }; - - /** - * Experimental client capabilities. - */ - experimental?: any; -} -``` - -_Response_: -* result: `InitializeResult` defined as follows: - -```typescript -interface InitializeResult { - /** - * The capabilities the language server provides. - */ - capabilities: ServerCapabilities; - - /** - * Information about the server. - * - * @since 3.15.0 - */ - serverInfo?: { - /** - * The name of the server as defined by the server. - */ - name: string; - - /** - * The server's version as defined by the server. - */ - version?: string; - }; -} -``` -* error.code: - -```typescript -/** - * Known error codes for an `InitializeError`; - */ -export namespace InitializeError { - /** - * 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; -} -``` - -* error.data: - -```typescript -interface InitializeError { - /** - * Indicates whether the client execute the following retry logic: - * (1) show the message provided by the ResponseError to the user - * (2) user selects retry or cancel - * (3) if user selected retry the initialize method is sent again. - */ - retry: boolean; -} -``` - -The server can signal the following capabilities: - -```typescript -interface ServerCapabilities { - /** - * Defines how text documents are synced. Is either a detailed structure - * defining each notification or for backwards compatibility the - * TextDocumentSyncKind number. If omitted it defaults to - * `TextDocumentSyncKind.None`. - */ - textDocumentSync?: TextDocumentSyncOptions | TextDocumentSyncKind; - - /** - * The server provides completion support. - */ - completionProvider?: CompletionOptions; - - /** - * The server provides hover support. - */ - hoverProvider?: boolean | HoverOptions; - - /** - * The server provides signature help support. - */ - signatureHelpProvider?: SignatureHelpOptions; - - /** - * The server provides go to declaration support. - * - * @since 3.14.0 - */ - declarationProvider?: boolean | DeclarationOptions - | DeclarationRegistrationOptions; - - /** - * The server provides goto definition support. - */ - definitionProvider?: boolean | DefinitionOptions; - - /** - * The server provides goto type definition support. - * - * @since 3.6.0 - */ - typeDefinitionProvider?: boolean | TypeDefinitionOptions - | TypeDefinitionRegistrationOptions; - - /** - * The server provides goto implementation support. - * - * @since 3.6.0 - */ - implementationProvider?: boolean | ImplementationOptions - | ImplementationRegistrationOptions; - - /** - * The server provides find references support. - */ - referencesProvider?: boolean | ReferenceOptions; - - /** - * The server provides document highlight support. - */ - documentHighlightProvider?: boolean | DocumentHighlightOptions; - - /** - * The server provides document symbol support. - */ - documentSymbolProvider?: boolean | DocumentSymbolOptions; - - /** - * The server provides code actions. The `CodeActionOptions` return type is - * only valid if the client signals code action literal support via the - * property `textDocument.codeAction.codeActionLiteralSupport`. - */ - codeActionProvider?: boolean | CodeActionOptions; - - /** - * The server provides code lens. - */ - codeLensProvider?: CodeLensOptions; - - /** - * The server provides document link support. - */ - documentLinkProvider?: DocumentLinkOptions; - - /** - * The server provides color provider support. - * - * @since 3.6.0 - */ - colorProvider?: boolean | DocumentColorOptions - | DocumentColorRegistrationOptions; - - /** - * The server provides document formatting. - */ - documentFormattingProvider?: boolean | DocumentFormattingOptions; - - /** - * The server provides document range formatting. - */ - documentRangeFormattingProvider?: boolean | DocumentRangeFormattingOptions; - - /** - * The server provides document formatting on typing. - */ - documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions; - - /** - * The server provides rename support. RenameOptions may only be - * specified if the client states that it supports - * `prepareSupport` in its initial `initialize` request. - */ - renameProvider?: boolean | RenameOptions; - - /** - * The server provides folding provider support. - * - * @since 3.10.0 - */ - foldingRangeProvider?: boolean | FoldingRangeOptions - | FoldingRangeRegistrationOptions; - - /** - * The server provides execute command support. - */ - executeCommandProvider?: ExecuteCommandOptions; - - /** - * The server provides selection range support. - * - * @since 3.15.0 - */ - selectionRangeProvider?: boolean | SelectionRangeOptions - | SelectionRangeRegistrationOptions; - - /** - * The server provides linked editing range support. - * - * @since 3.16.0 - */ - linkedEditingRangeProvider?: boolean | LinkedEditingRangeOptions - | LinkedEditingRangeRegistrationOptions; - - /** - * The server provides call hierarchy support. - * - * @since 3.16.0 - */ - callHierarchyProvider?: boolean | CallHierarchyOptions - | CallHierarchyRegistrationOptions; - - /** - * The server provides semantic tokens support. - * - * @since 3.16.0 - */ - semanticTokensProvider?: SemanticTokensOptions - | SemanticTokensRegistrationOptions; - - /** - * Whether server provides moniker support. - * - * @since 3.16.0 - */ - monikerProvider?: boolean | MonikerOptions | MonikerRegistrationOptions; - - /** - * The server provides workspace symbol support. - */ - workspaceSymbolProvider?: boolean | WorkspaceSymbolOptions; - - /** - * Workspace specific server capabilities - */ - workspace?: { - /** - * The server supports workspace folder. - * - * @since 3.6.0 - */ - workspaceFolders?: WorkspaceFoldersServerCapabilities; - - /** - * The server is interested in file notifications/requests. - * - * @since 3.16.0 - */ - fileOperations?: { - /** - * The server is interested in receiving didCreateFiles - * notifications. - */ - didCreate?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willCreateFiles requests. - */ - willCreate?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving didRenameFiles - * notifications. - */ - didRename?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willRenameFiles requests. - */ - willRename?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving didDeleteFiles file - * notifications. - */ - didDelete?: FileOperationRegistrationOptions; - - /** - * The server is interested in receiving willDeleteFiles file - * requests. - */ - willDelete?: FileOperationRegistrationOptions; - }; - }; - - /** - * Experimental server capabilities. - */ - experimental?: any; -} -``` - -#### Initialized Notification (:arrow_right:) - -The initialized notification is sent from the client to the server after the client received the result of the `initialize` request but before the client is sending any other request or notification to the server. The server can use the `initialized` notification for example to dynamically register capabilities. The `initialized` notification may only be sent once. - -_Notification_: -* method: 'initialized' -* params: `InitializedParams` defined as follows: - -```typescript -interface InitializedParams { -} -``` - -#### Shutdown Request (:leftwards_arrow_with_hook:) - -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. - -#### Exit Notification (:arrow_right:) - -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 - -#### LogTrace Notification (:arrow_left:) - -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; -} -``` - -#### SetTrace Notification (:arrow_right:) - -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; -} -``` - -#### ShowMessage Notification (:arrow_left:) - -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; -``` - -#### ShowMessage Request (:arrow_right_hook:) - -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; -} -``` - -#### Show Document Request (:arrow_right_hook:) - -> 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. - -#### LogMessage Notification (:arrow_left:) - -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; -} -``` - -#### Creating Work Done Progress (:arrow_right_hook:) - -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`. - -#### Canceling a Work Done Progress (:arrow_right:) - -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; -} -``` - -#### Telemetry Notification (:arrow_left:) - -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'; - -#### Register Capability (:arrow_right_hook:) - -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). - -Server must not register the same capability both statically through the initialize result and dynamically for the same document selector. If a server wants to support both static and dynamic registration it needs to check the client capability in the initialize request and only register the capability statically if the client doesn't support dynamic registration for that capability. - -_Request_: -* method: 'client/registerCapability' -* params: `RegistrationParams` - -Where `RegistrationParams` are defined as follows: - -```typescript -/** - * General parameters to register for a capability. - */ -export interface Registration { - /** - * The id used to register the request. The id can be used to deregister - * the request again. - */ - id: string; - - /** - * The method / capability to register for. - */ - method: string; - - /** - * Options necessary for the registration. - */ - registerOptions?: any; -} - -export interface RegistrationParams { - registrations: Registration[]; -} -``` - -Since most of the registration options require to specify a document selector there is a base interface that can be used. See `TextDocumentRegistrationOptions`. - -An example JSON RPC message to register dynamically for the `textDocument/willSaveWaitUntil` feature on the client side is as follows (only details shown): - -```json -{ - "method": "client/registerCapability", - "params": { - "registrations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil", - "registerOptions": { - "documentSelector": [ - { "language": "javascript" } - ] - } - } - ] - } -} -``` - -This message is sent from the server to the client and after the client has successfully executed the request further `textDocument/willSaveWaitUntil` requests for JavaScript text documents are sent from the client to the server. - -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. - -#### Unregister Capability (:arrow_right_hook:) - -The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability. - -_Request_: -* method: 'client/unregisterCapability' -* params: `UnregistrationParams` - -Where `UnregistrationParams` are defined as follows: - -```typescript -/** - * General parameters to unregister a capability. - */ -export interface Unregistration { - /** - * The id used to unregister the request or notification. Usually an id - * provided during the register request. - */ - id: string; - - /** - * The method / capability to unregister for. - */ - method: string; -} - -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 - // of the specification. - unregisterations: Unregistration[]; -} -``` - -An example JSON RPC message to unregister the above registered `textDocument/willSaveWaitUntil` feature looks like this: - -```json -{ - "method": "client/unregisterCapability", - "params": { - "unregisterations": [ - { - "id": "79eee87c-c409-4664-8102-e03263673f6f", - "method": "textDocument/willSaveWaitUntil" - } - ] - } -} -``` -_Response_: -* result: void. -* error: code and message set in case an exception happens during the request. - -##### Workspace folders request (:arrow_right_hook:) - -> *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 - -##### DidChangeWorkspaceFolders Notification (:arrow_right:) - -> *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" -} -``` - -_Notification_: -* method: 'workspace/didChangeWorkspaceFolders' -* params: `DidChangeWorkspaceFoldersParams` defined as follows: - -```typescript -export interface DidChangeWorkspaceFoldersParams { - /** - * The actual workspace folder change event. - */ - 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[]; -} -``` - -#### DidChangeConfiguration Notification (:arrow_right:) - -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: - -```typescript -export interface DidChangeConfigurationClientCapabilities { - /** - * Did change configuration notification supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Notification_: -* method: 'workspace/didChangeConfiguration', -* params: `DidChangeConfigurationParams` defined as follows: - -```typescript -interface DidChangeConfigurationParams { - /** - * The actual changed settings - */ - settings: any; -} -``` - -#### Configuration Request (:arrow_right_hook:) - -> *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 - -```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; -} -``` - -_Response_: -* result: any[] -* error: code and message set in case an exception happens during the 'workspace/configuration' request - -#### DidChangeWatchedFiles Notification (:arrow_right:) - -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; -} -``` - -_Notification_: -* method: 'workspace/didChangeWatchedFiles' -* params: `DidChangeWatchedFilesParams` defined as follows: - -```typescript -interface DidChangeWatchedFilesParams { - /** - * The actual file events. - */ - changes: FileEvent[]; -} -``` - -Where FileEvents are described as follows: - -```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; -} -``` - -#### Workspace Symbols Request (:leftwards_arrow_with_hook:) - -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. - -#### Execute a command (:leftwards_arrow_with_hook:) - -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. - -#### Applies a WorkspaceEdit (:arrow_right_hook:) - -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. - -#### WillCreateFiles Request (:leftwards_arrow_with_hook:) - -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. - -#### DidCreateFiles Notification (:arrow_right:) - -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` - -#### WillRenameFiles Request (:leftwards_arrow_with_hook:) - -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. - -#### DidRenameFiles Notification (:arrow_right:) - -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` - -#### WillDeleteFiles Request (:leftwards_arrow_with_hook:) - -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. - -#### DidDeleteFiles Notification (:arrow_right:) - -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` - -#### Text Document Synchronization - -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 Capability_: -* property path (optional): `textDocument.synchronization.dynamicRegistration` -* property type: `boolean` - -Controls whether text document synchronization supports dynamic registration. - -_Server Capability_: -* 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): - -```typescript -/** - * Defines how the host (editor) should sync document changes to the language - * server. - */ -export namespace TextDocumentSyncKind { - /** - * Documents should not be synced at all. - */ - export const None = 0; - - /** - * Documents are synced by always sending the full content - * of the document. - */ - export const Full = 1; - - /** - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * send. - */ - export const Incremental = 2; -} - -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. If omitted open - * close notification should not be sent. - */ - openClose?: boolean; - - /** - * Change notifications are sent to the server. See - * TextDocumentSyncKind.None, TextDocumentSyncKind.Full and - * TextDocumentSyncKind.Incremental. If omitted it defaults to - * TextDocumentSyncKind.None. - */ - change?: TextDocumentSyncKind; -} -``` - -#### DidOpenTextDocument Notification (:arrow_right:) - -The document open notification is sent from the client to the server to signal newly opened text documents. The document's content is now managed by the client and the server must not try to read the document's content using the document's Uri. Open in this sense means it is managed by the client. It doesn't necessarily mean that its content is presented in an editor. An open notification must not be sent more than once without a corresponding close notification send before. This means open and close notification must be balanced and the max open count for a particular textDocument is one. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -The `DidOpenTextDocumentParams` contain the language id the document is associated with. If the language id of a document changes, the client needs to send a `textDocument/didClose` to the server followed by a `textDocument/didOpen` with the new language id if the server handles the new language id as well. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: [`TextDocumentRegistrationOptions`](#textDocumentRegistrationOptions) - -_Notification_: -* method: 'textDocument/didOpen' -* params: `DidOpenTextDocumentParams` defined as follows: - -```typescript -interface DidOpenTextDocumentParams { - /** - * The document that was opened. - */ - textDocument: TextDocumentItem; -} -``` - -#### DidChangeTextDocument Notification (:arrow_right:) - -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. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentChangeRegistrationOptions` defined as follows: -```typescript -/** - * Describe options to be used when registering for text document change events. - */ -export interface TextDocumentChangeRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * How documents are synced to the server. See TextDocumentSyncKind.Full - * and TextDocumentSyncKind.Incremental. - */ - syncKind: TextDocumentSyncKind; -} -``` - -_Notification_: -* method: 'textDocument/didChange' -* params: `DidChangeTextDocumentParams` defined as follows: - -```typescript -interface DidChangeTextDocumentParams { - /** - * The document that did change. The version number points - * to the version after all provided content changes have - * been applied. - */ - textDocument: VersionedTextDocumentIdentifier; - - /** - * The actual content changes. The content changes describe single state - * changes to the document. So if there are two content changes c1 (at - * array index 0) and c2 (at array index 1) for a document in state S then - * c1 moves the document from S to S' and c2 from S' to S''. So c1 is - * computed on the state S and c2 is computed on the state S'. - * - * To mirror the content of a document using change events use the following - * approach: - * - start with the same initial content - * - apply the 'textDocument/didChange' notifications in the order you - * receive them. - * - apply the `TextDocumentContentChangeEvent`s in a single notification - * in the order you receive them. - */ - contentChanges: TextDocumentContentChangeEvent[]; -} - -/** - * 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. - */ -export type TextDocumentContentChangeEvent = { - /** - * The range of the document that changed. - */ - range: Range; - - /** - * The optional length of the range that got replaced. - * - * @deprecated use range instead. - */ - rangeLength?: uinteger; - - /** - * The new text for the provided range. - */ - text: string; -} | { - /** - * The new text of the whole document. - */ - text: string; -}; -``` - -#### WillSaveTextDocument Notification (:arrow_right:) - -The document will save notification is sent from the client to the server before the document is actually saved. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.willSave` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSave` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSave` notifications. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: 'textDocument/willSave' -* params: `WillSaveTextDocumentParams` defined as follows: - -```typescript -/** - * The parameters send in a will save text document notification. - */ -export interface WillSaveTextDocumentParams { - /** - * The document that will be saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * The 'TextDocumentSaveReason'. - */ - reason: TextDocumentSaveReason; -} - -/** - * Represents reasons why a text document is saved. - */ -export namespace TextDocumentSaveReason { - - /** - * Manually triggered, e.g. by the user pressing save, by starting - * debugging, or by an API call. - */ - export const Manual = 1; - - /** - * Automatic after a delay. - */ - export const AfterDelay = 2; - - /** - * When the editor lost focus. - */ - export const FocusOut = 3; -} - -export type TextDocumentSaveReason = 1 | 2 | 3; -``` - -#### WillSaveWaitUntilTextDocument Request (:leftwards_arrow_with_hook:) - -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. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.willSaveWaitUntil` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/willSaveWaitUntil` requests. - -_Server Capability_: -* property name (optional): `textDocumentSync.willSaveWaitUntil` -* property type: `boolean` - -The capability indicates that the server is interested in `textDocument/willSaveWaitUntil` requests. - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Request_: -* method: 'textDocument/willSaveWaitUntil' -* params: `WillSaveTextDocumentParams` - -_Response_: -* result:[`TextEdit[]`](#textEdit) \| `null` -* error: code and message set in case an exception happens during the `willSaveWaitUntil` request. - -#### DidSaveTextDocument Notification (:arrow_right:) - -The document save notification is sent from the client to the server when the document was saved in the client. - -_Client Capability_: -* property name (optional): `textDocument.synchronization.didSave` -* property type: `boolean` - -The capability indicates that the client supports `textDocument/didSave` notifications. - -_Server Capability_: -* property name (optional): `textDocumentSync.save` -* property type: `boolean | SaveOptions` where `SaveOptions` is defined as follows: - -```typescript -export interface SaveOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -The capability indicates that the server is interested in `textDocument/didSave` notifications. - -_Registration Options_: `TextDocumentSaveRegistrationOptions` defined as follows: -```typescript -export interface TextDocumentSaveRegistrationOptions - extends TextDocumentRegistrationOptions { - /** - * The client is supposed to include the content on save. - */ - includeText?: boolean; -} -``` - -_Notification_: -* method: 'textDocument/didSave' -* params: `DidSaveTextDocumentParams` defined as follows: - -```typescript -interface DidSaveTextDocumentParams { - /** - * The document that was saved. - */ - textDocument: TextDocumentIdentifier; - - /** - * Optional the content when saved. Depends on the includeText value - * when the save notification was requested. - */ - text?: string; -} -``` - -#### DidCloseTextDocument Notification (:arrow_right:) - -The document close notification is sent from the client to the server when the document got closed in the client. The document's master now exists where the document's Uri points to (e.g. if the document's Uri is a file Uri the master now exists on disk). As with the open notification the close notification is about managing the document's content. Receiving a close notification doesn't mean that the document was open in an editor before. A close notification requires a previous open notification to be sent. Note that a server's ability to fulfill requests is independent of whether a text document is open or closed. - -_Client Capability_: -See general synchronization [client capabilities](#textDocument_synchronization_cc). - -_Server Capability_: -See general synchronization [server capabilities](#textDocument_synchronization_sc). - -_Registration Options_: `TextDocumentRegistrationOptions` - -_Notification_: -* method: 'textDocument/didClose' -* params: `DidCloseTextDocumentParams` defined as follows: - -```typescript -interface DidCloseTextDocumentParams { - /** - * The document that was closed. - */ - textDocument: TextDocumentIdentifier; -} -``` - -The final structure of the `TextDocumentSyncClientCapabilities` and the `TextDocumentSyncOptions` server options look like this - -```typescript -export interface TextDocumentSyncClientCapabilities { - /** - * Whether text document synchronization supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports sending will save notifications. - */ - willSave?: boolean; - - /** - * The client supports sending a will save request and - * waits for a response providing text edits which will - * be applied to the document before it is saved. - */ - willSaveWaitUntil?: boolean; - - /** - * The client supports did save notifications. - */ - didSave?: boolean; -} - -/** - * Defines how the host (editor) should sync document changes to the language - * server. - */ -export namespace TextDocumentSyncKind { - /** - * Documents should not be synced at all. - */ - export const None = 0; - - /** - * Documents are synced by always sending the full content - * of the document. - */ - export const Full = 1; - - /** - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * send. - */ - export const Incremental = 2; -} - -export type TextDocumentSyncKind = 0 | 1 | 2; - -export interface TextDocumentSyncOptions { - /** - * Open and close notifications are sent to the server. If omitted open - * close notification should not be sent. - */ - openClose?: boolean; - /** - * Change notifications are sent to the server. See - * TextDocumentSyncKind.None, TextDocumentSyncKind.Full and - * TextDocumentSyncKind.Incremental. If omitted it defaults to - * TextDocumentSyncKind.None. - */ - change?: TextDocumentSyncKind; - /** - * If present will save notifications are sent to the server. If omitted - * the notification should not be sent. - */ - willSave?: boolean; - /** - * If present will save wait until requests are sent to the server. If - * omitted the request should not be sent. - */ - willSaveWaitUntil?: boolean; - /** - * If present save notifications are sent to the server. If omitted the - * notification should not be sent. - */ - save?: boolean | SaveOptions; -} -``` - -#### PublishDiagnostics Notification (:arrow_left:) - -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.publishDiagnostics` -* property type: `PublishDiagnosticsClientCapabilities` defined as follows: - -```typescript -export interface PublishDiagnosticsClientCapabilities { - /** - * 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: - -```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[]; -} -``` - -#### Completion Request (:leftwards_arrow_with_hook:) - -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. - -_Client Capability_: -* property name (optional): `textDocument.completion` -* property type: `CompletionClientCapabilities` defined as follows: - -```typescript -export interface CompletionClientCapabilities { - /** - * Whether completion supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `CompletionItem` specific - * capabilities. - */ - completionItem?: { - /** - * Client supports snippets as insert text. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are - * linked, that is typing in one will update others too. - */ - snippetSupport?: boolean; - - /** - * Client supports commit characters on a completion item. - */ - commitCharactersSupport?: boolean; - - /** - * Client supports the following content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client supports the deprecated property on a completion item. - */ - deprecatedSupport?: boolean; - - /** - * Client supports the preselect property on a completion item. - */ - preselectSupport?: boolean; - - /** - * Client supports the tag property on a completion item. Clients - * supporting tags have to handle unknown tags gracefully. Clients - * especially need to preserve unknown tags when sending a completion - * item back to the server in a resolve call. - * - * @since 3.15.0 - */ - tagSupport?: { - /** - * The tags supported by the client. - */ - valueSet: CompletionItemTag[]; - }; - - /** - * Client supports insert replace edit to control different behavior if - * a completion item is inserted in the text or should replace text. - * - * @since 3.16.0 - */ - insertReplaceSupport?: boolean; - - /** - * Indicates which properties a client can resolve lazily on a - * completion item. Before version 3.16.0 only the predefined properties - * `documentation` and `detail` could be resolved lazily. - * - * @since 3.16.0 - */ - resolveSupport?: { - /** - * The properties that a client can resolve lazily. - */ - properties: string[]; - }; - - /** - * The client supports the `insertTextMode` property on - * a completion item to override the whitespace handling mode - * as defined by the client. - * - * @since 3.16.0 - */ - insertTextModeSupport?: { - valueSet: InsertTextMode[]; - }; - }; - - completionItemKind?: { - /** - * The completion item 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 completion items kinds from `Text` to `Reference` as defined in - * the initial version of the protocol. - */ - valueSet?: CompletionItemKind[]; - }; - - /** - * The client supports to send additional context information for a - * `textDocument/completion` request. - */ - contextSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `completionProvider` -* property type: `CompletionOptions` defined as follows: - -```typescript -/** - * Completion options. - */ -export interface CompletionOptions extends WorkDoneProgressOptions { - /** - * Most tools trigger completion request automatically without explicitly - * requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they - * do so when the user starts to type an identifier. For example if the user - * types `c` in a JavaScript file code complete will automatically pop up - * present `console` besides others as a completion item. Characters that - * make up identifiers don't need to be listed here. - * - * If code complete should automatically be trigger on characters not being - * valid inside an identifier (for example `.` in JavaScript) list them in - * `triggerCharacters`. - */ - triggerCharacters?: string[]; - - /** - * The list of all possible characters that commit a completion. This field - * can be used if clients don't support individual commit characters per - * completion item. See client capability - * `completion.completionItem.commitCharactersSupport`. - * - * If a server provides both `allCommitCharacters` and commit characters on - * an individual completion item the ones on the completion item win. - * - * @since 3.2.0 - */ - allCommitCharacters?: string[]; - - /** - * The server provides support to resolve additional - * information for a completion item. - */ - resolveProvider?: boolean; -} -``` - -_Registration Options_: `CompletionRegistrationOptions` options defined as follows: -```typescript -export interface CompletionRegistrationOptions - extends TextDocumentRegistrationOptions, CompletionOptions { -} -``` - -_Request_: -* method: 'textDocument/completion' -* params: `CompletionParams` defined as follows: - -```typescript -export interface CompletionParams extends TextDocumentPositionParams, - WorkDoneProgressParams, PartialResultParams { - /** - * The completion context. This is only available if the client specifies - * to send this using the client capability - * `completion.contextSupport === true` - */ - context?: CompletionContext; -} - -/** - * How a completion was triggered - */ -export namespace CompletionTriggerKind { - /** - * Completion was triggered by typing an identifier (24x7 code - * complete), manual invocation (e.g Ctrl+Space) or via API. - */ - export const Invoked: 1 = 1; - - /** - * Completion was triggered by a trigger character specified by - * the `triggerCharacters` properties of the - * `CompletionRegistrationOptions`. - */ - export const TriggerCharacter: 2 = 2; - - /** - * Completion was re-triggered as the current completion list is incomplete. - */ - export const TriggerForIncompleteCompletions: 3 = 3; -} -export type CompletionTriggerKind = 1 | 2 | 3; - - -/** - * Contains additional information about the context in which a completion - * request is triggered. - */ -export interface CompletionContext { - /** - * How the completion was triggered. - */ - triggerKind: CompletionTriggerKind; - - /** - * The trigger character (a single character) that has trigger code - * complete. Is undefined if - * `triggerKind !== CompletionTriggerKind.TriggerCharacter` - */ - triggerCharacter?: string; -} -``` - -_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 }` - -```typescript -/** - * Represents a collection of [completion items](#CompletionItem) to be - * presented in the editor. - */ -export interface CompletionList { - /** - * This list is not complete. Further typing should result in recomputing - * this list. - * - * Recomputed lists have all their items replaced (not appended) in the - * incomplete completion sessions. - */ - isIncomplete: boolean; - - /** - * The completion items. - */ - items: CompletionItem[]; -} - -/** - * Defines whether the insert text in a completion item should be interpreted as - * plain text or a snippet. - */ -export namespace InsertTextFormat { - /** - * The primary text to be inserted is treated as a plain string. - */ - export const PlainText = 1; - - /** - * The primary text to be inserted is treated as a snippet. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - */ - export const Snippet = 2; -} - -export type InsertTextFormat = 1 | 2; - -/** - * Completion item tags are extra annotations that tweak the rendering of a - * completion item. - * - * @since 3.15.0 - */ -export namespace CompletionItemTag { - /** - * Render a completion as obsolete, usually using a strike-out. - */ - export const Deprecated = 1; -} - -export type CompletionItemTag = 1; - -/** - * A special text edit to provide an insert and a replace operation. - * - * @since 3.16.0 - */ -export interface InsertReplaceEdit { - /** - * The string to be inserted. - */ - newText: string; - - /** - * The range if the insert is requested - */ - insert: Range; - - /** - * The range if the replace is requested. - */ - replace: Range; -} - -/** - * How whitespace and indentation is handled during completion - * item insertion. - * - * @since 3.16.0 - */ -export namespace InsertTextMode { - /** - * The insertion or replace strings is taken as it is. If the - * value is multi line the lines below the cursor will be - * inserted using the indentation defined in the string value. - * The client will not apply any kind of adjustments to the - * string. - */ - export const asIs: 1 = 1; - - /** - * The editor adjusts leading whitespace of new lines so that - * they match the indentation up to the cursor of the line for - * which the item is accepted. - * - * Consider a line like this: <2tabs><3tabs>foo. Accepting a - * multi line completion item is indented using 2 tabs and all - * following lines inserted will be indented using 2 tabs as well. - */ - export const adjustIndentation: 2 = 2; -} - -export type InsertTextMode = 1 | 2; - -export interface CompletionItem { - /** - * The label of this completion item. By default - * also the text that is inserted when selecting - * this completion. - */ - label: string; - - /** - * 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`. - */ - kind?: CompletionItemKind; - - /** - * Tags for this completion item. - * - * @since 3.15.0 - */ - tags?: CompletionItemTag[]; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - detail?: string; - - /** - * A human-readable string that represents a doc-comment. - */ - documentation?: string | MarkupContent; - - /** - * Indicates if this item is deprecated. - * - * @deprecated Use `tags` instead if supported. - */ - deprecated?: boolean; - - /** - * Select this item when showing. - * - * *Note* that only one completion item can be selected and that the - * tool / client decides which item that is. The rule is that the *first* - * item of those that match best is selected. - */ - preselect?: boolean; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the label is used - * as the sort text for this item. - */ - sortText?: string; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the label is used as the - * filter text for this item. - */ - filterText?: string; - - /** - * A string that should be inserted into a document when selecting - * this completion. When `falsy` the label is used as the insert text - * for this item. - * - * The `insertText` is subject to interpretation by the client side. - * Some tools might not take the string literally. For example - * VS Code when code complete is requested in this example - * `con` and a completion item with an `insertText` of - * `console` is provided it will only insert `sole`. Therefore it is - * recommended to use `textEdit` instead since it avoids additional client - * side interpretation. - */ - insertText?: string; - - /** - * 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`. - */ - 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 - */ - insertTextMode?: InsertTextMode; - - /** - * An edit which is applied to a document when selecting this completion. - * When an edit is provided the value of `insertText` is ignored. - * - * *Note:* The range of the edit must be a single line range and it must - * contain the position at which completion has been requested. - * - * Most editors support two different operations when accepting a completion - * item. One is to insert a completion text and the other is to replace an - * 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. - * - * *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 which completion has been requested. - * *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range - * must be a prefix of the edit's replace range, that means it must be - * contained and starting at the same position. - * - * @since 3.16.0 additional type `InsertReplaceEdit` - */ - textEdit?: TextEdit | InsertReplaceEdit; - - /** - * 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. - * - * Additional text edits should be used to change text unrelated to the - * current cursor position (for example adding an import statement at the - * top of the file if the completion item will insert an unqualified type). - */ - additionalTextEdits?: TextEdit[]; - - /** - * An optional set of characters that when pressed while this completion is - * active will accept it first and then type that character. *Note* that all - * commit characters should have `length=1` and that superfluous characters - * will be ignored. - */ - commitCharacters?: string[]; - - /** - * An optional command that is executed *after* inserting this completion. - * *Note* that additional modifications to the current document should be - * described with the additionalTextEdits-property. - */ - command?: Command; - - /** - * A data entry field that is preserved on a completion item between - * a completion and a completion resolve request. - */ - data?: any; -} - -/** - * The kind of a completion entry. - */ -export namespace CompletionItemKind { - export const Text = 1; - export const Method = 2; - export const Function = 3; - export const Constructor = 4; - export const Field = 5; - export const Variable = 6; - export const Class = 7; - export const Interface = 8; - export const Module = 9; - export const Property = 10; - export const Unit = 11; - export const Value = 12; - export const Enum = 13; - export const Keyword = 14; - export const Snippet = 15; - export const Color = 16; - export const File = 17; - export const Reference = 18; - export const Folder = 19; - export const EnumMember = 20; - export const Constant = 21; - export const Struct = 22; - export const Event = 23; - export const Operator = 24; - export const TypeParameter = 25; -} -``` -* partial result: `CompletionItem[]` or `CompletionList` followed by `CompletionItem[]`. If the first provided result item is of type `CompletionList` subsequent partial results of `CompletionItem[]` add to the `items` property of the `CompletionList`. -* error: code and message set in case an exception happens during the completion request. - -Completion items support snippets (see `InsertTextFormat.Snippet`). The snippet format is as follows: - -##### Snippet Syntax - -The `body` of a snippet can use special constructs to control cursors and the text being inserted. The following are supported features and their syntaxes: - -##### Tab stops - -With tab stops, you can make the editor cursor move inside a snippet. Use `$1`, `$2` to specify cursor locations. The number is the order in which tab stops will be visited, whereas `$0` denotes the final cursor position. Multiple tab stops are linked and updated in sync. - -##### Placeholders - -Placeholders are tab stops with values, like `${1:foo}`. The placeholder text will be inserted and selected such that it can be easily changed. Placeholders can be nested, like `${1:another ${2:placeholder}}`. - -##### Choice - -Placeholders can have choices as values. The syntax is a comma separated enumeration of values, enclosed with the pipe-character, for example `${1|one,two,three|}`. When the snippet is inserted and the placeholder selected, choices will prompt the user to pick one of the values. - -##### Variables - -With `$name` or `${name:default}` you can insert the value of a variable. When a variable isn’t set, its *default* or the empty string is inserted. When a variable is unknown (that is, its name isn’t defined) the name of the variable is inserted and it is transformed into a placeholder. - -The following variables can be used: - -* `TM_SELECTED_TEXT` The currently selected text or the empty string -* `TM_CURRENT_LINE` The contents of the current line -* `TM_CURRENT_WORD` The contents of the word under cursor or the empty string -* `TM_LINE_INDEX` The zero-index based line number -* `TM_LINE_NUMBER` The one-index based line number -* `TM_FILENAME` The filename of the current document -* `TM_FILENAME_BASE` The filename of the current document without its extensions -* `TM_DIRECTORY` The directory of the current document -* `TM_FILEPATH` The full file path of the current document - -##### Variable Transforms - -Transformations allow you to modify the value of a variable before it is inserted. The definition of a transformation consists of three parts: - -1. A [regular expression](#regExp) that is matched against the value of a variable, or the empty string when the variable cannot be resolved. -2. A "format string" that allows to reference matching groups from the regular expression. The format string allows for conditional inserts and simple modifications. -3. Options that are passed to the regular expression. - -The following example inserts the name of the current file without its ending, so from `foo.txt` it makes `foo`. - -``` -${TM_FILENAME/(.*)\..+$/$1/} - | | | | - | | | |-> no options - | | | - | | |-> references the contents of the first - | | capture group - | | - | |-> regex to capture everything before - | the final `.suffix` - | - |-> resolves to the filename -``` - -##### Grammar - -Below is the EBNF ([extended Backus-Naur form](https://en.wikipedia.org/wiki/Extended_Backus-Naur_form)) for snippets. With `\` (backslash), you can escape `$`, `}` and `\`. Within choice elements, the backslash also escapes comma and pipe characters. - -``` -any ::= tabstop | placeholder | choice | variable | text -tabstop ::= '$' int | '${' int '}' -placeholder ::= '${' int ':' any '}' -choice ::= '${' int '|' text (',' text)* '|}' -variable ::= '$' var | '${' var }' - | '${' var ':' any '}' - | '${' var '/' regex '/' (format | text)+ '/' options '}' -format ::= '$' int | '${' int '}' - | '${' int ':' '/upcase' | '/downcase' | '/capitalize' '}' - | '${' int ':+' if '}' - | '${' int ':?' if ':' else '}' - | '${' int ':-' else '}' | '${' int ':' else '}' -regex ::= Regular Expression value (ctor-string) -options ::= Regular Expression option (ctor-options) -var ::= [_a-zA-Z] [_a-zA-Z0-9]* -int ::= [0-9]+ -text ::= .* -``` - -#### Completion Item Resolve Request (:leftwards_arrow_with_hook:) - -The request is sent from the client to the server to resolve additional information for a given completion item. - -_Request_: -* method: 'completionItem/resolve' -* params: `CompletionItem` - -_Response_: -* result: `CompletionItem` -* error: code and message set in case an exception happens during the completion resolve request. - -#### Hover Request (:leftwards_arrow_with_hook:) - -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: - -```typescript -export interface HoverClientCapabilities { - /** - * Whether hover supports dynamic registration. - */ - 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. - */ - contentFormat?: MarkupKind[]; -} -``` - -_Server Capability_: -* property name (optional): `hoverProvider` -* property type: `boolean | HoverOptions` where `HoverOptions` is defined as follows: - -```typescript -export interface HoverOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `HoverRegistrationOptions` defined as follows: -```typescript -export interface HoverRegistrationOptions - extends TextDocumentRegistrationOptions, HoverOptions { -} -``` - -_Request_: -* method: 'textDocument/hover' -* params: `HoverParams` defined as follows: - -```typescript -export interface HoverParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: -* result: `Hover` \| `null` defined as follows: - -```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: - -```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. - -#### Signature Help Request (:leftwards_arrow_with_hook:) - -The signature help request is sent from the client to the server to request signature information at a given cursor position. - -_Client Capability_: -* property name (optional): `textDocument.signatureHelp` -* property type: `SignatureHelpClientCapabilities` defined as follows: - -```typescript -export interface SignatureHelpClientCapabilities { - /** - * Whether signature help supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports the following `SignatureInformation` - * specific properties. - */ - signatureInformation?: { - /** - * Client supports the following content formats for the documentation - * property. The order describes the preferred format of the client. - */ - documentationFormat?: MarkupKind[]; - - /** - * Client capabilities specific to parameter information. - */ - parameterInformation?: { - /** - * The client supports processing label offsets instead of a - * simple label string. - * - * @since 3.14.0 - */ - labelOffsetSupport?: boolean; - }; - - /** - * The client supports the `activeParameter` property on - * `SignatureInformation` literal. - * - * @since 3.16.0 - */ - activeParameterSupport?: boolean; - }; - - /** - * The client supports to send additional context information for a - * `textDocument/signatureHelp` request. A client that opts into - * contextSupport will also support the `retriggerCharacters` on - * `SignatureHelpOptions`. - * - * @since 3.15.0 - */ - contextSupport?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `signatureHelpProvider` -* property type: `SignatureHelpOptions` defined as follows: - -```typescript -export interface SignatureHelpOptions extends WorkDoneProgressOptions { - /** - * The characters that trigger signature help - * automatically. - */ - triggerCharacters?: string[]; - - /** - * List of characters that re-trigger signature help. - * - * These trigger characters are only active when signature help is already - * showing. All trigger characters are also counted as re-trigger - * characters. - * - * @since 3.15.0 - */ - retriggerCharacters?: string[]; -} -``` - -_Registration Options_: `SignatureHelpRegistrationOptions` defined as follows: -```typescript -export interface SignatureHelpRegistrationOptions - extends TextDocumentRegistrationOptions, SignatureHelpOptions { -} -``` - -_Request_: -* method: 'textDocument/signatureHelp' -* params: `SignatureHelpParams` defined as follows: - -```typescript -export interface SignatureHelpParams extends TextDocumentPositionParams, - WorkDoneProgressParams { - /** - * The signature help context. This is only available if the client - * specifies to send this using the client capability - * `textDocument.signatureHelp.contextSupport === true` - * - * @since 3.15.0 - */ - context?: SignatureHelpContext; -} - -/** - * How a signature help was triggered. - * - * @since 3.15.0 - */ -export namespace SignatureHelpTriggerKind { - /** - * Signature help was invoked manually by the user or by a command. - */ - export const Invoked: 1 = 1; - /** - * Signature help was triggered by a trigger character. - */ - export const TriggerCharacter: 2 = 2; - /** - * Signature help was triggered by the cursor moving or by the document - * content changing. - */ - export const ContentChange: 3 = 3; -} -export type SignatureHelpTriggerKind = 1 | 2 | 3; - -/** - * Additional information about the context in which a signature help request - * was triggered. - * - * @since 3.15.0 - */ -export interface SignatureHelpContext { - /** - * Action that caused signature help to be triggered. - */ - triggerKind: SignatureHelpTriggerKind; - - /** - * Character that caused signature help to be triggered. - * - * This is undefined when triggerKind !== - * SignatureHelpTriggerKind.TriggerCharacter - */ - triggerCharacter?: string; - - /** - * `true` if signature help was already showing when it was triggered. - * - * Retriggers occur when the signature help is already active and can be - * caused by actions such as typing a trigger character, a cursor move, or - * document content changes. - */ - isRetrigger: boolean; - - /** - * The currently active `SignatureHelp`. - * - * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field - * updated based on the user navigating through available signatures. - */ - activeSignatureHelp?: SignatureHelp; -} -``` - -_Response_: -* result: `SignatureHelp` \| `null` defined as follows: - -```typescript -/** - * Signature help represents the signature of something - * callable. There can be multiple signature but only one - * active and only one active parameter. - */ -export interface SignatureHelp { - /** - * One or more signatures. If no signatures are available the signature help - * request should return `null`. - */ - signatures: SignatureInformation[]; - - /** - * 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. - * - * Whenever possible implementors should make an active decision about - * the active signature and shouldn't rely on a default value. - * - * In future version of the protocol this property might become - * mandatory to better express this. - */ - activeSignature?: uinteger; - - /** - * The active parameter of the active signature. If omitted or the value - * lies outside the range of `signatures[activeSignature].parameters` - * defaults to 0 if the active signature has parameters. If - * the active signature has no parameters it is ignored. - * In future version of the protocol this property might become - * mandatory to better express the active parameter if the - * active signature does have any. - */ - activeParameter?: uinteger; -} - -/** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ -export interface SignatureInformation { - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; - - /** - * The parameters of this signature. - */ - parameters?: ParameterInformation[]; - - /** - * The index of the active parameter. - * - * If provided, this is used in place of `SignatureHelp.activeParameter`. - * - * @since 3.16.0 - */ - activeParameter?: uinteger; -} - -/** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ -export interface ParameterInformation { - - /** - * The label of this parameter information. - * - * Either a string or an inclusive start and exclusive end offsets within - * its containing signature label. (see SignatureInformation.label). The - * offsets are based on a UTF-16 string representation as `Position` and - * `Range` does. - * - * *Note*: a label of type string should be a substring of its containing - * signature label. Its intended use case is to highlight the parameter - * label part in the `SignatureInformation.label`. - */ - label: string | [uinteger, uinteger]; - - /** - * The human-readable doc-comment of this parameter. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkupContent; -} -``` - -* error: code and message set in case an exception happens during the signature help request. - -#### Goto Declaration Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Goto Definition Request (:leftwards_arrow_with_hook:) - -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. - -#### Goto Type Definition Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Goto Implementation Request (:leftwards_arrow_with_hook:) - -> *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. - -#### Find References Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Highlights Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Symbols Request (:leftwards_arrow_with_hook:) - -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. - -#### Code Action Request (:leftwards_arrow_with_hook:) - -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. - -*Since version 3.16.0:* a client can offer a server to delay the computation of code action properties during a 'textDocument/codeAction' request: - -This is useful for cases where it is expensive to compute the value of a property (for example the `edit` property). Clients signal this through the `codeAction.resolveSupport` capability which lists all properties a client can resolve lazily. The server capability `codeActionProvider.resolveProvider` signals that a server will offer a `codeAction/resolve` route. To help servers to uniquely identify a code action in the resolve request, a code action literal can optional carry a data property. This is also guarded by an additional client capability `codeAction.dataSupport`. In general, a client should offer data support if it offers resolve support. It should also be noted that servers shouldn't alter existing attributes of a code action in a codeAction/resolve request. - -> *Since version 3.8.0:* support for CodeAction literals to enable the following scenarios: - -- the ability to directly return a workspace edit from the code action request. This avoids having another server roundtrip to execute an actual code action. However server providers should be aware that if the code action is expensive to compute or the edits are huge it might still be beneficial if the result is simply a command and the actual edit is only computed when needed. -- the ability to group code actions using a kind. Clients are allowed to ignore that information. However it allows them to better group code action for example into corresponding menus (e.g. all refactor code actions into a refactor menu). - -Clients need to announce their support for code action literals (e.g. literals of type `CodeAction`) and code action kinds via the corresponding client capability `codeAction.codeActionLiteralSupport`. - -_Client Capability_: -* property name (optional): `textDocument.codeAction` -* property type: `CodeActionClientCapabilities` defined as follows: - -```typescript -export interface CodeActionClientCapabilities { - /** - * Whether code action supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * The client supports code action literals as a valid - * response of the `textDocument/codeAction` request. - * - * @since 3.8.0 - */ - codeActionLiteralSupport?: { - /** - * The code action kind is supported with the following value - * set. - */ - codeActionKind: { - - /** - * The code action kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - */ - valueSet: CodeActionKind[]; - }; - }; - - /** - * Whether code action supports the `isPreferred` property. - * - * @since 3.15.0 - */ - isPreferredSupport?: boolean; - - /** - * Whether code action supports the `disabled` property. - * - * @since 3.16.0 - */ - disabledSupport?: boolean; - - /** - * Whether code action supports the `data` property which is - * preserved between a `textDocument/codeAction` and a - * `codeAction/resolve` request. - * - * @since 3.16.0 - */ - dataSupport?: boolean; - - - /** - * Whether the client supports resolving additional code action - * properties via a separate `codeAction/resolve` request. - * - * @since 3.16.0 - */ - resolveSupport?: { - /** - * The properties that a client can resolve lazily. - */ - properties: string[]; - }; - - /** - * Whether the client honors the change annotations in - * text edits and resource operations returned via the - * `CodeAction#edit` property by for example presenting - * the workspace edit in the user interface and asking - * for confirmation. - * - * @since 3.16.0 - */ - honorsChangeAnnotations?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `codeActionProvider` -* property type: `boolean | CodeActionOptions` where `CodeActionOptions` is defined as follows: - -```typescript -export interface CodeActionOptions extends WorkDoneProgressOptions { - /** - * CodeActionKinds that this server may return. - * - * The list of kinds may be generic, such as `CodeActionKind.Refactor`, - * or the server may list out every specific kind they provide. - */ - codeActionKinds?: CodeActionKind[]; - - /** - * The server provides support to resolve additional - * information for a code action. - * - * @since 3.16.0 - */ - resolveProvider?: boolean; -} -``` - -_Registration Options_: `CodeActionRegistrationOptions` defined as follows: -```typescript -export interface CodeActionRegistrationOptions extends - TextDocumentRegistrationOptions, CodeActionOptions { -} -``` - -_Request_: -* method: 'textDocument/codeAction' -* params: `CodeActionParams` defined as follows: - -```typescript -/** - * Params for the CodeActionRequest - */ -export interface CodeActionParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The document in which the command was invoked. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range for which the command was invoked. - */ - range: Range; - - /** - * Context carrying additional information. - */ - context: CodeActionContext; -} - -/** - * The kind of a code action. - * - * Kinds are a hierarchical list of identifiers separated by `.`, - * e.g. `"refactor.extract.function"`. - * - * The set of kinds is open and client needs to announce the kinds it supports - * to the server during initialization. - */ -export type CodeActionKind = string; - -/** - * A set of predefined code action kinds. - */ -export namespace CodeActionKind { - - /** - * Empty kind. - */ - export const Empty: CodeActionKind = ''; - - /** - * Base kind for quickfix actions: 'quickfix'. - */ - export const QuickFix: CodeActionKind = 'quickfix'; - - /** - * Base kind for refactoring actions: 'refactor'. - */ - export const Refactor: CodeActionKind = 'refactor'; - - /** - * Base kind for refactoring extraction actions: 'refactor.extract'. - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - export const RefactorExtract: CodeActionKind = 'refactor.extract'; - - /** - * Base kind for refactoring inline actions: 'refactor.inline'. - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - export const RefactorInline: CodeActionKind = 'refactor.inline'; - - /** - * Base kind for refactoring rewrite actions: 'refactor.rewrite'. - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - Move method to base class - * - ... - */ - export const RefactorRewrite: CodeActionKind = 'refactor.rewrite'; - - /** - * Base kind for source actions: `source`. - * - * Source code actions apply to the entire file. - */ - export const Source: CodeActionKind = 'source'; - - /** - * Base kind for an organize imports source action: - * `source.organizeImports`. - */ - export const SourceOrganizeImports: CodeActionKind = - 'source.organizeImports'; -} - -/** - * Contains additional diagnostic information about the context in which - * a code action is run. - */ -export interface CodeActionContext { - /** - * An array of diagnostics known on the client side overlapping the range - * provided to the `textDocument/codeAction` request. They are provided so - * that the server knows which errors are currently presented to the user - * for the given range. There is no guarantee that these accurately reflect - * the error state of the resource. The primary parameter - * to compute code actions is the provided range. - */ - diagnostics: Diagnostic[]; - - /** - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out by the client before being - * shown. So servers can omit computing them. - */ - only?: CodeActionKind[]; -} -``` - -_Response_: -* result: `(Command | CodeAction)[]` \| `null` where `CodeAction` is defined as follows: - -```typescript -/** - * A code action represents a change that can be performed in code, e.g. to fix - * a problem or to refactor code. - * - * A CodeAction must set either `edit` and/or a `command`. If both are supplied, - * the `edit` is applied first, then the `command` is executed. - */ -export interface CodeAction { - - /** - * A short, human-readable, title for this code action. - */ - title: string; - - /** - * The kind of the code action. - * - * Used to filter code actions. - */ - kind?: CodeActionKind; - - /** - * The diagnostics that this code action resolves. - */ - diagnostics?: Diagnostic[]; - - /** - * Marks this as a preferred action. Preferred actions are used by the - * `auto fix` command and can be targeted by keybindings. - * - * A quick fix should be marked preferred if it properly addresses the - * underlying error. A refactoring should be marked preferred if it is the - * most reasonable choice of actions to take. - * - * @since 3.15.0 - */ - isPreferred?: boolean; - - /** - * Marks that the code action cannot currently be applied. - * - * Clients should follow the following guidelines regarding disabled code - * actions: - * - * - Disabled code actions are not shown in automatic lightbulbs code - * action menus. - * - * - Disabled actions are shown as faded out in the code action menu when - * the user request a more specific type of code action, such as - * refactorings. - * - * - If the user has a keybinding that auto applies a code action and only - * a disabled code actions are returned, the client should show the user - * an error message with `reason` in the editor. - * - * @since 3.16.0 - */ - disabled?: { - - /** - * Human readable description of why the code action is currently - * disabled. - * - * This is displayed in the code actions UI. - */ - reason: string; - }; - - /** - * The workspace edit this code action performs. - */ - edit?: WorkspaceEdit; - - /** - * A command this code action executes. If a code action - * provides an edit and a command, first the edit is - * executed and then the command. - */ - command?: Command; - - /** - * A data entry field that is preserved on a code action between - * a `textDocument/codeAction` and a `codeAction/resolve` request. - * - * @since 3.16.0 - */ - data?: any; -} -``` -* partial result: `(Command | CodeAction)[]` -* error: code and message set in case an exception happens during the code action request. - -#### Code Action Resolve Request (:leftwards_arrow_with_hook:) - -> *Since version 3.16.0* - -The request is sent from the client to the server to resolve additional information for a given code action. This is usually used to compute -the `edit` property of a code action to avoid its unnecessary computation during the `textDocument/codeAction` request. - -Consider the clients announces the `edit` property as a property that can be resolved lazy using the client capability - -```typescript -textDocument.codeAction.resolveSupport = { properties: ['edit'] }; -``` - -then a code action - -```typescript -{ - "title": "Do Foo" -} -``` - -needs to be resolved using the `codeAction/resolve` request before it can be applied. - -_Client Capability_: -* property name (optional): `textDocument.codeAction.resolveSupport` -* property type: `{ properties: string[]; }` - -_Request_: -* method: 'codeAction/resolve' -* params: `CodeAction` - -_Response_: -* result: `CodeAction` -* error: code and message set in case an exception happens during the completion resolve request. - -#### Code Lens Request (:leftwards_arrow_with_hook:) - -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. - -#### Code Lens Resolve Request (:leftwards_arrow_with_hook:) - -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. - -#### Code Lens Refresh Request (:arrow_right_hook:) - -> *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 - -#### Document Link Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Link Resolve Request (:leftwards_arrow_with_hook:) - -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. - -#### Document Color Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The document color request is sent from the client to the server to list all color references found in a given text document. Along with the range, a color value in RGB is returned. - -Clients can use the result to decorate color references in an editor. For example: -- Color boxes showing the actual color next to the reference -- Show a color picker when a color reference is edited - -_Client Capability_: -* property name (optional): `textDocument.colorProvider` -* property type: `DocumentColorClientCapabilities` defined as follows: - -```typescript -export interface DocumentColorClientCapabilities { - /** - * Whether document color supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `colorProvider` -* property type: `boolean | DocumentColorOptions | DocumentColorRegistrationOptions` where `DocumentColorOptions` is defined as follows: - -```typescript -export interface DocumentColorOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentColorRegistrationOptions` defined as follows: -```typescript -export interface DocumentColorRegistrationOptions extends - TextDocumentRegistrationOptions, StaticRegistrationOptions, - DocumentColorOptions { -} -``` - -_Request_: - -* method: 'textDocument/documentColor' -* params: `DocumentColorParams` defined as follows - -```typescript -interface DocumentColorParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: -* result: `ColorInformation[]` defined as follows: - -```typescript -interface ColorInformation { - /** - * The range in the document where this color appears. - */ - range: Range; - - /** - * The actual color value for this color range. - */ - color: Color; -} - -/** - * Represents a color in RGBA space. - */ -interface Color { - - /** - * The red component of this color in the range [0-1]. - */ - readonly red: decimal; - - /** - * The green component of this color in the range [0-1]. - */ - readonly green: decimal; - - /** - * The blue component of this color in the range [0-1]. - */ - readonly blue: decimal; - - /** - * The alpha component of this color in the range [0-1]. - */ - readonly alpha: decimal; -} -``` -* partial result: `ColorInformation[]` -* error: code and message set in case an exception happens during the 'textDocument/documentColor' request - -#### Color Presentation Request (:leftwards_arrow_with_hook:) - -> *Since version 3.6.0* - -The color presentation request is sent from the client to the server to obtain a list of presentations for a color value at a given location. Clients can use the result to -- modify a color reference. -- show in a color picker and let users pick one of the presentations - -This request has no special capabilities and registration options since it is send as a resolve request for the `textDocument/documentColor` request. - -_Request_: - -* method: 'textDocument/colorPresentation' -* params: `ColorPresentationParams` defined as follows - -```typescript -interface ColorPresentationParams extends WorkDoneProgressParams, - PartialResultParams { - /** - * The text document. - */ - textDocument: TextDocumentIdentifier; - - /** - * The color information to request presentations for. - */ - color: Color; - - /** - * The range where the color would be inserted. Serves as a context. - */ - range: Range; -} -``` - -_Response_: -* result: `ColorPresentation[]` defined as follows: - -```typescript -interface ColorPresentation { - /** - * The label of this color presentation. It will be shown on the color - * picker header. By default this is also the text that is inserted when - * selecting this color presentation. - */ - label: string; - /** - * An [edit](#TextEdit) which is applied to a document when selecting - * this presentation for the color. When `falsy` the - * [label](#ColorPresentation.label) is used. - */ - textEdit?: TextEdit; - /** - * An optional array of additional [text edits](#TextEdit) that are applied - * when selecting this color presentation. Edits must not overlap with the - * main [edit](#ColorPresentation.textEdit) nor with themselves. - */ - additionalTextEdits?: TextEdit[]; -} -``` - -* partial result: `ColorPresentation[]` -* error: code and message set in case an exception happens during the 'textDocument/colorPresentation' request - -#### Document Formatting Request (:leftwards_arrow_with_hook:) - -The document formatting request is sent from the client to the server to format a whole document. - -_Client Capability_: -* property name (optional): `textDocument.formatting` -* property type: `DocumentFormattingClientCapabilities` defined as follows: - -```typescript -export interface DocumentFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentFormattingProvider` -* property type: `boolean | DocumentFormattingOptions` where `DocumentFormattingOptions` is defined as follows: - -```typescript -export interface DocumentFormattingOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: -```typescript -export interface DocumentFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentFormattingOptions { -} -``` - -_Request_: -* method: 'textDocument/formatting' -* params: `DocumentFormattingParams` defined as follows - -```typescript -interface DocumentFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The format options. - */ - options: FormattingOptions; -} - -/** - * Value-object describing what options formatting should use. - */ -interface FormattingOptions { - /** - * Size of a tab in spaces. - */ - tabSize: uinteger; - - /** - * Prefer spaces over tabs. - */ - insertSpaces: boolean; - - /** - * Trim trailing whitespace on a line. - * - * @since 3.15.0 - */ - trimTrailingWhitespace?: boolean; - - /** - * Insert a newline character at the end of the file if one does not exist. - * - * @since 3.15.0 - */ - insertFinalNewline?: boolean; - - /** - * Trim all newlines after the final newline at the end of the file. - * - * @since 3.15.0 - */ - trimFinalNewlines?: boolean; - - /** - * Signature for further properties. - */ - [key: string]: boolean | integer | string; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the formatting request. - -#### Document Range Formatting Request (:leftwards_arrow_with_hook:) - -The document range formatting request is sent from the client to the server to format a given range in a document. - -_Client Capability_: -* property name (optional): `textDocument.rangeFormatting` -* property type: `DocumentRangeFormattingClientCapabilities` defined as follows: - -```typescript -export interface DocumentRangeFormattingClientCapabilities { - /** - * Whether formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentRangeFormattingProvider` -* property type: `boolean | DocumentRangeFormattingOptions` where `DocumentRangeFormattingOptions` is defined as follows: - -```typescript -export interface DocumentRangeFormattingOptions extends - WorkDoneProgressOptions { -} -``` - -_Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows: -```typescript -export interface DocumentRangeFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentRangeFormattingOptions { -} -``` - -_Request_: -* method: 'textDocument/rangeFormatting', -* params: `DocumentRangeFormattingParams` defined as follows: - -```typescript -interface DocumentRangeFormattingParams extends WorkDoneProgressParams { - /** - * The document to format. - */ - textDocument: TextDocumentIdentifier; - - /** - * The range to format - */ - range: Range; - - /** - * The format options - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document to be formatted. -* error: code and message set in case an exception happens during the range formatting request. - -#### Document on Type Formatting Request (:leftwards_arrow_with_hook:) - -The document on type formatting request is sent from the client to the server to format parts of the document during typing. - -_Client Capability_: -* property name (optional): `textDocument.onTypeFormatting` -* property type: `DocumentOnTypeFormattingClientCapabilities` defined as follows: - -```typescript -export interface DocumentOnTypeFormattingClientCapabilities { - /** - * Whether on type formatting supports dynamic registration. - */ - dynamicRegistration?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `documentOnTypeFormattingProvider` -* property type: `DocumentOnTypeFormattingOptions` defined as follows: - -```typescript -export interface DocumentOnTypeFormattingOptions { - /** - * A character on which formatting should be triggered, like `}`. - */ - firstTriggerCharacter: string; - - /** - * More trigger characters. - */ - moreTriggerCharacter?: string[]; -} -``` - -_Registration Options_: `DocumentOnTypeFormattingRegistrationOptions` defined as follows: -```typescript -export interface DocumentOnTypeFormattingRegistrationOptions extends - TextDocumentRegistrationOptions, DocumentOnTypeFormattingOptions { -} -``` - -_Request_: -* method: 'textDocument/onTypeFormatting' -* params: `DocumentOnTypeFormattingParams` defined as follows: - -```typescript -interface DocumentOnTypeFormattingParams extends TextDocumentPositionParams { - /** - * The character that has been typed. - */ - ch: string; - - /** - * The format options. - */ - options: FormattingOptions; -} -``` - -_Response_: -* result: [`TextEdit[]`](#textEdit) \| `null` describing the modification to the document. -* error: code and message set in case an exception happens during the range formatting request. - -#### Rename Request (:leftwards_arrow_with_hook:) - -The rename request is sent from the client to the server to ask the server to compute a workspace change so that the client can perform a workspace-wide rename of a symbol. - -_Client Capability_: -* property name (optional): `textDocument.rename` -* property type: `RenameClientCapabilities` defined as follows: - -```typescript -export namespace PrepareSupportDefaultBehavior { - /** - * The client's default behavior is to select the identifier - * according to the language's syntax rule. - */ - export const Identifier: 1 = 1; -} -export interface RenameClientCapabilities { - /** - * Whether rename supports dynamic registration. - */ - dynamicRegistration?: boolean; - - /** - * Client supports testing for validity of rename operations - * before execution. - * - * @since 3.12.0 - */ - prepareSupport?: boolean; - - /** - * Client supports the default behavior result - * (`{ defaultBehavior: boolean }`). - * - * The value indicates the default behavior used by the - * client. - * - * @since 3.16.0 - */ - prepareSupportDefaultBehavior?: PrepareSupportDefaultBehavior; - - /** - * 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. - * - * @since 3.16.0 - */ - honorsChangeAnnotations?: boolean; -} -``` - -_Server Capability_: -* property name (optional): `renameProvider` -* property type: `boolean | RenameOptions` where `RenameOptions` is defined as follows: - -`RenameOptions` may only be specified if the client states that it supports `prepareSupport` in its initial `initialize` request. - -```typescript -export interface RenameOptions extends WorkDoneProgressOptions { - /** - * Renames should be checked and tested before being executed. - */ - prepareProvider?: boolean; -} -``` - -_Registration Options_: `RenameRegistrationOptions` defined as follows: -```typescript -export interface RenameRegistrationOptions extends - TextDocumentRegistrationOptions, RenameOptions { -} -``` - -_Request_: -* method: 'textDocument/rename' -* params: `RenameParams` defined as follows - -```typescript -interface RenameParams extends TextDocumentPositionParams, - WorkDoneProgressParams { - /** - * The new name of the symbol. If the given name is not valid the - * request must return a [ResponseError](#ResponseError) with an - * appropriate message set. - */ - newName: string; -} -``` - -_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. - -#### Prepare Rename Request (:leftwards_arrow_with_hook:) - -> *Since version 3.12.0* - -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' -* params: `PrepareRenameParams` defined as follows: -```typescript -export interface PrepareRenameParams extends TextDocumentPositionParams { -} -``` - -_Response_: -* 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. - -#### Folding Range Request (:leftwards_arrow_with_hook:) - -> *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 - -#### Selection Range Request (:leftwards_arrow_with_hook:) - -> *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 - -#### Prepare Call Hierarchy Request (:leftwards_arrow_with_hook:) - -> *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 - -#### Call Hierarchy Incoming Calls (:leftwards_arrow_with_hook:) - -> *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 - -#### Call Hierarchy Outgoing Calls (:leftwards_arrow_with_hook:) - -> *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 - -#### Semantic Tokens (:leftwards_arrow_with_hook:) - -> *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 - -#### Linked Editing Range(:leftwards_arrow_with_hook:) - -> *Since version 3.16.0* - -The linked editing request is sent from the client to the server to return for a given position in a document the range of the symbol at the position and all ranges that have the same content. Optionally a word pattern can be returned to describe valid contents. A rename to one of the ranges can be applied to all other ranges if the new content is valid. If no result-specific word pattern is provided, the word pattern from the client's language configuration is used. - -_Client Capabilities_: - -* property name (optional): `textDocument.linkedEditingRange` -* property type: `LinkedEditingRangeClientCapabilities` defined as follows: - -```typescript -export interface LinkedEditingRangeClientCapabilities { - /** - * Whether the 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): `linkedEditingRangeProvider` -* property type: `boolean` \| `LinkedEditingRangeOptions` \| `LinkedEditingRangeRegistrationOptions` defined as follows: - -```typescript -export interface LinkedEditingRangeOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `LinkedEditingRangeRegistrationOptions` defined as follows: - -```typescript -export interface LinkedEditingRangeRegistrationOptions extends - TextDocumentRegistrationOptions, LinkedEditingRangeOptions, - StaticRegistrationOptions { -} -``` - -_Request_: - -* method: `textDocument/linkedEditingRange` -* params: `LinkedEditingRangeParams` defined as follows: - -```typescript -export interface LinkedEditingRangeParams extends TextDocumentPositionParams, - WorkDoneProgressParams { -} -``` - -_Response_: - -* result: `LinkedEditingRanges` \| `null` defined as follows: - -```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. - */ - 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. - */ - wordPattern?: string; -} -``` -* error: code and message set in case an exception happens during the 'textDocument/linkedEditingRange' request - -#### Monikers (:leftwards_arrow_with_hook:) - -> *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: - -```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: - -```typescript -export interface MonikerOptions extends WorkDoneProgressOptions { -} -``` - -_Registration Options_: `MonikerRegistrationOptions` defined as follows: - -```typescript -export interface MonikerRegistrationOptions extends - TextDocumentRegistrationOptions, MonikerOptions { -} -``` - -_Request_: - -* method: `textDocument/moniker` -* params: `MonikerParams` defined as follows: - -```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: - -```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' -} - -/** - * 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' -} - -/** - * 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. - -### Implementation Considerations - -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: - -- if a client sends a request to the server and the client state changes in a way that it invalidates the response it should do the following: - - cancel the server request and ignore the result if the result is not useful for the client anymore. If necessary the client should resend the request. - - 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: - -- **stdio**: uses stdio as the communication channel. -- **pipe**: use pipes (Windows) or socket files (Linux, Mac) as the communication channel. The pipe / socket file name is passed as the next arg or with `--pipe=`. -- **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. - -### Change Log - -#### 3.16.0 (12/14/2020) - -* Add support for tracing. -* Add semantic token support. -* Add call hierarchy support. -* Add client capability for resolving text edits on completion items. -* Add support for client default behavior on renames. -* Add support for insert and replace ranges on `CompletionItem`. -* Add support for diagnostic code descriptions. -* Add support for document symbol provider label. -* Add support for tags on `SymbolInformation` and `DocumentSymbol`. -* Add support for moniker request method. -* Add support for code action `data` property. -* Add support for code action `disabled` property. -* Add support for code action resolve request. -* Add support for diagnostic `data` property. -* Add support for signature information `activeParameter` property. -* Add support for `workspace/didCreateFiles` notifications and `workspace/willCreateFiles` requests. -* Add support for `workspace/didRenameFiles` notifications and `workspace/willRenameFiles` requests. -* Add support for `workspace/didDeleteFiles` notifications and `workspace/willDeleteFiles` requests. -* Add client capability to signal whether the client normalizes line endings. -* Add support to preserve additional attributes on `MessageActionItem`. -* Add support to provide the clients locale in the initialize call. -* Add support for opening and showing a document in the client user interface. -* Add support for linked editing. -* Add support for change annotations in text edits as well as in create file, rename file and delete file operations. - -#### 3.15.0 (01/14/2020) - -* Add generic progress reporting support. -* Add specific work done progress reporting support to requests where applicable. -* Add specific partial result progress support to requests where applicable. -* Add support for `textDocument/selectionRange`. -* Add support for server and client information. -* Add signature help context. -* Add Erlang and Elixir to the list of supported programming languages -* Add `version` on `PublishDiagnosticsParams` -* Add `CodeAction#isPreferred` support. -* Add `CompletionItem#tag` support. -* Add `Diagnostic#tag` support. -* Add `DocumentLink#tooltip` support. -* Add `trimTrailingWhitespace`, `insertFinalNewline` and `trimFinalNewlines` to `FormattingOptions`. -* Clarified `WorkspaceSymbolParams#query` parameter. - - -#### 3.14.0 (12/13/2018) - -* Add support for signature label offsets. -* Add support for location links. -* Add support for `textDocument/declaration` request. - -#### 3.13.0 (9/11/2018) - -* Add support for file and folder operations (create, rename, move) to workspace edits. - -#### 3.12.0 (8/23/2018) - -* Add support for `textDocument/prepareRename` request. - -#### 3.11.0 (8/21/2018) - -* Add support for CodeActionOptions to allow a server to provide a list of code action it supports. - -#### 3.10.0 (7/23/2018) - -* Add support for hierarchical document symbols as a valid response to a `textDocument/documentSymbol` request. -* Add support for folding ranges as a valid response to a `textDocument/foldingRange` request. - -#### 3.9.0 (7/10/2018) - -* Add support for `preselect` property in `CompletionItem` - -#### 3.8.0 (6/11/2018) - -* Added support for CodeAction literals to the `textDocument/codeAction` request. -* ColorServerCapabilities.colorProvider can also be a boolean -* Corrected ColorPresentationParams.colorInfo to color (as in the `d.ts` and in implementations) - -#### 3.7.0 (4/5/2018) - -* Added support for related information to Diagnostics. - -#### 3.6.0 (2/22/2018) - -Merge the proposed protocol for workspace folders, configuration, go to type definition, go to implementation and document color provider into the main branch of the specification. For details see: - -* [Get Workspace Folders](https://microsoft.github.io/language-server-protocol/specification#workspace_workspaceFolders) -* [DidChangeWorkspaceFolders Notification](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeWorkspaceFolders) -* [Get Configuration](https://microsoft.github.io/language-server-protocol/specification#workspace_configuration) -* [Go to Type Definition](https://microsoft.github.io/language-server-protocol/specification#textDocument_typeDefinition) -* [Go to Implementation](https://microsoft.github.io/language-server-protocol/specification#textDocument_implementation) -* [Document Color](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor) -* [Color Presentation](https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation) - -In addition we enhanced the `CompletionTriggerKind` with a new value `TriggerForIncompleteCompletions: 3 = 3` to signal the a completion request got trigger since the last result was incomplete. - -#### 3.5.0 - -Decided to skip this version to bring the protocol version number in sync the with npm module vscode-languageserver-protocol. - -#### 3.4.0 (11/27/2017) - -* [extensible completion item and symbol kinds](https://github.com/Microsoft/language-server-protocol/issues/129) - -#### 3.3.0 (11/24/2017) - -* Added support for `CompletionContext` -* Added support for `MarkupContent` -* Removed old New and Updated markers. - -#### 3.2.0 (09/26/2017) - -* Added optional `commitCharacters` property to the `CompletionItem` - -#### 3.1.0 (02/28/2017) - -* Make the `WorkspaceEdit` changes backwards compatible. -* Updated the specification to correctly describe the breaking changes from 2.x to 3.x around `WorkspaceEdit`and `TextDocumentEdit`. - -#### 3.0 Version - -- add support for client feature flags to support that servers can adapt to different client capabilities. An example is the new `textDocument/willSaveWaitUntil` request which not all clients might be able to support. If the feature is disabled in the client capabilities sent on the initialize request, the server can't rely on receiving the request. -- add support to experiment with new features. The new `ClientCapabilities.experimental` section together with feature flags allow servers to provide experimental feature without the need of ALL clients to adopt them immediately. -- servers can more dynamically react to client features. Capabilities can now be registered and unregistered after the initialize request using the new `client/registerCapability` and `client/unregisterCapability`. This for example allows servers to react to settings or configuration changes without a restart. -- add support for `textDocument/willSave` notification and `textDocument/willSaveWaitUntil` request. -- add support for `textDocument/documentLink` request. -- add a `rootUri` property to the initializeParams in favor of the `rootPath` property. diff --git a/language-server-protocol/css/bootswatch/cosmo/bootstrap.min.css b/language-server-protocol/css/bootswatch/cosmo/bootstrap.min.css deleted file mode 100644 index b76d09c11..000000000 --- a/language-server-protocol/css/bootswatch/cosmo/bootstrap.min.css +++ /dev/null @@ -1,12 +0,0 @@ -/*! - * Bootswatch v4.0.0-beta.2 - * Homepage: https://bootswatch.com - * Copyright 2012-2017 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v4.0.0-beta.2 (https://getbootstrap.com) - * Copyright 2011-2017 The Bootstrap Authors - * Copyright 2011-2017 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700");:root{--blue:#2780E3;--indigo:#6610f2;--purple:#613d7c;--pink:#e83e8c;--red:#FF0039;--orange:#f0ad4e;--yellow:#FF7518;--green:#3FB618;--teal:#20c997;--cyan:#9954BB;--white:#fff;--gray:#868e96;--gray-dark:#373a3c;--primary:#2780E3;--secondary:#373a3c;--success:#3FB618;--info:#9954BB;--warning:#FF7518;--danger:#FF0039;--light:#f8f9fa;--dark:#373a3c;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Segoe UI", "Source Sans Pro", Calibri, Candara, Arial, sans-serif;--font-family-monospace:"SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}@media print{*,*::before,*::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Segoe UI", "Source Sans Pro", Calibri, Candara, Arial, sans-serif;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#373a3c;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:none !important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#2780E3;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#165ba8;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:monospace, monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}a,area,button,[role="button"],input:not([type="range"]),label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-family:inherit;font-weight:300;line-height:1.2;color:inherit}h1,.h1{font-size:2.34375rem}h2,.h2{font-size:1.875rem}h3,.h3{font-size:1.640625rem}h4,.h4{font-size:1.40625rem}h5,.h5{font-size:1.171875rem}h6,.h6{font-size:0.9375rem}.lead{font-size:1.171875rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:0.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.171875rem}.blockquote-footer{display:block;font-size:80%;color:#868e96}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:0.25rem;background-color:#fff;border:1px solid #ddd;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:0.5rem;line-height:1}.figure-caption{font-size:90%;color:#868e96}code,kbd,pre,samp{font-family:"SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}code{padding:0.2rem 0.4rem;font-size:90%;color:#bd4147;background-color:#f8f9fa}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:0.2rem 0.4rem;font-size:90%;color:#fff;background-color:#212529}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#212529}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table th,.table td{padding:0.75rem;vertical-align:top;border-top:1px solid #e9ecef}.table thead th{vertical-align:bottom;border-bottom:2px solid #e9ecef}.table tbody+tbody{border-top:2px solid #e9ecef}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #e9ecef}.table-bordered th,.table-bordered td{border:1px solid #e9ecef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c3dbf7}.table-hover .table-primary:hover{background-color:#adcef4}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#adcef4}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#c7c8c8}.table-hover .table-secondary:hover{background-color:#babbbb}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#babbbb}.table-success,.table-success>th,.table-success>td{background-color:#c9ebbe}.table-hover .table-success:hover{background-color:#b9e5ab}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b9e5ab}.table-info,.table-info>th,.table-info>td{background-color:#e2cfec}.table-hover .table-info:hover{background-color:#d7bde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#d7bde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffd8be}.table-hover .table-warning:hover{background-color:#ffc9a5}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffc9a5}.table-danger,.table-danger>th,.table-danger>td{background-color:#ffb8c8}.table-hover .table-danger:hover{background-color:#ff9fb4}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ff9fb4}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c7c8c8}.table-hover .table-dark:hover{background-color:#babbbb}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#babbbb}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#e9ecef}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,0.075)}@media (max-width: 575px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm.table-bordered{border:0}}@media (max-width: 767px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md.table-bordered{border:0}}@media (max-width: 991px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg.table-bordered{border:0}}@media (max-width: 1199px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}.form-control{display:block;width:100%;padding:0.375rem 0.75rem;font-size:0.9375rem;line-height:1.5;color:#495057;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid #ced4da;border-radius:0;-webkit-transition:border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#98c2f2;outline:none;-webkit-box-shadow:0 0 0 0.2rem rgba(39,128,227,0.25);box-shadow:0 0 0 0.2rem rgba(39,128,227,0.25)}.form-control::-webkit-input-placeholder{color:#868e96;opacity:1}.form-control:-ms-input-placeholder{color:#868e96;opacity:1}.form-control::-ms-input-placeholder{color:#868e96;opacity:1}.form-control::placeholder{color:#868e96;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.15625rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.171875rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.8203125rem;line-height:1.5}.col-form-legend{padding-top:0.375rem;padding-bottom:0.375rem;margin-bottom:0;font-size:0.9375rem}.form-control-plaintext{padding-top:0.375rem;padding-bottom:0.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.form-control-plaintext.input-group-addon,.input-group-sm>.input-group-btn>.form-control-plaintext.btn,.form-control-plaintext.form-control-lg,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.form-control-plaintext.input-group-addon,.input-group-lg>.input-group-btn>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5}select.form-control-sm:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]){height:calc(1.73046875rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5}select.form-control-lg:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]){height:calc(2.7578125rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:0.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;margin-bottom:0.5rem}.form-check.disabled .form-check-label{color:#868e96}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:0.25rem;margin-left:-1.25rem}.form-check-inline{display:inline-block;margin-right:0.75rem}.form-check-inline .form-check-label{vertical-align:middle}.valid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#3FB618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(63,182,24,0.8);border-radius:.2rem}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#3FB618}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(63,182,24,0.25);box-shadow:0 0 0 0.2rem rgba(63,182,24,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip,.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid+.form-check-label,.form-check-input.is-valid+.form-check-label{color:#3FB618}.was-validated .custom-control-input:valid ~ .custom-control-indicator,.custom-control-input.is-valid ~ .custom-control-indicator{background-color:rgba(63,182,24,0.25)}.was-validated .custom-control-input:valid ~ .custom-control-description,.custom-control-input.is-valid ~ .custom-control-description{color:#3FB618}.was-validated .custom-file-input:valid ~ .custom-file-control,.custom-file-input.is-valid ~ .custom-file-control{border-color:#3FB618}.was-validated .custom-file-input:valid ~ .custom-file-control::before,.custom-file-input.is-valid ~ .custom-file-control::before{border-color:inherit}.was-validated .custom-file-input:valid:focus,.custom-file-input.is-valid:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(63,182,24,0.25);box-shadow:0 0 0 0.2rem rgba(63,182,24,0.25)}.invalid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#FF0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(255,0,57,0.8);border-radius:.2rem}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#FF0039}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(255,0,57,0.25);box-shadow:0 0 0 0.2rem rgba(255,0,57,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip,.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid+.form-check-label,.form-check-input.is-invalid+.form-check-label{color:#FF0039}.was-validated .custom-control-input:invalid ~ .custom-control-indicator,.custom-control-input.is-invalid ~ .custom-control-indicator{background-color:rgba(255,0,57,0.25)}.was-validated .custom-control-input:invalid ~ .custom-control-description,.custom-control-input.is-invalid ~ .custom-control-description{color:#FF0039}.was-validated .custom-file-input:invalid ~ .custom-file-control,.custom-file-input.is-invalid ~ .custom-file-control{border-color:#FF0039}.was-validated .custom-file-input:invalid ~ .custom-file-control::before,.custom-file-input.is-invalid ~ .custom-file-control::before{border-color:inherit}.was-validated .custom-file-input:invalid:focus,.custom-file-input.is-invalid:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(255,0,57,0.25);box-shadow:0 0 0 0.2rem rgba(255,0,57,0.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:0.25rem;margin-left:0}.form-inline .custom-control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:0.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:0.375rem 0.75rem;font-size:0.9375rem;line-height:1.5;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(39,128,227,0.25);box-shadow:0 0 0 0.2rem rgba(39,128,227,0.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not([disabled]):not(.disabled):active,.btn:not([disabled]):not(.disabled).active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#2780E3;border-color:#2780E3}.btn-primary:hover{color:#fff;background-color:#1a6dca;border-color:#1967be}.btn-primary:focus,.btn-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5);box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#2780E3;border-color:#2780E3}.btn-primary:not([disabled]):not(.disabled):active,.btn-primary:not([disabled]):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1967be;border-color:#1761b3;-webkit-box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5);box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5)}.btn-secondary{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-secondary:hover{color:#fff;background-color:#252728;border-color:#1f2021}.btn-secondary:focus,.btn-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#373a3c;border-color:#373a3c}.btn-secondary:not([disabled]):not(.disabled):active,.btn-secondary:not([disabled]):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#1f2021;border-color:#191a1b;-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-success{color:#fff;background-color:#3FB618;border-color:#3FB618}.btn-success:hover{color:#fff;background-color:#339414;border-color:#2f8912}.btn-success:focus,.btn-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5);box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5)}.btn-success.disabled,.btn-success:disabled{background-color:#3FB618;border-color:#3FB618}.btn-success:not([disabled]):not(.disabled):active,.btn-success:not([disabled]):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#2f8912;border-color:#2c7e11;-webkit-box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5);box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5)}.btn-info{color:#fff;background-color:#9954BB;border-color:#9954BB}.btn-info:hover{color:#fff;background-color:#8542a7;border-color:#7e3f9d}.btn-info:focus,.btn-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5);box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5)}.btn-info.disabled,.btn-info:disabled{background-color:#9954BB;border-color:#9954BB}.btn-info:not([disabled]):not(.disabled):active,.btn-info:not([disabled]):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#7e3f9d;border-color:#773b94;-webkit-box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5);box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5)}.btn-warning{color:#fff;background-color:#FF7518;border-color:#FF7518}.btn-warning:hover{color:#fff;background-color:#f16100;border-color:#e45c00}.btn-warning:focus,.btn-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5);box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#FF7518;border-color:#FF7518}.btn-warning:not([disabled]):not(.disabled):active,.btn-warning:not([disabled]):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#e45c00;border-color:#d75700;-webkit-box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5);box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5)}.btn-danger{color:#fff;background-color:#FF0039;border-color:#FF0039}.btn-danger:hover{color:#fff;background-color:#d90030;border-color:#cc002e}.btn-danger:focus,.btn-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5);box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#FF0039;border-color:#FF0039}.btn-danger:not([disabled]):not(.disabled):active,.btn-danger:not([disabled]):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#cc002e;border-color:#bf002b;-webkit-box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5);box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5)}.btn-light{color:#111;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#111;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not([disabled]):not(.disabled):active,.btn-light:not([disabled]):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#111;background-color:#dae0e5;border-color:#d3d9df;-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-dark{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-dark:hover{color:#fff;background-color:#252728;border-color:#1f2021}.btn-dark:focus,.btn-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#373a3c;border-color:#373a3c}.btn-dark:not([disabled]):not(.disabled):active,.btn-dark:not([disabled]):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1f2021;border-color:#191a1b;-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-outline-primary{color:#2780E3;background-color:transparent;background-image:none;border-color:#2780E3}.btn-outline-primary:hover{color:#fff;background-color:#2780E3;border-color:#2780E3}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5);box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#2780E3;background-color:transparent}.btn-outline-primary:not([disabled]):not(.disabled):active,.btn-outline-primary:not([disabled]):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#2780E3;border-color:#2780E3;-webkit-box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5);box-shadow:0 0 0 0.2rem rgba(39,128,227,0.5)}.btn-outline-secondary{color:#373a3c;background-color:transparent;background-image:none;border-color:#373a3c}.btn-outline-secondary:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#373a3c;background-color:transparent}.btn-outline-secondary:not([disabled]):not(.disabled):active,.btn-outline-secondary:not([disabled]):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#373a3c;border-color:#373a3c;-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-outline-success{color:#3FB618;background-color:transparent;background-image:none;border-color:#3FB618}.btn-outline-success:hover{color:#fff;background-color:#3FB618;border-color:#3FB618}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5);box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#3FB618;background-color:transparent}.btn-outline-success:not([disabled]):not(.disabled):active,.btn-outline-success:not([disabled]):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#3FB618;border-color:#3FB618;-webkit-box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5);box-shadow:0 0 0 0.2rem rgba(63,182,24,0.5)}.btn-outline-info{color:#9954BB;background-color:transparent;background-image:none;border-color:#9954BB}.btn-outline-info:hover{color:#fff;background-color:#9954BB;border-color:#9954BB}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5);box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#9954BB;background-color:transparent}.btn-outline-info:not([disabled]):not(.disabled):active,.btn-outline-info:not([disabled]):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#9954BB;border-color:#9954BB;-webkit-box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5);box-shadow:0 0 0 0.2rem rgba(153,84,187,0.5)}.btn-outline-warning{color:#FF7518;background-color:transparent;background-image:none;border-color:#FF7518}.btn-outline-warning:hover{color:#fff;background-color:#FF7518;border-color:#FF7518}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5);box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#FF7518;background-color:transparent}.btn-outline-warning:not([disabled]):not(.disabled):active,.btn-outline-warning:not([disabled]):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#FF7518;border-color:#FF7518;-webkit-box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5);box-shadow:0 0 0 0.2rem rgba(255,117,24,0.5)}.btn-outline-danger{color:#FF0039;background-color:transparent;background-image:none;border-color:#FF0039}.btn-outline-danger:hover{color:#fff;background-color:#FF0039;border-color:#FF0039}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5);box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#FF0039;background-color:transparent}.btn-outline-danger:not([disabled]):not(.disabled):active,.btn-outline-danger:not([disabled]):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#FF0039;border-color:#FF0039;-webkit-box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5);box-shadow:0 0 0 0.2rem rgba(255,0,57,0.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not([disabled]):not(.disabled):active,.btn-outline-light:not([disabled]):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa;-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-dark{color:#373a3c;background-color:transparent;background-image:none;border-color:#373a3c}.btn-outline-dark:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#373a3c;background-color:transparent}.btn-outline-dark:not([disabled]):not(.disabled):active,.btn-outline-dark:not([disabled]):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#373a3c;border-color:#373a3c;-webkit-box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5);box-shadow:0 0 0 0.2rem rgba(55,58,60,0.5)}.btn-link{font-weight:400;color:#2780E3;background-color:transparent}.btn-link:hover{color:#165ba8;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#868e96}.btn-lg,.btn-group-lg>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5}.btn-sm,.btn-group-sm>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:0.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}.dropup,.dropdown{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid;border-right:0.3em solid transparent;border-bottom:0;border-left:0.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0.5rem 0;margin:0.125rem 0 0;font-size:0.9375rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15)}.dropup .dropdown-menu{margin-top:0;margin-bottom:0.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0;border-right:0.3em solid transparent;border-bottom:0.3em solid;border-left:0.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropdown-divider{height:0;margin:0.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:0.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background:none;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#2780E3}.dropdown-item.disabled,.dropdown-item:disabled{color:#868e96;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0.5rem 1.5rem;margin-bottom:0;font-size:0.8203125rem;color:#868e96;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:2}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn+.dropdown-toggle-split{padding-right:0.5625rem;padding-left:0.5625rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group .form-control{position:relative;z-index:2;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:focus,.input-group .form-control:active,.input-group .form-control:hover{z-index:3}.input-group-addon,.input-group-btn,.input-group .form-control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group-addon,.input-group-btn{white-space:nowrap}.input-group-addon{padding:0.375rem 0.75rem;margin-bottom:0;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;background-color:#e9ecef;border:1px solid #ced4da}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:0.5rem 1rem;font-size:1.171875rem}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group-addon:not(:last-child){border-right:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:focus,.input-group-btn>.btn:active,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:first-child>.btn+.btn{margin-left:0}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:0}.input-group-btn:not(:first-child)>.btn:first-child,.input-group-btn:not(:first-child)>.btn-group:first-child{margin-left:-1px}.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:hover,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:hover{z-index:3}.custom-control{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-indicator{color:#fff;background-color:#2780E3}.custom-control-input:focus ~ .custom-control-indicator{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(39,128,227,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(39,128,227,0.25)}.custom-control-input:active ~ .custom-control-indicator{color:#fff;background-color:#c5ddf7}.custom-control-input:disabled ~ .custom-control-indicator{background-color:#e9ecef}.custom-control-input:disabled ~ .custom-control-description{color:#868e96}.custom-control-indicator{position:absolute;top:0.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator{background-color:#2780E3;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:0.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.15625rem + 2px);padding:0.375rem 1.75rem 0.375rem 0.75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#98c2f2;outline:none}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple]{height:auto;background-image:none}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.73046875rem + 2px);padding-top:0.375rem;padding-bottom:0.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:calc(2.15625rem + 2px);margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:calc(2.15625rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{-webkit-box-shadow:0 0 0 0.075rem #fff, 0 0 0 0.2rem #2780E3;box-shadow:0 0 0 0.075rem #fff, 0 0 0 0.2rem #2780E3}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:calc(2.15625rem + 2px);padding:0.375rem 0.75rem;line-height:1.5;color:#495057;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid #ced4da}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:calc(2.15625rem + 2px);padding:0.375rem 0.75rem;line-height:1.5;color:#495057;background-color:#e9ecef;border:1px solid #ced4da}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:0.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#868e96}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.nav-tabs .nav-link.disabled{color:#868e96;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#2780E3}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:0.32421875rem;padding-bottom:0.32421875rem;margin-right:1rem;font-size:1.171875rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:0.5rem;padding-bottom:0.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:0.25rem 0.75rem;font-size:1.171875rem;line-height:1;background:transparent;border:1px solid transparent}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 767px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 991px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 1199px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:white}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125)}.card>hr{margin-right:0;margin-left:0}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:0.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%}.card-img-top{width:100%}.card-img-bottom{width:100%}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group .card{margin-bottom:15px}@media (min-width: 576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group .card+.card{margin-left:0;border-left:0}}.card-columns .card{margin-bottom:0.75rem}@media (min-width: 576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:0.5rem;padding-left:0.5rem;color:#868e96;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#868e96}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none}.page-item:first-child .page-link{margin-left:0}.page-item.active .page-link{z-index:2;color:#fff;background-color:#2780E3;border-color:#2780E3}.page-item.disabled .page-link{color:#868e96;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:0.5rem 0.75rem;margin-left:-1px;line-height:1.25;color:#2780E3;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#165ba8;text-decoration:none;background-color:#e9ecef;border-color:#ddd}.pagination-lg .page-link{padding:0.75rem 1.5rem;font-size:1.171875rem;line-height:1.5}.pagination-sm .page-link{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5}.badge{display:inline-block;padding:0.25em 0.4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:0.6em;padding-left:0.6em}.badge-primary{color:#fff;background-color:#2780E3}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#1967be}.badge-secondary{color:#fff;background-color:#373a3c}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#1f2021}.badge-success{color:#fff;background-color:#3FB618}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#2f8912}.badge-info{color:#fff;background-color:#9954BB}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#7e3f9d}.badge-warning{color:#fff;background-color:#FF7518}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#fff;text-decoration:none;background-color:#e45c00}.badge-danger{color:#fff;background-color:#FF0039}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#cc002e}.badge-light{color:#111;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#111;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#373a3c}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1f2021}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0}.alert{position:relative;padding:0.75rem 1.25rem;margin-bottom:1rem;border:0 solid transparent}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:absolute;top:0;right:0;padding:0.75rem 1.25rem;color:inherit}.alert-primary{color:#144376;background-color:#d4e6f9;border-color:#c3dbf7}.alert-primary hr{border-top-color:#adcef4}.alert-primary .alert-link{color:#0d2a4a}.alert-secondary{color:#1d1e1f;background-color:#d7d8d8;border-color:#c7c8c8}.alert-secondary hr{border-top-color:#babbbb}.alert-secondary .alert-link{color:#040505}.alert-success{color:#215f0c;background-color:#d9f0d1;border-color:#c9ebbe}.alert-success hr{border-top-color:#b9e5ab}.alert-success .alert-link{color:#113206}.alert-info{color:#502c61;background-color:#ebddf1;border-color:#e2cfec}.alert-info hr{border-top-color:#d7bde5}.alert-info .alert-link{color:#331c3e}.alert-warning{color:#853d0c;background-color:#ffe3d1;border-color:#ffd8be}.alert-warning hr{border-top-color:#ffc9a5}.alert-warning .alert-link{color:#562808}.alert-danger{color:#85001e;background-color:#ffccd7;border-color:#ffb8c8}.alert-danger hr{border-top-color:#ff9fb4}.alert-danger .alert-link{color:#520012}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1d1e1f;background-color:#d7d8d8;border-color:#c7c8c8}.alert-dark hr{border-top-color:#babbbb}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:8px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:8px 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:8px;overflow:hidden;font-size:0.703125rem;background-color:#e9ecef}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;background-color:#2780E3}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:8px 8px}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#373a3c;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:0.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:last-child{margin-bottom:0}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#868e96;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#2780E3;border-color:#2780E3}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#144376;background-color:#c3dbf7}a.list-group-item-primary,button.list-group-item-primary{color:#144376}a.list-group-item-primary:focus,a.list-group-item-primary:hover,button.list-group-item-primary:focus,button.list-group-item-primary:hover{color:#144376;background-color:#adcef4}a.list-group-item-primary.active,button.list-group-item-primary.active{color:#fff;background-color:#144376;border-color:#144376}.list-group-item-secondary{color:#1d1e1f;background-color:#c7c8c8}a.list-group-item-secondary,button.list-group-item-secondary{color:#1d1e1f}a.list-group-item-secondary:focus,a.list-group-item-secondary:hover,button.list-group-item-secondary:focus,button.list-group-item-secondary:hover{color:#1d1e1f;background-color:#babbbb}a.list-group-item-secondary.active,button.list-group-item-secondary.active{color:#fff;background-color:#1d1e1f;border-color:#1d1e1f}.list-group-item-success{color:#215f0c;background-color:#c9ebbe}a.list-group-item-success,button.list-group-item-success{color:#215f0c}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#215f0c;background-color:#b9e5ab}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#215f0c;border-color:#215f0c}.list-group-item-info{color:#502c61;background-color:#e2cfec}a.list-group-item-info,button.list-group-item-info{color:#502c61}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#502c61;background-color:#d7bde5}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#502c61;border-color:#502c61}.list-group-item-warning{color:#853d0c;background-color:#ffd8be}a.list-group-item-warning,button.list-group-item-warning{color:#853d0c}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#853d0c;background-color:#ffc9a5}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#853d0c;border-color:#853d0c}.list-group-item-danger{color:#85001e;background-color:#ffb8c8}a.list-group-item-danger,button.list-group-item-danger{color:#85001e}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#85001e;background-color:#ff9fb4}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#85001e;border-color:#85001e}.list-group-item-light{color:#818182;background-color:#fdfdfe}a.list-group-item-light,button.list-group-item-light{color:#818182}a.list-group-item-light:focus,a.list-group-item-light:hover,button.list-group-item-light:focus,button.list-group-item-light:hover{color:#818182;background-color:#ececf6}a.list-group-item-light.active,button.list-group-item-light.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1d1e1f;background-color:#c7c8c8}a.list-group-item-dark,button.list-group-item-dark{color:#1d1e1f}a.list-group-item-dark:focus,a.list-group-item-dark:hover,button.list-group-item-dark:focus,button.list-group-item-dark:hover{color:#1d1e1f;background-color:#babbbb}a.list-group-item-dark.active,button.list-group-item-dark.active{color:#fff;background-color:#1d1e1f;border-color:#1d1e1f}.close{float:right;font-size:1.40625rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform 0.3s ease-out;transition:-webkit-transform 0.3s ease-out;transition:transform 0.3s ease-out;transition:transform 0.3s ease-out, -webkit-transform 0.3s ease-out;-webkit-transform:translate(0, -25%);transform:translate(0, -25%)}.modal.show .modal-dialog{-webkit-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px;pointer-events:none}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:0.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #e9ecef}.modal-header .close{padding:15px;margin:-15px -15px -15px auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Segoe UI", "Source Sans Pro", Calibri, Candara, Arial, sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:0.9}.tooltip .arrow{position:absolute;display:block;width:5px;height:5px}.tooltip .arrow::before{position:absolute;border-color:transparent;border-style:solid}.tooltip.bs-tooltip-top,.tooltip.bs-tooltip-auto[x-placement^="top"]{padding:5px 0}.tooltip.bs-tooltip-top .arrow,.tooltip.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.tooltip.bs-tooltip-top .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before{margin-left:-3px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tooltip-right,.tooltip.bs-tooltip-auto[x-placement^="right"]{padding:0 5px}.tooltip.bs-tooltip-right .arrow,.tooltip.bs-tooltip-auto[x-placement^="right"] .arrow{left:0}.tooltip.bs-tooltip-right .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="right"] .arrow::before{margin-top:-3px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tooltip-bottom,.tooltip.bs-tooltip-auto[x-placement^="bottom"]{padding:5px 0}.tooltip.bs-tooltip-bottom .arrow,.tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.tooltip.bs-tooltip-bottom .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{margin-left:-3px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tooltip-left,.tooltip.bs-tooltip-auto[x-placement^="left"]{padding:0 5px}.tooltip.bs-tooltip-left .arrow,.tooltip.bs-tooltip-auto[x-placement^="left"] .arrow{right:0}.tooltip.bs-tooltip-left .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="left"] .arrow::before{right:0;margin-top:-3px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Segoe UI", "Source Sans Pro", Calibri, Candara, Arial, sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2)}.popover .arrow{position:absolute;display:block;width:0.8rem;height:0.4rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;border-color:transparent;border-style:solid}.popover .arrow::before{content:"";border-width:0.8rem}.popover .arrow::after{content:"";border-width:0.8rem}.popover.bs-popover-top,.popover.bs-popover-auto[x-placement^="top"]{margin-bottom:0.8rem}.popover.bs-popover-top .arrow,.popover.bs-popover-auto[x-placement^="top"] .arrow{bottom:0}.popover.bs-popover-top .arrow::before,.popover.bs-popover-auto[x-placement^="top"] .arrow::before,.popover.bs-popover-top .arrow::after,.popover.bs-popover-auto[x-placement^="top"] .arrow::after{border-bottom-width:0}.popover.bs-popover-top .arrow::before,.popover.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:-0.8rem;margin-left:-0.8rem;border-top-color:rgba(0,0,0,0.25)}.popover.bs-popover-top .arrow::after,.popover.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:calc((0.8rem - 1px) * -1);margin-left:-0.8rem;border-top-color:#fff}.popover.bs-popover-right,.popover.bs-popover-auto[x-placement^="right"]{margin-left:0.8rem}.popover.bs-popover-right .arrow,.popover.bs-popover-auto[x-placement^="right"] .arrow{left:0}.popover.bs-popover-right .arrow::before,.popover.bs-popover-auto[x-placement^="right"] .arrow::before,.popover.bs-popover-right .arrow::after,.popover.bs-popover-auto[x-placement^="right"] .arrow::after{margin-top:-0.8rem;border-left-width:0}.popover.bs-popover-right .arrow::before,.popover.bs-popover-auto[x-placement^="right"] .arrow::before{left:-0.8rem;border-right-color:rgba(0,0,0,0.25)}.popover.bs-popover-right .arrow::after,.popover.bs-popover-auto[x-placement^="right"] .arrow::after{left:calc((0.8rem - 1px) * -1);border-right-color:#fff}.popover.bs-popover-bottom,.popover.bs-popover-auto[x-placement^="bottom"]{margin-top:0.8rem}.popover.bs-popover-bottom .arrow,.popover.bs-popover-auto[x-placement^="bottom"] .arrow{top:0}.popover.bs-popover-bottom .arrow::before,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::before,.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::after{margin-left:-0.8rem;border-top-width:0}.popover.bs-popover-bottom .arrow::before,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:-0.8rem;border-bottom-color:rgba(0,0,0,0.25)}.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:calc((0.8rem - 1px) * -1);border-bottom-color:#fff}.popover.bs-popover-bottom .popover-header::before,.popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-popover-left,.popover.bs-popover-auto[x-placement^="left"]{margin-right:0.8rem}.popover.bs-popover-left .arrow,.popover.bs-popover-auto[x-placement^="left"] .arrow{right:0}.popover.bs-popover-left .arrow::before,.popover.bs-popover-auto[x-placement^="left"] .arrow::before,.popover.bs-popover-left .arrow::after,.popover.bs-popover-auto[x-placement^="left"] .arrow::after{margin-top:-0.8rem;border-right-width:0}.popover.bs-popover-left .arrow::before,.popover.bs-popover-auto[x-placement^="left"] .arrow::before{right:-0.8rem;border-left-color:rgba(0,0,0,0.25)}.popover.bs-popover-left .arrow::after,.popover.bs-popover-auto[x-placement^="left"] .arrow::after{right:calc((0.8rem - 1px) * -1);border-left-color:#fff}.popover-header{padding:0.5rem 0.75rem;margin-bottom:0;font-size:0.9375rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb}.popover-header:empty{display:none}.popover-body{padding:0.5rem 0.75rem;color:#373a3c}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-transition:-webkit-transform 0.6s ease;transition:-webkit-transform 0.6s ease;transition:transform 0.6s ease;transition:transform 0.6s ease, -webkit-transform 0.6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}}.carousel-item-next,.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d){.carousel-item-next,.active.carousel-item-right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}}.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d){.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:0.5}.carousel-control-prev:focus,.carousel-control-prev:hover,.carousel-control-next:focus,.carousel-control-next:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,0.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#2780E3 !important}a.bg-primary:focus,a.bg-primary:hover{background-color:#1967be !important}.bg-secondary{background-color:#373a3c !important}a.bg-secondary:focus,a.bg-secondary:hover{background-color:#1f2021 !important}.bg-success{background-color:#3FB618 !important}a.bg-success:focus,a.bg-success:hover{background-color:#2f8912 !important}.bg-info{background-color:#9954BB !important}a.bg-info:focus,a.bg-info:hover{background-color:#7e3f9d !important}.bg-warning{background-color:#FF7518 !important}a.bg-warning:focus,a.bg-warning:hover{background-color:#e45c00 !important}.bg-danger{background-color:#FF0039 !important}a.bg-danger:focus,a.bg-danger:hover{background-color:#cc002e !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:focus,a.bg-light:hover{background-color:#dae0e5 !important}.bg-dark{background-color:#373a3c !important}a.bg-dark:focus,a.bg-dark:hover{background-color:#1f2021 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #e9ecef !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#2780E3 !important}.border-secondary{border-color:#373a3c !important}.border-success{border-color:#3FB618 !important}.border-info{border-color:#9954BB !important}.border-warning{border-color:#FF7518 !important}.border-danger{border-color:#FF0039 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#373a3c !important}.border-white{border-color:#fff !important}.rounded{border-radius:0.25rem !important}.rounded-top{border-top-left-radius:0.25rem !important;border-top-right-radius:0.25rem !important}.rounded-right{border-top-right-radius:0.25rem !important;border-bottom-right-radius:0.25rem !important}.rounded-bottom{border-bottom-right-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-left{border-top-left-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.d-print-block{display:none !important}@media print{.d-print-block{display:block !important}}.d-print-inline{display:none !important}@media print{.d-print-inline{display:inline !important}}.d-print-inline-block{display:none !important}@media print{.d-print-inline-block{display:inline-block !important}}@media print{.d-print-none{display:none !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: -webkit-sticky) or (position: sticky){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:0.25rem !important}.mt-1,.my-1{margin-top:0.25rem !important}.mr-1,.mx-1{margin-right:0.25rem !important}.mb-1,.my-1{margin-bottom:0.25rem !important}.ml-1,.mx-1{margin-left:0.25rem !important}.m-2{margin:0.5rem !important}.mt-2,.my-2{margin-top:0.5rem !important}.mr-2,.mx-2{margin-right:0.5rem !important}.mb-2,.my-2{margin-bottom:0.5rem !important}.ml-2,.mx-2{margin-left:0.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:0.25rem !important}.pt-1,.py-1{padding-top:0.25rem !important}.pr-1,.px-1{padding-right:0.25rem !important}.pb-1,.py-1{padding-bottom:0.25rem !important}.pl-1,.px-1{padding-left:0.25rem !important}.p-2{padding:0.5rem !important}.pt-2,.py-2{padding-top:0.5rem !important}.pr-2,.px-2{padding-right:0.5rem !important}.pb-2,.py-2{padding-bottom:0.5rem !important}.pl-2,.px-2{padding-left:0.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:0.25rem !important}.mt-sm-1,.my-sm-1{margin-top:0.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:0.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:0.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:0.25rem !important}.m-sm-2{margin:0.5rem !important}.mt-sm-2,.my-sm-2{margin-top:0.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:0.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:0.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:0.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:0.25rem !important}.pt-sm-1,.py-sm-1{padding-top:0.25rem !important}.pr-sm-1,.px-sm-1{padding-right:0.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:0.25rem !important}.pl-sm-1,.px-sm-1{padding-left:0.25rem !important}.p-sm-2{padding:0.5rem !important}.pt-sm-2,.py-sm-2{padding-top:0.5rem !important}.pr-sm-2,.px-sm-2{padding-right:0.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:0.5rem !important}.pl-sm-2,.px-sm-2{padding-left:0.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:0.25rem !important}.mt-md-1,.my-md-1{margin-top:0.25rem !important}.mr-md-1,.mx-md-1{margin-right:0.25rem !important}.mb-md-1,.my-md-1{margin-bottom:0.25rem !important}.ml-md-1,.mx-md-1{margin-left:0.25rem !important}.m-md-2{margin:0.5rem !important}.mt-md-2,.my-md-2{margin-top:0.5rem !important}.mr-md-2,.mx-md-2{margin-right:0.5rem !important}.mb-md-2,.my-md-2{margin-bottom:0.5rem !important}.ml-md-2,.mx-md-2{margin-left:0.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:0.25rem !important}.pt-md-1,.py-md-1{padding-top:0.25rem !important}.pr-md-1,.px-md-1{padding-right:0.25rem !important}.pb-md-1,.py-md-1{padding-bottom:0.25rem !important}.pl-md-1,.px-md-1{padding-left:0.25rem !important}.p-md-2{padding:0.5rem !important}.pt-md-2,.py-md-2{padding-top:0.5rem !important}.pr-md-2,.px-md-2{padding-right:0.5rem !important}.pb-md-2,.py-md-2{padding-bottom:0.5rem !important}.pl-md-2,.px-md-2{padding-left:0.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:0.25rem !important}.mt-lg-1,.my-lg-1{margin-top:0.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:0.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:0.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:0.25rem !important}.m-lg-2{margin:0.5rem !important}.mt-lg-2,.my-lg-2{margin-top:0.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:0.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:0.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:0.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:0.25rem !important}.pt-lg-1,.py-lg-1{padding-top:0.25rem !important}.pr-lg-1,.px-lg-1{padding-right:0.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:0.25rem !important}.pl-lg-1,.px-lg-1{padding-left:0.25rem !important}.p-lg-2{padding:0.5rem !important}.pt-lg-2,.py-lg-2{padding-top:0.5rem !important}.pr-lg-2,.px-lg-2{padding-right:0.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:0.5rem !important}.pl-lg-2,.px-lg-2{padding-left:0.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:0.25rem !important}.mt-xl-1,.my-xl-1{margin-top:0.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:0.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:0.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:0.25rem !important}.m-xl-2{margin:0.5rem !important}.mt-xl-2,.my-xl-2{margin-top:0.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:0.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:0.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:0.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:0.25rem !important}.pt-xl-1,.py-xl-1{padding-top:0.25rem !important}.pr-xl-1,.px-xl-1{padding-right:0.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:0.25rem !important}.pl-xl-1,.px-xl-1{padding-left:0.25rem !important}.p-xl-2{padding:0.5rem !important}.pt-xl-2,.py-xl-2{padding-top:0.5rem !important}.pr-xl-2,.px-xl-2{padding-right:0.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:0.5rem !important}.pl-xl-2,.px-xl-2{padding-left:0.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#2780E3 !important}a.text-primary:focus,a.text-primary:hover{color:#1967be !important}.text-secondary{color:#373a3c !important}a.text-secondary:focus,a.text-secondary:hover{color:#1f2021 !important}.text-success{color:#3FB618 !important}a.text-success:focus,a.text-success:hover{color:#2f8912 !important}.text-info{color:#9954BB !important}a.text-info:focus,a.text-info:hover{color:#7e3f9d !important}.text-warning{color:#FF7518 !important}a.text-warning:focus,a.text-warning:hover{color:#e45c00 !important}.text-danger{color:#FF0039 !important}a.text-danger:focus,a.text-danger:hover{color:#cc002e !important}.text-light{color:#f8f9fa !important}a.text-light:focus,a.text-light:hover{color:#dae0e5 !important}.text-dark{color:#373a3c !important}a.text-dark:focus,a.text-dark:hover{color:#1f2021 !important}.text-muted{color:#868e96 !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}body{-webkit-font-smoothing:antialiased}.progress .progress-bar{font-size:8px;line-height:8px} diff --git a/language-server-protocol/css/fontawesome-all.min.css b/language-server-protocol/css/fontawesome-all.min.css deleted file mode 100644 index fac6746c6..000000000 --- a/language-server-protocol/css/fontawesome-all.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Font Awesome Free 5.0.1 by @fontawesome - http://fontawesome.com - * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-amazon:before{content:"\f270"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dot-circle:before{content:"\f192"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-print:before{content:"\f02f"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-table:before{content:"\f0ce"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/language-server-protocol/css/main.scss b/language-server-protocol/css/main.scss deleted file mode 100644 index 4505a78cb..000000000 --- a/language-server-protocol/css/main.scss +++ /dev/null @@ -1,515 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- -@charset "utf-8"; - -html { - position: relative; - min-height: 100%; -} - -body { - letter-spacing: .25px; - text-rendering: optimizeLegibility; -} - -a { - color: #216fc9 -} - -.single-page { - padding: 40px 0; -} - -.bg-primary { - background-color: #2753e3 !important; - } - -.header-container { - color: #fff; - - @media (min-width: 576px) { - margin-bottom: 80px; - } - - h1 { - margin-top: 15px; - font-weight: bold; - } - - .intro { - text-align: center; - } - - .intro-text { - margin: 0 auto; - max-width: 650px; - text-align: center; - } -} - -h2 { - margin-bottom: 20px; -} - -table.table-responsive.table-bordered { - display: table; - & thead > tr { - border: none; - & > th { - position: sticky; - position: -webkit-sticky; - position: -moz-sticky; - position: -ms-sticky; - position: -o-sticky; - top: 3rem; // 2.5rem for the header's height + padding, - // +.5rem for the tr's own padding - background: #fff; - outline: 1px solid #e9ecef; - } - } -} - -.toc { - font-size: 85% -} - -.toc-title { - padding-left: 0.5rem -} - -.toc-h1 { - padding-top: 0.5rem; - padding-left: 0.5rem; - margin-bottom: 0; -} - -.toc-link { - padding: 0.125rem 0.5rem; - color: #707070 -} - -.anchor { - display: block; -} - -pre[class=highlight] { - tab-size: 4ch; - padding: 9.5px; - overflow: auto; - font-size: 85%; - line-height: 1.45; - background-color: #f6f8fa; - border: 1px solid #ccc; - border-radius: 4px; - background: #f6f8fa -} - -.highlight .hll { - background-color: #EFEFEF -} - -.highlight .c { - color: #525151 -} - -.highlight .err { - color: #525151 -} - -.highlight .k { - color: #8959A8 -} - -.highlight .l { - color: #85450A -} - -.highlight .n { - color: #525151 -} - -.highlight .o { - color: #545454 -} - -.highlight .p { - color: #525151 -} - -.highlight .cm { - color: #525151 -} - -.highlight .cp { - color: #525151 -} - -.highlight .c1 { - color: #525151 -} - -.highlight .cs { - color: #525151 -} - -.highlight .gd { - color: #C82829 -} - -.highlight .ge { - font-style: italic -} - -.highlight .gh { - color: #545454; - font-weight: bold -} - -.highlight .gi { - color: #5b7201 -} - -.highlight .gp { - color: #5b7201; - font-weight: bold -} - -.highlight .gs { - font-weight: bold -} - -.highlight .gu { - color: #3E999F; - font-weight: bold -} - -.highlight .kc { - color: #8959A8 -} - -.highlight .kd { - color: #8959A8 -} - -.highlight .kn { - color: #3E999F -} - -.highlight .kp { - color: #4271AE -} - -.highlight .kr { - color: #8959A8 -} - -.highlight .kt { - color: #EAB700 -} - -.highlight .ld { - color: #5b7201 -} - -.highlight .m { - color: #85450A -} - -.highlight .s { - color: #5b7201 -} - -.highlight .na { - color: #4271AE -} - -.highlight .nb { - color: #4271AE -} - -.highlight .nc { - color: #EAB700 -} - -.highlight .no { - color: #EAB700 -} - -.highlight .nd { - color: #3E999F -} - -.highlight .ni { - color: #545454 -} - -.highlight .ne { - color: #C82829 -} - -.highlight .nf { - color: #4271AE -} - -.highlight .nl { - color: #545454 -} - -.highlight .nn { - color: #EAB700 -} - -.highlight .nx { - color: #4271AE -} - -.highlight .py { - color: #545454 -} - -.highlight .nt { - color: #3E999F -} - -.highlight .nv { - color: #C82829 -} - -.highlight .ow { - color: #3E999F -} - -.highlight .w { - color: #545454 -} - -.highlight .mf { - color: #85450A -} - -.highlight .mh { - color: #85450A -} - -.highlight .mi { - color: #85450a -} - -.highlight .mo { - color: #85450A -} - -.highlight .sb { - color: #5b7201 -} - -.highlight .sc { - color: #545454 -} - -.highlight .sd { - color: #525151 -} - -.highlight .s2 { - color: #5b7201 -} - -.highlight .se { - color: #85450A -} - -.highlight .sh { - color: #5b7201 -} - -.highlight .si { - color: #85450A -} - -.highlight .sx { - color: #5b7201 -} - -.highlight .sr { - color: #5b7201 -} - -.highlight .s1 { - color: #5b7201 -} - -.highlight .ss { - color: #5b7201 -} - -.highlight .bp { - color: #545454 -} - -.highlight .vc { - color: #C82829 -} - -.highlight .vg { - color: #C82829 -} - -.highlight .vi { - color: #C82829 -} - -.highlight .il { - color: #85450A -} - -.more-info { - padding: 100px 0; - - p { - padding: 0; - } -} - -.footer { - padding: 15px 0; - color: #000; - background: #e9ecef; - - @media (min-width: 576px) { - padding: 50px 0; - } - - img { - width: 100px; - - @media (min-width: 576px) { - float: right; - } - } - - ul { - margin: 0; - padding: 0; - } - - .message { - display: inline-block; - padding-right: 10px; - } - - .links { - padding-bottom: 10px; - - @media (min-width: 576px) { - padding: 0; - } - - li { - list-style: none; - padding-bottom: 10px; - - @media (min-width: 576px) { - display: inline-block; - padding: 0; - } - } - } - - iframe { - position: relative; - top: 5px; - } -} - -@media (min-width: 992px) { - .lsp-navbar { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1071; - } - - .lsp-sidebar { - position: -webkit-sticky; - position: sticky; - top: 100px; - z-index: 1000; - height: calc(100vh - 110px); - overflow: auto; - } - - #markdown-content-container .anchor { - scroll-margin-top: 60px; - } -} - -@media (max-width: 991px) { - .lsp-sidebar { - margin-top: 1rem; - margin-bottom: 1rem; - } -} - -.lsp-sidebar .card { - padding-top: 1px; -} - -.navbar-brand h1 { - font-size: 18px; - font-weight: bold; - margin: 0; -} - -.navbar-dark .navbar-nav .nav-link:hover { - color: rgba(255,255,255,0.5); -} - -.nav .nav-link { - color: #206bc6 !important; - } - -.nav .nav-link:hover { - color: #1034a8 !important; -} - -code.highlighter-rouge a { - color: #bd4147; - font-weight: bold; -} - -a h3, h2 a, h3 a, h4 a { - padding-top: 2px; - padding-bottom: 2px; -} - -a:hover { - color: #1034a8; -} - -.navbar-dark .navbar-nav .nav-link { - color: white; -} - -.docs-nav { - h4 { - display: inline-block; - font-size: 14px; - } -} - -.anchorHolder { - position: relative; -} - -.linkableAnchor { - display: block; - position: absolute; - visibility: hidden; - width: 0; - height: 0; - z-index: -1; - top: -60px; - left: 0; -} diff --git a/language-server-protocol/img/atom-css-code-complete.png b/language-server-protocol/img/atom-css-code-complete.png deleted file mode 100644 index 3752e72437af667921baee84b353a4896bb01822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49279 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 SBRAH;pR=cxWRqlc?))EeC;0^c diff --git a/language-server-protocol/img/favicon.svg b/language-server-protocol/img/favicon.svg deleted file mode 100644 index b1468cc59..000000000 --- a/language-server-protocol/img/favicon.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/language-server-protocol/img/microsoft-logo-inverted.png b/language-server-protocol/img/microsoft-logo-inverted.png deleted file mode 100644 index 27d11d9040e3306250067faa72bc18be06a41ca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3151 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 a?rm2e(Lw9#nU#M)Eocwye`|OA#s2{1vhkPz diff --git a/language-server-protocol/img/microsoft-logo.png b/language-server-protocol/img/microsoft-logo.png deleted file mode 100644 index 69ce20da29a0ae5fc727b3b29518082762cd1bef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3151 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 diff --git a/language-server-protocol/img/vs-rust-code-complete.png b/language-server-protocol/img/vs-rust-code-complete.png deleted file mode 100644 index dfbe337dda32952e227b3b80fe87e397ae6715ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8550 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 diff --git a/language-server-protocol/img/vscode-ps-hover.png b/language-server-protocol/img/vscode-ps-hover.png deleted file mode 100644 index aa64a4304f6842f6ec489d6ce83cab47e00f61fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61886 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 Mr+uFSh@RwMKHIf>H4b-c){|?kUD2oaKQ1vl{CJ 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 diff --git a/language-server-protocol/index.html b/language-server-protocol/index.html deleted file mode 100644 index 9b5d5111b..000000000 --- a/language-server-protocol/index.html +++ /dev/null @@ -1,109 +0,0 @@ ---- -layout: default ---- - - - - -
-
- -

- The Language Server Protocol (LSP) defines the protocol used between an editor or IDE and a language server that provides language features like auto complete, go to definition, find all references etc. The goal of the Language Server Index Format (LSIF, pronounced like "else if") is to support rich code navigation in development tools or a Web UI without needing a local copy of the source code. -

- -
-
- Star -
-
-
- -
-
-
-

What is the Language Server Protocol?

- -

Adding features like auto complete, go to definition, or documentation on hover for a programming language takes significant effort. Traditionally this work had to be repeated for each development tool, as each tool provides different APIs for implementing the same feature.

-

A Language Server is meant to provide the language-specific smarts and communicate with development tools over a protocol that enables inter-process communication.

-

The idea behind the Language Server Protocol (LSP) is to standardize the protocol for how such servers and development tools communicate. This way, a single Language Server can be re-used in multiple development tools, which in turn can support multiple languages with minimal effort.

-

LSP is a win for both language providers and tooling vendors!

-
-
- -
-
- -
- -
-
-

-

Overview

-

- The protocol defines the format of the messages sent using JSON-RPC between the development tool and the language server. LSIF defines a graph format to store information about programming artifacts. -

-
-
-

-

Specification

-

- The latest version of the LSP specification is version 3.17. There is now also a specification for the upcoming language server index format (LSIF). -

-
-
-

- {% assign sorted = site.implementors | sort: 'index' %} -

Implementations

-

- The LSP has been implemented for many languages and many development tools are integrating these language servers. -

-
-
-
diff --git a/language-server-protocol/inspector/css/app.39c3645b.css b/language-server-protocol/inspector/css/app.39c3645b.css deleted file mode 100644 index ffff01dbb..000000000 --- a/language-server-protocol/inspector/css/app.39c3645b.css +++ /dev/null @@ -1 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Open+Sans);@import url(https://fonts.googleapis.com/css?family=Roboto+Mono);.hljs[data-v-77219792]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-77219792],.hljs-quote[data-v-77219792]{color:#998;font-style:italic}.hljs-keyword[data-v-77219792],.hljs-selector-tag[data-v-77219792],.hljs-subst[data-v-77219792]{color:#333;font-weight:700}.hljs-literal[data-v-77219792],.hljs-number[data-v-77219792],.hljs-tag .hljs-attr[data-v-77219792],.hljs-template-variable[data-v-77219792],.hljs-variable[data-v-77219792]{color:teal}.hljs-doctag[data-v-77219792],.hljs-string[data-v-77219792]{color:#d14}.hljs-section[data-v-77219792],.hljs-selector-id[data-v-77219792],.hljs-title[data-v-77219792]{color:#900;font-weight:700}.hljs-subst[data-v-77219792]{font-weight:400}.hljs-class .hljs-title[data-v-77219792],.hljs-type[data-v-77219792]{color:#458;font-weight:700}.hljs-attribute[data-v-77219792],.hljs-name[data-v-77219792],.hljs-tag[data-v-77219792]{color:navy;font-weight:400}.hljs-link[data-v-77219792],.hljs-regexp[data-v-77219792]{color:#009926}.hljs-bullet[data-v-77219792],.hljs-symbol[data-v-77219792]{color:#990073}.hljs-built_in[data-v-77219792],.hljs-builtin-name[data-v-77219792]{color:#0086b3}.hljs-meta[data-v-77219792]{color:#999;font-weight:700}.hljs-deletion[data-v-77219792]{background:#fdd}.hljs-addition[data-v-77219792]{background:#dfd}.hljs-emphasis[data-v-77219792]{font-style:italic}.hljs-strong[data-v-77219792]{font-weight:700}[data-v-77219792]{-webkit-box-sizing:border-box;box-sizing:border-box}a[data-v-77219792]{color:#2c3e50}.header[data-v-77219792]{-ms-flex-flow:row;-ms-flex-pack:justify;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-box-pack:justify;border-bottom:2px solid #287fe3;display:-webkit-box;display:-ms-flexbox;display:flex;flex-flow:row;height:60px;justify-content:space-between;margin:0 auto 25px;max-width:1100px}.header .view[data-v-77219792]{-webkit-transition:background-color .15s ease-in;padding:10px;transition:background-color .15s ease-in}.header .view[data-v-77219792]:hover{background-color:rgba(130,181,239,.8)}.header .view.active[data-v-77219792]{background-color:#287fe3;color:#f0f0f0}.title h2[data-v-77219792]{margin-bottom:16px;margin-top:16px}.tabs[data-v-77219792]{-ms-flex-flow:column;-webkit-box-direction:normal;-webkit-box-orient:vertical;display:-webkit-box;display:-ms-flexbox;display:flex;flex-flow:column}.tabs .top-spacer[data-v-77219792]{-ms-flex-positive:2;-webkit-box-flex:2;flex-grow:2}.views[data-v-77219792]{display:-webkit-box;display:-ms-flexbox;display:flex}.hljs[data-v-343be03c]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-343be03c],.hljs-quote[data-v-343be03c]{color:#998;font-style:italic}.hljs-keyword[data-v-343be03c],.hljs-selector-tag[data-v-343be03c],.hljs-subst[data-v-343be03c]{color:#333;font-weight:700}.hljs-literal[data-v-343be03c],.hljs-number[data-v-343be03c],.hljs-tag .hljs-attr[data-v-343be03c],.hljs-template-variable[data-v-343be03c],.hljs-variable[data-v-343be03c]{color:teal}.hljs-doctag[data-v-343be03c],.hljs-string[data-v-343be03c]{color:#d14}.hljs-section[data-v-343be03c],.hljs-selector-id[data-v-343be03c],.hljs-title[data-v-343be03c]{color:#900;font-weight:700}.hljs-subst[data-v-343be03c]{font-weight:400}.hljs-class .hljs-title[data-v-343be03c],.hljs-type[data-v-343be03c]{color:#458;font-weight:700}.hljs-attribute[data-v-343be03c],.hljs-name[data-v-343be03c],.hljs-tag[data-v-343be03c]{color:navy;font-weight:400}.hljs-link[data-v-343be03c],.hljs-regexp[data-v-343be03c]{color:#009926}.hljs-bullet[data-v-343be03c],.hljs-symbol[data-v-343be03c]{color:#990073}.hljs-built_in[data-v-343be03c],.hljs-builtin-name[data-v-343be03c]{color:#0086b3}.hljs-meta[data-v-343be03c]{color:#999;font-weight:700}.hljs-deletion[data-v-343be03c]{background:#fdd}.hljs-addition[data-v-343be03c]{background:#dfd}.hljs-emphasis[data-v-343be03c]{font-style:italic}.hljs-strong[data-v-343be03c]{font-weight:700}[data-v-343be03c]{-webkit-box-sizing:border-box;box-sizing:border-box}.log[data-v-343be03c]{margin-bottom:6px;padding:8px 10px}.log .fa-icon[data-v-343be03c]{margin-right:8px;width:12px}.log[data-v-343be03c]:hover{background-color:rgba(130,181,239,.8)}.log.active[data-v-343be03c]{background-color:#287fe3;color:#f0f0f0}.hljs[data-v-610e6e88]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-610e6e88],.hljs-quote[data-v-610e6e88]{color:#998;font-style:italic}.hljs-keyword[data-v-610e6e88],.hljs-selector-tag[data-v-610e6e88],.hljs-subst[data-v-610e6e88]{color:#333;font-weight:700}.hljs-literal[data-v-610e6e88],.hljs-number[data-v-610e6e88],.hljs-tag .hljs-attr[data-v-610e6e88],.hljs-template-variable[data-v-610e6e88],.hljs-variable[data-v-610e6e88]{color:teal}.hljs-doctag[data-v-610e6e88],.hljs-string[data-v-610e6e88]{color:#d14}.hljs-section[data-v-610e6e88],.hljs-selector-id[data-v-610e6e88],.hljs-title[data-v-610e6e88]{color:#900;font-weight:700}.hljs-subst[data-v-610e6e88]{font-weight:400}.hljs-class .hljs-title[data-v-610e6e88],.hljs-type[data-v-610e6e88]{color:#458;font-weight:700}.hljs-attribute[data-v-610e6e88],.hljs-name[data-v-610e6e88],.hljs-tag[data-v-610e6e88]{color:navy;font-weight:400}.hljs-link[data-v-610e6e88],.hljs-regexp[data-v-610e6e88]{color:#009926}.hljs-bullet[data-v-610e6e88],.hljs-symbol[data-v-610e6e88]{color:#990073}.hljs-built_in[data-v-610e6e88],.hljs-builtin-name[data-v-610e6e88]{color:#0086b3}.hljs-meta[data-v-610e6e88]{color:#999;font-weight:700}.hljs-deletion[data-v-610e6e88]{background:#fdd}.hljs-addition[data-v-610e6e88]{background:#dfd}.hljs-emphasis[data-v-610e6e88]{font-style:italic}.hljs-strong[data-v-610e6e88]{font-weight:700}[data-v-610e6e88]{-webkit-box-sizing:border-box;box-sizing:border-box}.log-picker[data-v-610e6e88]{margin-top:6px}.log-picker label[data-v-610e6e88]{-webkit-transition:background-color .15s ease-in;cursor:pointer;display:block;padding:8px 10px;transition:background-color .15s ease-in}.log-picker label .fa-icon[data-v-610e6e88]{margin-right:8px;width:12px}.log-picker:hover label[data-v-610e6e88]{background-color:rgba(130,181,239,.8)}input[data-v-610e6e88]{height:.1px;opacity:0;overflow:hidden;position:absolute;width:.1px;z-index:-1}.hljs[data-v-2d67889c]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-2d67889c],.hljs-quote[data-v-2d67889c]{color:#998;font-style:italic}.hljs-keyword[data-v-2d67889c],.hljs-selector-tag[data-v-2d67889c],.hljs-subst[data-v-2d67889c]{color:#333;font-weight:700}.hljs-literal[data-v-2d67889c],.hljs-number[data-v-2d67889c],.hljs-tag .hljs-attr[data-v-2d67889c],.hljs-template-variable[data-v-2d67889c],.hljs-variable[data-v-2d67889c]{color:teal}.hljs-doctag[data-v-2d67889c],.hljs-string[data-v-2d67889c]{color:#d14}.hljs-section[data-v-2d67889c],.hljs-selector-id[data-v-2d67889c],.hljs-title[data-v-2d67889c]{color:#900;font-weight:700}.hljs-subst[data-v-2d67889c]{font-weight:400}.hljs-class .hljs-title[data-v-2d67889c],.hljs-type[data-v-2d67889c]{color:#458;font-weight:700}.hljs-attribute[data-v-2d67889c],.hljs-name[data-v-2d67889c],.hljs-tag[data-v-2d67889c]{color:navy;font-weight:400}.hljs-link[data-v-2d67889c],.hljs-regexp[data-v-2d67889c]{color:#009926}.hljs-bullet[data-v-2d67889c],.hljs-symbol[data-v-2d67889c]{color:#990073}.hljs-built_in[data-v-2d67889c],.hljs-builtin-name[data-v-2d67889c]{color:#0086b3}.hljs-meta[data-v-2d67889c]{color:#999;font-weight:700}.hljs-deletion[data-v-2d67889c]{background:#fdd}.hljs-addition[data-v-2d67889c]{background:#dfd}.hljs-emphasis[data-v-2d67889c]{font-style:italic}.hljs-strong[data-v-2d67889c]{font-weight:700}[data-v-2d67889c]{-webkit-box-sizing:border-box;box-sizing:border-box}h2[data-v-2d67889c]{font-size:1.5rem;margin-top:0}.logs[data-v-2d67889c]{border-bottom:1px solid #287fe3;cursor:pointer;margin-bottom:10px}.hljs[data-v-55018b7e]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-55018b7e],.hljs-quote[data-v-55018b7e]{color:#998;font-style:italic}.hljs-keyword[data-v-55018b7e],.hljs-selector-tag[data-v-55018b7e],.hljs-subst[data-v-55018b7e]{color:#333;font-weight:700}.hljs-literal[data-v-55018b7e],.hljs-number[data-v-55018b7e],.hljs-tag .hljs-attr[data-v-55018b7e],.hljs-template-variable[data-v-55018b7e],.hljs-variable[data-v-55018b7e]{color:teal}.hljs-doctag[data-v-55018b7e],.hljs-string[data-v-55018b7e]{color:#d14}.hljs-section[data-v-55018b7e],.hljs-selector-id[data-v-55018b7e],.hljs-title[data-v-55018b7e]{color:#900;font-weight:700}.hljs-subst[data-v-55018b7e]{font-weight:400}.hljs-class .hljs-title[data-v-55018b7e],.hljs-type[data-v-55018b7e]{color:#458;font-weight:700}.hljs-attribute[data-v-55018b7e],.hljs-name[data-v-55018b7e],.hljs-tag[data-v-55018b7e]{color:navy;font-weight:400}.hljs-link[data-v-55018b7e],.hljs-regexp[data-v-55018b7e]{color:#009926}.hljs-bullet[data-v-55018b7e],.hljs-symbol[data-v-55018b7e]{color:#990073}.hljs-built_in[data-v-55018b7e],.hljs-builtin-name[data-v-55018b7e]{color:#0086b3}.hljs-meta[data-v-55018b7e]{color:#999;font-weight:700}.hljs-deletion[data-v-55018b7e]{background:#fdd}.hljs-addition[data-v-55018b7e]{background:#dfd}.hljs-emphasis[data-v-55018b7e]{font-style:italic}.hljs-strong[data-v-55018b7e]{font-weight:700}[data-v-55018b7e]{-webkit-box-sizing:border-box;box-sizing:border-box}h2[data-v-55018b7e]{font-size:1.5rem;margin-top:1.5rem}.search-box[data-v-55018b7e]{-ms-flex-flow:column;-webkit-box-direction:normal;-webkit-box-orient:vertical;display:-webkit-box;display:-ms-flexbox;display:flex;flex-flow:column;margin-bottom:20px}.search-box input[data-v-55018b7e]{-webkit-transition:all .2s ease;background:#fff url(../img/search.237d6f6a.svg) .6rem .5rem no-repeat;background-size:1rem;border:1px solid #cfd4db;border-radius:4px;color:#4e6e8e;cursor:text;display:inline-block;line-height:2rem;outline:none;padding:0 .5rem 0 2rem;transition:all .2s ease}.search-box input[data-v-55018b7e]:focus{border-color:#287fe3;cursor:auto}.hljs[data-v-0b180f11]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-0b180f11],.hljs-quote[data-v-0b180f11]{color:#998;font-style:italic}.hljs-keyword[data-v-0b180f11],.hljs-selector-tag[data-v-0b180f11],.hljs-subst[data-v-0b180f11]{color:#333;font-weight:700}.hljs-literal[data-v-0b180f11],.hljs-number[data-v-0b180f11],.hljs-tag .hljs-attr[data-v-0b180f11],.hljs-template-variable[data-v-0b180f11],.hljs-variable[data-v-0b180f11]{color:teal}.hljs-doctag[data-v-0b180f11],.hljs-string[data-v-0b180f11]{color:#d14}.hljs-section[data-v-0b180f11],.hljs-selector-id[data-v-0b180f11],.hljs-title[data-v-0b180f11]{color:#900;font-weight:700}.hljs-subst[data-v-0b180f11]{font-weight:400}.hljs-class .hljs-title[data-v-0b180f11],.hljs-type[data-v-0b180f11]{color:#458;font-weight:700}.hljs-attribute[data-v-0b180f11],.hljs-name[data-v-0b180f11],.hljs-tag[data-v-0b180f11]{color:navy;font-weight:400}.hljs-link[data-v-0b180f11],.hljs-regexp[data-v-0b180f11]{color:#009926}.hljs-bullet[data-v-0b180f11],.hljs-symbol[data-v-0b180f11]{color:#990073}.hljs-built_in[data-v-0b180f11],.hljs-builtin-name[data-v-0b180f11]{color:#0086b3}.hljs-meta[data-v-0b180f11]{color:#999;font-weight:700}.hljs-deletion[data-v-0b180f11]{background:#fdd}.hljs-addition[data-v-0b180f11]{background:#dfd}.hljs-emphasis[data-v-0b180f11]{font-style:italic}.hljs-strong[data-v-0b180f11]{font-weight:700}[data-v-0b180f11]{-webkit-box-sizing:border-box;box-sizing:border-box}.category-container[data-v-0b180f11]{padding:4px 4px 4px 0}.category[data-v-0b180f11]{-webkit-transition:background-color .15s ease-in;padding:6px 10px;transition:background-color .15s ease-in}.category[data-v-0b180f11]:hover{background-color:rgba(130,181,239,.8)}.category.active[data-v-0b180f11]{background-color:#287fe3;color:#f0f0f0}h2[data-v-075b210d]{font-size:1.5rem;margin-top:1.5rem}.categories[data-v-075b210d]{cursor:pointer}.hljs[data-v-5507a1d8]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-5507a1d8],.hljs-quote[data-v-5507a1d8]{color:#998;font-style:italic}.hljs-keyword[data-v-5507a1d8],.hljs-selector-tag[data-v-5507a1d8],.hljs-subst[data-v-5507a1d8]{color:#333;font-weight:700}.hljs-literal[data-v-5507a1d8],.hljs-number[data-v-5507a1d8],.hljs-tag .hljs-attr[data-v-5507a1d8],.hljs-template-variable[data-v-5507a1d8],.hljs-variable[data-v-5507a1d8]{color:teal}.hljs-doctag[data-v-5507a1d8],.hljs-string[data-v-5507a1d8]{color:#d14}.hljs-section[data-v-5507a1d8],.hljs-selector-id[data-v-5507a1d8],.hljs-title[data-v-5507a1d8]{color:#900;font-weight:700}.hljs-subst[data-v-5507a1d8]{font-weight:400}.hljs-class .hljs-title[data-v-5507a1d8],.hljs-type[data-v-5507a1d8]{color:#458;font-weight:700}.hljs-attribute[data-v-5507a1d8],.hljs-name[data-v-5507a1d8],.hljs-tag[data-v-5507a1d8]{color:navy;font-weight:400}.hljs-link[data-v-5507a1d8],.hljs-regexp[data-v-5507a1d8]{color:#009926}.hljs-bullet[data-v-5507a1d8],.hljs-symbol[data-v-5507a1d8]{color:#990073}.hljs-built_in[data-v-5507a1d8],.hljs-builtin-name[data-v-5507a1d8]{color:#0086b3}.hljs-meta[data-v-5507a1d8]{color:#999;font-weight:700}.hljs-deletion[data-v-5507a1d8]{background:#fdd}.hljs-addition[data-v-5507a1d8]{background:#dfd}.hljs-emphasis[data-v-5507a1d8]{font-style:italic}.hljs-strong[data-v-5507a1d8]{font-weight:700}[data-v-5507a1d8]{-webkit-box-sizing:border-box;box-sizing:border-box}.kind-container[data-v-5507a1d8]{-webkit-transition:background-color .15s ease-in;margin-bottom:6px;padding:8px 10px;transition:background-color .15s ease-in}.kind-container[data-v-5507a1d8]:hover{background-color:rgba(130,181,239,.8)}.kind-container.active[data-v-5507a1d8]{background-color:#287fe3;color:#f0f0f0}.kind .fa-icon[data-v-5507a1d8]{margin-right:8px;width:12px}.recv-response svg[data-v-5507a1d8],.send-request svg[data-v-5507a1d8]{color:rgba(28,121,28,.74)}.recv-notification svg[data-v-5507a1d8],.send-notification svg[data-v-5507a1d8]{color:rgba(187,153,17,.87)}.recv-request svg[data-v-5507a1d8],.send-response svg[data-v-5507a1d8]{color:rgba(53,111,165,.97)}h2[data-v-4d599111]{font-size:1.5rem;margin-top:1.5rem}.kinds[data-v-4d599111]{cursor:pointer}h3[data-v-77d582d3]{margin:0 0 10px}#sidebar[data-v-77d582d3]{font-size:14px;height:calc(100vh - 120px);margin-right:50px;overflow-y:scroll;text-align:left;width:250px}.hljs[data-v-4e55ceb7]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-4e55ceb7],.hljs-quote[data-v-4e55ceb7]{color:#998;font-style:italic}.hljs-keyword[data-v-4e55ceb7],.hljs-selector-tag[data-v-4e55ceb7],.hljs-subst[data-v-4e55ceb7]{color:#333;font-weight:700}.hljs-literal[data-v-4e55ceb7],.hljs-number[data-v-4e55ceb7],.hljs-tag .hljs-attr[data-v-4e55ceb7],.hljs-template-variable[data-v-4e55ceb7],.hljs-variable[data-v-4e55ceb7]{color:teal}.hljs-doctag[data-v-4e55ceb7],.hljs-string[data-v-4e55ceb7]{color:#d14}.hljs-section[data-v-4e55ceb7],.hljs-selector-id[data-v-4e55ceb7],.hljs-title[data-v-4e55ceb7]{color:#900;font-weight:700}.hljs-subst[data-v-4e55ceb7]{font-weight:400}.hljs-class .hljs-title[data-v-4e55ceb7],.hljs-type[data-v-4e55ceb7]{color:#458;font-weight:700}.hljs-attribute[data-v-4e55ceb7],.hljs-name[data-v-4e55ceb7],.hljs-tag[data-v-4e55ceb7]{color:navy;font-weight:400}.hljs-link[data-v-4e55ceb7],.hljs-regexp[data-v-4e55ceb7]{color:#009926}.hljs-bullet[data-v-4e55ceb7],.hljs-symbol[data-v-4e55ceb7]{color:#990073}.hljs-built_in[data-v-4e55ceb7],.hljs-builtin-name[data-v-4e55ceb7]{color:#0086b3}.hljs-meta[data-v-4e55ceb7]{color:#999;font-weight:700}.hljs-deletion[data-v-4e55ceb7]{background:#fdd}.hljs-addition[data-v-4e55ceb7]{background:#dfd}.hljs-emphasis[data-v-4e55ceb7]{font-style:italic}.hljs-strong[data-v-4e55ceb7]{font-weight:700}[data-v-4e55ceb7]{-webkit-box-sizing:border-box;box-sizing:border-box}.msg-detail[data-v-4e55ceb7]{border:1px solid #eee;font-family:Roboto Mono,Source Code Pro,Input Mono,Menlo,Monaco,Courier New,monospace;font-size:13px;margin:20px;max-width:700px;text-align:left}.msg-detail b a[data-v-4e55ceb7]{color:inherit}pre[data-v-4e55ceb7]{border-radius:6px;margin-left:auto;margin-right:auto;max-width:64rem;overflow:auto;overflow-wrap:break-word;text-align:left;white-space:normal}code[data-v-4e55ceb7]{border-radius:2px;font-family:Roboto Mono,Source Code Pro,Input Mono,Menlo,Monaco,Courier New,monospace;padding:.2rem .3rem;white-space:pre-wrap}.hljs[data-v-65dd26e2]{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment[data-v-65dd26e2],.hljs-quote[data-v-65dd26e2]{color:#998;font-style:italic}.hljs-keyword[data-v-65dd26e2],.hljs-selector-tag[data-v-65dd26e2],.hljs-subst[data-v-65dd26e2]{color:#333;font-weight:700}.hljs-literal[data-v-65dd26e2],.hljs-number[data-v-65dd26e2],.hljs-tag .hljs-attr[data-v-65dd26e2],.hljs-template-variable[data-v-65dd26e2],.hljs-variable[data-v-65dd26e2]{color:teal}.hljs-doctag[data-v-65dd26e2],.hljs-string[data-v-65dd26e2]{color:#d14}.hljs-section[data-v-65dd26e2],.hljs-selector-id[data-v-65dd26e2],.hljs-title[data-v-65dd26e2]{color:#900;font-weight:700}.hljs-subst[data-v-65dd26e2]{font-weight:400}.hljs-class .hljs-title[data-v-65dd26e2],.hljs-type[data-v-65dd26e2]{color:#458;font-weight:700}.hljs-attribute[data-v-65dd26e2],.hljs-name[data-v-65dd26e2],.hljs-tag[data-v-65dd26e2]{color:navy;font-weight:400}.hljs-link[data-v-65dd26e2],.hljs-regexp[data-v-65dd26e2]{color:#009926}.hljs-bullet[data-v-65dd26e2],.hljs-symbol[data-v-65dd26e2]{color:#990073}.hljs-built_in[data-v-65dd26e2],.hljs-builtin-name[data-v-65dd26e2]{color:#0086b3}.hljs-meta[data-v-65dd26e2]{color:#999;font-weight:700}.hljs-deletion[data-v-65dd26e2]{background:#fdd}.hljs-addition[data-v-65dd26e2]{background:#dfd}.hljs-emphasis[data-v-65dd26e2]{font-style:italic}.hljs-strong[data-v-65dd26e2]{font-weight:700}[data-v-65dd26e2]{-webkit-box-sizing:border-box;box-sizing:border-box}.msg[data-v-65dd26e2]{border:1px solid #ddd;border-radius:4px;font-family:Roboto Mono,Source Code Pro,Input Mono,Menlo,Monaco,Courier New,monospace;font-size:13px;font-weight:400;margin-bottom:20px;padding:10px 20px}.msg-timestamp[data-v-65dd26e2]{color:#e8a1a1;font-size:11px}.send-notification[data-v-65dd26e2],.send-request[data-v-65dd26e2],.send-response[data-v-65dd26e2]{-ms-flex-item-align:start;align-self:flex-start;text-align:left}.recv-notification[data-v-65dd26e2],.recv-request[data-v-65dd26e2],.recv-response[data-v-65dd26e2]{-ms-flex-item-align:end;align-self:flex-end;text-align:right}.recv-response[data-v-65dd26e2],.send-request[data-v-65dd26e2]{color:rgba(28,121,28,.74)}.recv-notification[data-v-65dd26e2],.send-notification[data-v-65dd26e2]{color:rgba(187,153,17,.87)}.recv-request[data-v-65dd26e2],.send-response[data-v-65dd26e2]{color:rgba(53,111,165,.97)}.msg[data-v-65dd26e2]{-webkit-transition:all .15s ease-in;transition:all .15s ease-in}.msg.current[data-v-65dd26e2],.msg[data-v-65dd26e2]:hover{background-color:hsla(0,0%,86.7%,.5);border-color:#287fe3}.msg-clickable-area[data-v-65dd26e2]{cursor:pointer}.msg-header,.msg-list{margin-left:auto;margin-right:auto}.msg-header{-ms-flex-flow:row;-ms-flex-pack:justify;-webkit-box-orient:horizontal;-webkit-box-pack:justify;flex-flow:row;font-size:2rem;height:60px;justify-content:space-between}.msg-header,.msg-list{-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex}.msg-list{-ms-flex-flow:column;-webkit-box-orient:vertical;border-top:2px solid #287fe3;flex-flow:column;height:calc(100vh - 200px);margin-top:20px;overflow:scroll}.intro[data-v-325eed90]{line-height:1.5;margin-left:auto;margin-right:auto;margin-top:4rem;max-width:640px;text-align:left}li[data-v-325eed90]{margin-bottom:.4rem}.usage[data-v-96503ef6]{width:800px}.hljs{color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}*{-webkit-box-sizing:border-box;box-sizing:border-box}#app{background:#fff}h1,h2,h3,h4{font-weight:500}#app{color:#2c3e50;font-family:Open Sans,Avenir Next,Avenir,Helvetica,Arial,sans-serif;margin-left:20px;margin-right:20px;text-align:center}.inspector{max-height:100vh;padding-bottom:30px;padding-top:10px}.body{-ms-flex-pack:center;-webkit-box-pack:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;margin-left:auto;margin-right:auto;max-width:1100px}.main{-ms-flex-positive:2;-webkit-box-flex:2;flex-grow:2} \ No newline at end of file diff --git a/language-server-protocol/inspector/css/chunk-vendors.c05bff2f.css b/language-server-protocol/inspector/css/chunk-vendors.c05bff2f.css deleted file mode 100644 index 6901b6b3c..000000000 --- a/language-server-protocol/inspector/css/chunk-vendors.c05bff2f.css +++ /dev/null @@ -1 +0,0 @@ -/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{-webkit-text-decoration:underline dotted;border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none} \ No newline at end of file diff --git a/language-server-protocol/inspector/img/search.237d6f6a.svg b/language-server-protocol/inspector/img/search.237d6f6a.svg deleted file mode 100644 index 18ed22abe..000000000 --- a/language-server-protocol/inspector/img/search.237d6f6a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/language-server-protocol/inspector/index.html b/language-server-protocol/inspector/index.html deleted file mode 100644 index f07dc4280..000000000 --- a/language-server-protocol/inspector/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -sitemap: false -redirect_to: /overview ---- - -LSP Inspector - - - - - - - - - - - - - - - - -{% include topnav.html %} -
\ No newline at end of file diff --git a/language-server-protocol/inspector/js/app.2dac2b37.js b/language-server-protocol/inspector/js/app.2dac2b37.js deleted file mode 100644 index 1941347e6..000000000 --- a/language-server-protocol/inspector/js/app.2dac2b37.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){function t(t){for(var a,o,s=t[0],c=t[1],d=t[2],m=0,g=[];m && ]#",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"additive-symbols: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"align-content",documentation:"Aligns a flex container’s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.\n(Edge, Firefox 22, Safari 9, Chrome 29, IE 11, Opera 12.1)\n\nSyntax: normal | | | ? ",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"align-content: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"align-items",documentation:"Aligns flex items along the cross axis of the current line of the flex container.\n(Edge, Firefox 22, Safari 9, Chrome 29, IE 11, Opera 12.1)\n\nSyntax: normal | stretch | | [ ? ]",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"align-items: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"justify-items",documentation:"Defines the default justify-self for all items of the box, given them the default way of justifying each box along the appropriate axi\n(Firefox 45)\n\nSyntax: normal | stretch | | ? [ | left | right ] | legacy | legacy && [ left | right | center ]",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"justify-items: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"justify-self",documentation:"Defines the way of justifying a box inside its container along the appropriate axis.\n(Firefox 45)\n\nSyntax: auto | normal | stretch | | ? [ | left | right ]",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"justify-self: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"align-self",documentation:"Allows the default alignment along the cross axis to be overridden for individual flex items.\n(Edge, Firefox 22, Safari 9, Chrome 29, IE 11, Opera 12.1)\n\nSyntax: auto | normal | stretch | | ? ",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"align-self: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"all",documentation:"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.\n(Firefox 27, Chrome 37, Opera 24)\n\nSyntax: initial | inherit | unset | revert",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"all: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"alt",documentation:"Provides alternative text for assistive technology to replace the genenerated content of a ::before or ::after element.\n(Safari 9)",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"alt: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"animation",documentation:"Shorthand property combines six of the animation properties into a single property.\n(Edge, Firefox 16, Safari 9, Chrome 43, IE 10, Opera 12.1)\n\nSyntax: #",textEdit:{range:{start:{line:1,character:2},end:{line:1,character:3}},newText:"animation: "},kind:10,command:{title:"Suggest",command:"editor.action.triggerSuggest"},sortText:"d"},{label:"animation-delay",documentation:"Defines when the animation will start.\n(Edge, Firefox 16, Safari 9, Chrome 43, IE 10, Opera 12.1)\n\nSyntax: