diff options
| author | Yong He <yonghe@outlook.com> | 2024-01-26 16:30:19 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-26 16:30:19 -0800 |
| commit | 470c5a28f5b84353f077c2d871db65cddd5f923a (patch) | |
| tree | e970a1c44173673bdc6dd5ec22e6b0c5bde93787 /source/slang/slang-language-server.cpp | |
| parent | 013bcf28da22fd569154bd9f98368e670fbeb873 (diff) | |
Fix LSP compatibility issues with Visual Studio. (#3520)
* [LSP] compatibility logic for Visual Studio.
* [LSP] Fix diagnostic rank parsing.
* [LSP] Fix semantic highlighting of cbuffer types.
* Fix.
* Fix.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-language-server.cpp')
| -rw-r--r-- | source/slang/slang-language-server.cpp | 97 |
1 files changed, 61 insertions, 36 deletions
diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp index 84dd1b330..76e21c2ca 100644 --- a/source/slang/slang-language-server.cpp +++ b/source/slang/slang-language-server.cpp @@ -106,42 +106,58 @@ SlangResult LanguageServer::parseNextMessage() { InitializeParams args; m_connection->toNativeArgsOrSendError(call.params, &args, call.id); - init(args); + auto fillCapability = [&](ServerCapabilities& caps) + { + caps.positionEncoding = "utf-16"; + caps.textDocumentSync.openClose = true; + caps.textDocumentSync.change = (int)TextDocumentSyncKind::Incremental; + caps.workspace.workspaceFolders.supported = true; + caps.workspace.workspaceFolders.changeNotifications = false; + caps.hoverProvider = true; + caps.definitionProvider = true; + caps.documentSymbolProvider = true; + caps.inlayHintProvider.resolveProvider = false; + caps.documentFormattingProvider = true; + caps.documentOnTypeFormattingProvider.firstTriggerCharacter = "}"; + caps.documentOnTypeFormattingProvider.moreTriggerCharacter.add(";"); + caps.documentOnTypeFormattingProvider.moreTriggerCharacter.add(":"); + caps.documentOnTypeFormattingProvider.moreTriggerCharacter.add("{"); + caps.documentRangeFormattingProvider = true; + caps.completionProvider.triggerCharacters.add("."); + caps.completionProvider.triggerCharacters.add(":"); + caps.completionProvider.triggerCharacters.add("["); + caps.completionProvider.triggerCharacters.add("\""); + caps.completionProvider.triggerCharacters.add("/"); + caps.completionProvider.resolveProvider = true; + caps.completionProvider.workDoneToken = ""; + caps.semanticTokensProvider.full = true; + caps.semanticTokensProvider.range = false; + caps.signatureHelpProvider.triggerCharacters.add("("); + caps.signatureHelpProvider.triggerCharacters.add(","); + caps.signatureHelpProvider.retriggerCharacters.add(","); + for (auto tokenType : kSemanticTokenTypes) + caps.semanticTokensProvider.legend.tokenTypes.add(tokenType); + }; + ServerInfo serverInfo; + serverInfo.name = "SlangLanguageServer"; + serverInfo.version = "1.8"; - InitializeResult result; - result.serverInfo.name = "SlangLanguageServer"; - result.serverInfo.version = "1.3"; - result.capabilities.positionEncoding = "utf-16"; - result.capabilities.textDocumentSync.openClose = true; - result.capabilities.textDocumentSync.change = (int)TextDocumentSyncKind::Incremental; - result.capabilities.workspace.workspaceFolders.supported = true; - result.capabilities.workspace.workspaceFolders.changeNotifications = false; - result.capabilities.hoverProvider = true; - result.capabilities.definitionProvider = true; - result.capabilities.documentSymbolProvider = true; - result.capabilities.inlayHintProvider.resolveProvider = false; - result.capabilities.documentFormattingProvider = true; - result.capabilities.documentOnTypeFormattingProvider.firstTriggerCharacter = "}"; - result.capabilities.documentOnTypeFormattingProvider.moreTriggerCharacter.add(";"); - result.capabilities.documentOnTypeFormattingProvider.moreTriggerCharacter.add(":"); - result.capabilities.documentOnTypeFormattingProvider.moreTriggerCharacter.add("{"); - result.capabilities.documentRangeFormattingProvider = true; - result.capabilities.completionProvider.triggerCharacters.add("."); - result.capabilities.completionProvider.triggerCharacters.add(":"); - result.capabilities.completionProvider.triggerCharacters.add("["); - result.capabilities.completionProvider.triggerCharacters.add("\""); - result.capabilities.completionProvider.triggerCharacters.add("/"); - result.capabilities.completionProvider.resolveProvider = true; - result.capabilities.completionProvider.workDoneToken = ""; - result.capabilities.semanticTokensProvider.full = true; - result.capabilities.semanticTokensProvider.range = false; - result.capabilities.signatureHelpProvider.triggerCharacters.add("("); - result.capabilities.signatureHelpProvider.triggerCharacters.add(","); - result.capabilities.signatureHelpProvider.retriggerCharacters.add(","); - for (auto tokenType : kSemanticTokenTypes) - result.capabilities.semanticTokensProvider.legend.tokenTypes.add(tokenType); - m_connection->sendResult(&result, call.id); + if (m_options.isVisualStudio) + { + VSInitializeResult vsResult; + vsResult.serverInfo = serverInfo; + fillCapability(vsResult.capabilities); + vsResult.capabilities._vs_projectContextProvider = true; + m_connection->sendResult(&vsResult, call.id); + } + else + { + InitializeResult result; + result.serverInfo = serverInfo; + fillCapability(result.capabilities); + m_connection->sendResult(&result, call.id); + } return SLANG_OK; } else if (call.method == "initialized") @@ -2301,9 +2317,18 @@ SlangResult LanguageServer::execute() return SLANG_OK; } -SLANG_API SlangResult runLanguageServer() +SLANG_API void LanguageServerStartupOptions::parse(int argc, const char* const* argv) +{ + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[i], "-vs") == 0) + isVisualStudio = true; + } +} + +SLANG_API SlangResult runLanguageServer(Slang::LanguageServerStartupOptions options) { - Slang::LanguageServer server; + Slang::LanguageServer server(options); SLANG_RETURN_ON_FAIL(server.execute()); return SLANG_OK; } |
