From 178d555151ec8820e19ca33eb2a13f49d846b611 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 8 Jun 2022 09:23:24 +0200 Subject: [PATCH] LanguageClient: prevent assert in semantic highlighter Do not send messages to server that are not reachable, but queue the highlighting requests until the client is fully initialized. Change-Id: I7da140ec33fb1974d3eaed03110ed85dc3a87594 Reviewed-by: Qt CI Bot Reviewed-by: Christian Kandeler --- .../semantichighlightsupport.cpp | 27 +++++++++++++++++-- .../languageclient/semantichighlightsupport.h | 3 +++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/plugins/languageclient/semantichighlightsupport.cpp b/src/plugins/languageclient/semantichighlightsupport.cpp index 4cef4cd5cc8..a7aca308643 100644 --- a/src/plugins/languageclient/semantichighlightsupport.cpp +++ b/src/plugins/languageclient/semantichighlightsupport.cpp @@ -68,12 +68,16 @@ void SemanticTokenSupport::refresh() void SemanticTokenSupport::reloadSemanticTokens(TextDocument *textDocument) { - reloadSemanticTokensImpl(textDocument); + if (m_client->reachable()) + reloadSemanticTokensImpl(textDocument); + else + queueDocumentReload(textDocument); } void SemanticTokenSupport::reloadSemanticTokensImpl(TextDocument *textDocument, int remainingRerequests) { + m_docReloadQueue.remove(textDocument); const SemanticRequestTypes supportedRequests = supportedSemanticRequests(textDocument); if (supportedRequests.testFlag(SemanticRequestType::None)) return; @@ -122,7 +126,10 @@ void SemanticTokenSupport::reloadSemanticTokensImpl(TextDocument *textDocument, void SemanticTokenSupport::updateSemanticTokens(TextDocument *textDocument) { - updateSemanticTokensImpl(textDocument); + if (m_client->reachable()) + updateSemanticTokensImpl(textDocument); + else + queueDocumentReload(textDocument); } void SemanticTokenSupport::updateSemanticTokensImpl(TextDocument *textDocument, @@ -168,6 +175,22 @@ void SemanticTokenSupport::updateSemanticTokensImpl(TextDocument *textDocument, reloadSemanticTokens(textDocument); } +void SemanticTokenSupport::queueDocumentReload(TextEditor::TextDocument *doc) +{ + if (m_docReloadQueue.contains(doc)) + return; + m_docReloadQueue << doc; + connect( + m_client, + &Client::initialized, + this, + [this, doc = QPointer(doc)]() { + if (doc) + reloadSemanticTokensImpl(doc); + }, + Qt::QueuedConnection); +} + void SemanticTokenSupport::clearHighlight(TextEditor::TextDocument *doc) { if (m_tokens.contains(doc->filePath())){ diff --git a/src/plugins/languageclient/semantichighlightsupport.h b/src/plugins/languageclient/semantichighlightsupport.h index e903fe58f94..a03947c9153 100644 --- a/src/plugins/languageclient/semantichighlightsupport.h +++ b/src/plugins/languageclient/semantichighlightsupport.h @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -86,6 +87,7 @@ public: private: void reloadSemanticTokensImpl(TextEditor::TextDocument *doc, int remainingRerequests = 3); void updateSemanticTokensImpl(TextEditor::TextDocument *doc, int remainingRerequests = 3); + void queueDocumentReload(TextEditor::TextDocument *doc); LanguageServerProtocol::SemanticRequestTypes supportedSemanticRequests( TextEditor::TextDocument *document) const; void handleSemanticTokens(const Utils::FilePath &filePath, @@ -117,6 +119,7 @@ private: SemanticTokensHandler m_tokensHandler; QStringList m_tokenTypeStrings; QStringList m_tokenModifierStrings; + QSet m_docReloadQueue; }; } // namespace LanguageClient