diff options
Diffstat (limited to 'src/plugins/languageclient/client.cpp')
-rw-r--r-- | src/plugins/languageclient/client.cpp | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 9ec611200f..75d7caf7c5 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -456,20 +456,21 @@ void Client::requestDocumentHighlights(TextEditor::TextEditorWidget *widget) return; } - auto runningRequest = m_highlightRequests.find(uri); - if (runningRequest != m_highlightRequests.end()) - cancelRequest(runningRequest.value()); + if (m_highlightRequests.contains(widget)) + cancelRequest(m_highlightRequests.take(widget)); DocumentHighlightsRequest request( TextDocumentPositionParams(TextDocumentIdentifier(uri), Position(widget->textCursor()))); + auto connection = connect(widget, &QObject::destroyed, this, [this, widget]() { + if (m_highlightRequests.contains(widget)) + cancelRequest(m_highlightRequests.take(widget)); + }); request.setResponseCallback( - [widget = QPointer<TextEditor::TextEditorWidget>(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<QTextEdit::ExtraSelection> selections; const Utils::optional<DocumentHighlightsResult> &result = response.result(); @@ -493,7 +494,7 @@ void Client::requestDocumentHighlights(TextEditor::TextEditorWidget *widget) } widget->setExtraSelections(id, selections); }); - m_highlightRequests[uri] = request.id(); + m_highlightRequests[widget] = request.id(); sendContent(request); } @@ -713,19 +714,19 @@ 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); - if (runningRequest != m_highlightRequests.end()) - cancelRequest(runningRequest.value()); + if (m_highlightRequests.contains(widget)) + cancelRequest(m_highlightRequests.take(widget)); timer = new QTimer; timer->setSingleShot(true); m_documentHighlightsTimer.insert(widget, timer); - connect(timer, &QTimer::timeout, this, [this, widget]() { + auto connection = connect(widget, &QWidget::destroyed, this, [widget, this]() { + delete m_documentHighlightsTimer.take(widget); + }); + connect(timer, &QTimer::timeout, this, [this, widget, connection]() { + disconnect(connection); requestDocumentHighlights(widget); m_documentHighlightsTimer.take(widget)->deleteLater(); }); - connect(widget, &QWidget::destroyed, this, [widget, this]() { - delete m_documentHighlightsTimer.take(widget); - }); } const Id selectionsId(TextEditor::TextEditorWidget::CodeSemanticsSelection); const QList semanticSelections = widget->extraSelections(selectionsId); |