diff options
| -rw-r--r-- | source/slang/slang-language-server.cpp | 47 | ||||
| -rw-r--r-- | source/slang/slang-language-server.h | 3 | ||||
| -rw-r--r-- | tools/slang-test/test-context.cpp | 2 |
3 files changed, 48 insertions, 4 deletions
diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp index 59a9854f0..cd9818f65 100644 --- a/source/slang/slang-language-server.cpp +++ b/source/slang/slang-language-server.cpp @@ -252,7 +252,18 @@ SlangResult LanguageServerCore::didOpenTextDocument(const DidOpenTextDocumentPar SlangResult LanguageServer::didOpenTextDocument(const DidOpenTextDocumentParams& args) { - return m_core.didOpenTextDocument(args); + // When periodic diagnostic updates are disabled (e.g., for testing), + // the main server loop will not automatically publish diagnostics. + // In this case, we must manually trigger a diagnostic publication + // after any action that could affect the results, such as opening a document. + // The same logic applies to didChange and didClose handlers. + resetDiagnosticUpdateTime(); + auto result = m_core.didOpenTextDocument(args); + if (!m_core.m_options.periodicDiagnosticUpdate) + { + publishDiagnostics(); + } + return result; } static bool isBoolType(Type* t) @@ -2541,7 +2552,12 @@ void LanguageServer::processCommands() SlangResult LanguageServer::didCloseTextDocument(const DidCloseTextDocumentParams& args) { resetDiagnosticUpdateTime(); - return m_core.didCloseTextDocument(args); + auto result = m_core.didCloseTextDocument(args); + if (!m_core.m_options.periodicDiagnosticUpdate) + { + publishDiagnostics(); + } + return result; } SlangResult LanguageServerCore::didCloseTextDocument(const DidCloseTextDocumentParams& args) @@ -2554,7 +2570,12 @@ SlangResult LanguageServerCore::didCloseTextDocument(const DidCloseTextDocumentP SlangResult LanguageServer::didChangeTextDocument(const DidChangeTextDocumentParams& args) { resetDiagnosticUpdateTime(); - return m_core.didChangeTextDocument(args); + auto result = m_core.didChangeTextDocument(args); + if (!m_core.m_options.periodicDiagnosticUpdate) + { + publishDiagnostics(); + } + return result; } SlangResult LanguageServerCore::didChangeTextDocument(const DidChangeTextDocumentParams& args) @@ -2583,7 +2604,8 @@ void LanguageServer::update() { if (!m_core.m_workspace) return; - publishDiagnostics(); + if (m_core.m_options.periodicDiagnosticUpdate) + publishDiagnostics(); } void LanguageServer::updateConfigFromJSON(const JSONValue& jsonVal) @@ -2689,7 +2711,24 @@ SLANG_API void LanguageServerStartupOptions::parse(int argc, const char* const* for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-vs") == 0) + { isVisualStudio = true; + } + else if (strcmp(argv[i], "-periodic-diagnostic-update") == 0) + { + periodicDiagnosticUpdate = true; + if (i + 1 < argc) + { + const char* value = argv[i + 1]; + if (value[0] == 'f' || value[0] == 'F' || value[0] == 'n' || value[0] == 'N' || + value[0] == '0' || + ((value[0] == 'o' || value[0] == 'O') && (value[1] == 'f' || value[1] == 'F'))) + { + periodicDiagnosticUpdate = false; + } + i++; + } + } } } diff --git a/source/slang/slang-language-server.h b/source/slang/slang-language-server.h index 4b0abe3f2..e31e77acb 100644 --- a/source/slang/slang-language-server.h +++ b/source/slang/slang-language-server.h @@ -83,6 +83,9 @@ struct LanguageServerStartupOptions // Are we working with Visual Studio client? bool isVisualStudio = false; + // A flag to control periodic diagnostic update. Defaults to true. + bool periodicDiagnosticUpdate = true; + SLANG_API void parse(int argc, const char* const* argv); }; diff --git a/tools/slang-test/test-context.cpp b/tools/slang-test/test-context.cpp index d1b809766..ede12d0d7 100644 --- a/tools/slang-test/test-context.cpp +++ b/tools/slang-test/test-context.cpp @@ -213,6 +213,8 @@ SlangResult TestContext::createLanguageServerJSONRPCConnection(RefPtr<JSONRPCCon { CommandLine cmdLine; cmdLine.setExecutableLocation(ExecutableLocation(exeDirectoryPath, "slangd")); + cmdLine.addArg("-periodic-diagnostic-update"); + cmdLine.addArg("false"); SLANG_RETURN_ON_FAIL(Process::create(cmdLine, Process::Flag::AttachDebugger, process)); } |
