aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangcodemodel
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/clangcodemodel')
-rw-r--r--src/plugins/clangcodemodel/clangbackendipcintegration.cpp22
-rw-r--r--src/plugins/clangcodemodel/clangbackendipcintegration.h4
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticmanager.cpp15
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticmanager.h3
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