diff options
Diffstat (limited to 'src/plugins/clangcodemodel')
4 files changed, 33 insertions, 11 deletions
diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp index 5ff5b1aa7e..cfb52f1528 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp @@ -99,7 +99,7 @@ IpcReceiver::IpcReceiver() IpcReceiver::~IpcReceiver() { - deleteAndClearWaitingAssistProcessors(); + reset(); } void IpcReceiver::setAliveHandler(const IpcReceiver::AliveHandler &handler) @@ -116,12 +116,6 @@ void IpcReceiver::addExpectedCodeCompletedMessage( m_assistProcessorsTable.insert(ticket, processor); } -void IpcReceiver::deleteAndClearWaitingAssistProcessors() -{ - qDeleteAll(m_assistProcessorsTable.begin(), m_assistProcessorsTable.end()); - m_assistProcessorsTable.clear(); -} - void IpcReceiver::deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *textEditorWidget) { QMutableHashIterator<quint64, ClangCompletionAssistProcessor *> it(m_assistProcessorsTable); @@ -155,6 +149,18 @@ bool IpcReceiver::isExpectingCodeCompletedMessage() const return !m_assistProcessorsTable.isEmpty(); } +void IpcReceiver::reset() +{ + // Clean up waiting assist processors + qDeleteAll(m_assistProcessorsTable.begin(), m_assistProcessorsTable.end()); + m_assistProcessorsTable.clear(); + + // Clean up futures for references + for (ReferencesEntry &entry : m_referencesTable) + entry.futureInterface.cancel(); + m_referencesTable.clear(); +} + void IpcReceiver::alive() { if (printAliveMessage()) @@ -719,7 +725,7 @@ void IpcCommunicator::onConnectedToBackend() if (m_connectedCount > 1) logRestartedDueToUnexpectedFinish(); - m_ipcReceiver.deleteAndClearWaitingAssistProcessors(); + m_ipcReceiver.reset(); m_ipcSender.reset(new IpcSender(m_connection)); initializeBackendWithCurrentData(); diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.h b/src/plugins/clangcodemodel/clangbackendipcintegration.h index 57a07e8097..e98565f48c 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.h +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.h @@ -73,14 +73,14 @@ public: void setAliveHandler(const AliveHandler &handler); void addExpectedCodeCompletedMessage(quint64 ticket, ClangCompletionAssistProcessor *processor); - void deleteAndClearWaitingAssistProcessors(); void deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *textEditorWidget); QFuture<CppTools::CursorInfo> addExpectedReferencesMessage(quint64 ticket, QTextDocument *textDocument); - bool isExpectingCodeCompletedMessage() const; + void reset(); + private: void alive() override; void echo(const ClangBackEnd::EchoMessage &message) override; diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp index c8da6e6c6a..1dd003c7c1 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp @@ -278,6 +278,8 @@ namespace Internal { ClangDiagnosticManager::ClangDiagnosticManager(TextEditor::TextDocument *textDocument) : m_textDocument(textDocument) { + m_textMarkDelay.setInterval(1500); + m_textMarkDelay.setSingleShot(true); } ClangDiagnosticManager::~ClangDiagnosticManager() @@ -295,6 +297,7 @@ void ClangDiagnosticManager::cleanMarks() } void ClangDiagnosticManager::generateTextMarks() { + QObject::disconnect(&m_textMarkDelay, &QTimer::timeout, 0, 0); cleanMarks(); m_clangTextMarks.reserve(m_warningDiagnostics.size() + m_errorDiagnostics.size()); addClangTextMarks(m_warningDiagnostics); @@ -350,6 +353,7 @@ ClangDiagnosticManager::diagnosticsAt(uint line, uint column) const void ClangDiagnosticManager::invalidateDiagnostics() { + m_textMarkDelay.start(); if (m_diagnosticsInvalidated) return; @@ -383,9 +387,18 @@ void ClangDiagnosticManager::processNewDiagnostics( m_showTextMarkAnnotations = showTextMarkAnnotations; filterDiagnostics(allDiagnostics); - generateTextMarks(); generateEditorSelections(); generateFixItAvailableMarkers(); + if (m_firstDiagnostics) { + m_firstDiagnostics = false; + generateTextMarks(); + } else if (!m_textMarkDelay.isActive()) { + generateTextMarks(); + } else { + QObject::connect(&m_textMarkDelay, &QTimer::timeout, [this]() { + generateTextMarks(); + }); + } } const QVector<ClangBackEnd::DiagnosticContainer> & diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.h b/src/plugins/clangcodemodel/clangdiagnosticmanager.h index 16b1c16d2d..1321702c99 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.h +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.h @@ -34,6 +34,7 @@ #include <QList> #include <QSet> #include <QTextEdit> +#include <QTimer> #include <QVector> #include <vector> @@ -82,8 +83,10 @@ private: QList<QTextEdit::ExtraSelection> m_extraSelections; TextEditor::RefactorMarkers m_fixItAvailableMarkers; std::vector<ClangTextMark *> m_clangTextMarks; + bool m_firstDiagnostics = true; bool m_diagnosticsInvalidated = false; bool m_showTextMarkAnnotations = false; + QTimer m_textMarkDelay; }; } // namespace Internal |