summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-language-server.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-06-16 01:50:43 -0700
committerGitHub <noreply@github.com>2022-06-16 01:50:43 -0700
commit241def9c7619c437aad1bb620be8891e61707d8d (patch)
treed412a108bcd4bc9e52e0d6bf230b16d90df632d2 /source/slang/slang-language-server.cpp
parent23f567323e36a14e0649899b5b8811312d7ea9fd (diff)
Language server: document symbols (#2287)
* Language Server: Document Symbol outline. * Fix highlighting of extension decls. 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.cpp38
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());