From 1e8879ee723b6b7f2fa4285e42a5473737f7bff9 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 30 Mar 2021 10:27:02 +0200 Subject: [PATCH] LanguageClient: track document highlight request based on widgets We can have multiple widgets per document, so we can have multiple different cursors for the same document. Tracking document highlights per widget prevents cancelling a potentially valid request for another text cursor of another widget. Change-Id: I800d9be5b44b327351252ab90305b8882efa87bb Reviewed-by: Christian Stenger --- src/plugins/languageclient/client.cpp | 19 +++++++++++-------- src/plugins/languageclient/client.h | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 39822bccb49..3bbba9d2893 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -450,20 +450,23 @@ void Client::requestDocumentHighlights(TextEditor::TextEditorWidget *widget) return; } - auto runningRequest = m_highlightRequests.find(uri); + auto runningRequest = m_highlightRequests.find(widget); if (runningRequest != m_highlightRequests.end()) cancelRequest(runningRequest.value()); DocumentHighlightsRequest request( TextDocumentPositionParams(TextDocumentIdentifier(uri), Position(widget->textCursor()))); + auto connection = connect(widget, &QObject::destroyed, this, [this, widget]() { + auto runningRequest = m_highlightRequests.find(widget); + if (runningRequest != m_highlightRequests.end()) + cancelRequest(runningRequest.value()); + }); request.setResponseCallback( - [widget = QPointer(widget), this, uri] + [widget, this, uri, connection] (const DocumentHighlightsRequest::Response &response) { - m_highlightRequests.remove(uri); - if (!widget) - return; - + m_highlightRequests.remove(widget); + disconnect(connection); const Id &id = TextEditor::TextEditorWidget::CodeSemanticsSelection; QList selections; const Utils::optional &result = response.result(); @@ -487,7 +490,7 @@ void Client::requestDocumentHighlights(TextEditor::TextEditorWidget *widget) } widget->setExtraSelections(id, selections); }); - m_highlightRequests[uri] = request.id(); + m_highlightRequests[widget] = request.id(); sendContent(request); } @@ -698,7 +701,7 @@ void Client::cursorPositionChanged(TextEditor::TextEditorWidget *widget) QTimer *timer = m_documentHighlightsTimer[widget]; if (!timer) { const auto uri = DocumentUri::fromFilePath(widget->textDocument()->filePath()); - auto runningRequest = m_highlightRequests.find(uri); + auto runningRequest = m_highlightRequests.find(widget); if (runningRequest != m_highlightRequests.end()) cancelRequest(runningRequest.value()); timer = new QTimer; diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index dfb2d660659..fca5a6a040d 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -229,7 +229,7 @@ private: AssistProviders m_clientProviders; QMap m_resetAssistProvider; - QHash m_highlightRequests; + QHash m_highlightRequests; int m_restartsLeft = 5; QScopedPointer m_clientInterface; DiagnosticManager m_diagnosticManager;