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