diff options
Diffstat (limited to 'source/slang/slang-language-server.cpp')
| -rw-r--r-- | source/slang/slang-language-server.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp index 5aa8d0e14..1ad0e28e9 100644 --- a/source/slang/slang-language-server.cpp +++ b/source/slang/slang-language-server.cpp @@ -20,6 +20,7 @@ #include "slang-language-server-ast-lookup.h" #include "slang-language-server-completion.h" #include "slang-language-server-semantic-tokens.h" +#include "slang-language-server-document-symbols.h" #include "slang-ast-print.h" #include "slang-doc-markdown-writer.h" #include "../../tools/platform/performance-counter.h" @@ -110,12 +111,13 @@ SlangResult LanguageServer::parseNextMessage() result.capabilities.workspace.workspaceFolders.changeNotifications = false; result.capabilities.hoverProvider = true; result.capabilities.definitionProvider = true; - for (auto ch : getCommitChars()) - result.capabilities.completionProvider.allCommitCharacters.add(ch); + result.capabilities.documentSymbolProvider = true; result.capabilities.completionProvider.triggerCharacters.add("."); result.capabilities.completionProvider.triggerCharacters.add(":"); result.capabilities.completionProvider.resolveProvider = true; result.capabilities.completionProvider.workDoneToken = ""; + for (auto ch : getCommitChars()) + result.capabilities.completionProvider.allCommitCharacters.add(ch); result.capabilities.semanticTokensProvider.full = true; result.capabilities.semanticTokensProvider.range = false; result.capabilities.signatureHelpProvider.triggerCharacters.add("("); @@ -731,6 +733,28 @@ SlangResult LanguageServer::signatureHelp( return SLANG_OK; } +SlangResult LanguageServer::documentSymbol( + const LanguageServerProtocol::DocumentSymbolParams& args, const JSONValue& responseId) +{ + String canonicalPath = uriToCanonicalPath(args.textDocument.uri); + RefPtr<DocumentVersion> doc; + if (!m_workspace->openedDocuments.TryGetValue(canonicalPath, doc)) + { + m_connection->sendResult(NullResponse::get(), responseId); + return SLANG_OK; + } + auto version = m_workspace->getCurrentVersion(); + Module* parsedModule = version->getOrLoadModule(canonicalPath); + if (!parsedModule) + { + m_connection->sendResult(NullResponse::get(), responseId); + return SLANG_OK; + } + List<DocumentSymbol> symbols = getDocumentSymbols(version->linkage, parsedModule, canonicalPath.getUnownedSlice(), doc.Ptr()); + m_connection->sendResult(&symbols, responseId); + return SLANG_OK; +} + void LanguageServer::publishDiagnostics() { time_t timeNow = 0; @@ -923,6 +947,12 @@ SlangResult LanguageServer::queueJSONCall(JSONRPCCall call) SLANG_RETURN_ON_FAIL(m_connection->toNativeArgsOrSendError(call.params, &args, call.id)); cmd.completionResolveArgs = args; } + else if (call.method == DocumentSymbolParams::methodName) + { + DocumentSymbolParams args; + SLANG_RETURN_ON_FAIL(m_connection->toNativeArgsOrSendError(call.params, &args, call.id)); + cmd.documentSymbolArgs = args; + } else if (call.method == DidChangeConfigurationParams::methodName) { DidChangeConfigurationParams args; @@ -980,6 +1010,10 @@ SlangResult LanguageServer::runCommand(Command& call) { return completionResolve(call.completionResolveArgs.get(), call.id); } + else if (call.method == DocumentSymbolParams::methodName) + { + return documentSymbol(call.documentSymbolArgs.get(), call.id); + } else if (call.method == DidChangeConfigurationParams::methodName) { return didChangeConfiguration(call.changeConfigArgs.get()); |
