diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index b77961bcf8d..e997a564c5d 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -918,6 +918,7 @@ void Client::documentContentsChanged(TextEditor::TextDocument *document, { if (!d->m_openedDocument.contains(document) || !reachable()) return; + d->m_diagnosticManager->disableDiagnostics(document); const QString method(DidChangeTextDocumentNotification::methodName); TextDocumentSyncKind syncKind = d->m_serverCapabilities.textDocumentSyncKindHelper(); if (Utils::optional registered = d->m_dynamicCapabilities.isRegistered(method)) { diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index b80ea70b95e..4ebb7f6c304 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -90,7 +90,7 @@ void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath) for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) editor->editorWidget()->setExtraSelections(m_extraSelectionsId, {}); } - qDeleteAll(m_marks.take(filePath)); + m_marks.remove(filePath); } QList DiagnosticManager::filteredDiagnostics(const QList &diagnostics) const @@ -98,6 +98,17 @@ QList DiagnosticManager::filteredDiagnostics(const QList return diagnostics; } +void DiagnosticManager::disableDiagnostics(TextEditor::TextDocument *document) +{ + + Marks &marks = m_marks[document->filePath()]; + if (!marks.enabled) + return; + for (TextEditor::TextMark *mark : marks.marks) + mark->setColor(Utils::Theme::Color::IconsDisabledColor); + marks.enabled = false; +} + void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) { const FilePath &filePath = uri.toFilePath(); @@ -106,7 +117,7 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) const VersionedDiagnostics &versionedDiagnostics = m_diagnostics.value(uri); if (versionedDiagnostics.version.value_or(version) == version && !versionedDiagnostics.diagnostics.isEmpty()) { - QList &marks = m_marks[filePath]; + Marks &marks = m_marks[filePath]; const bool isProjectFile = m_client->project() && m_client->project()->isKnownFile(filePath); for (const Diagnostic &diagnostic : versionedDiagnostics.diagnostics) { @@ -115,9 +126,9 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) if (!selection.cursor.isNull()) extraSelections << selection; if (TextEditor::TextMark *mark = createTextMark(filePath, diagnostic, isProjectFile)) - marks.append(mark); + marks.marks.append(mark); } - if (!marks.isEmpty()) + if (!marks.marks.isEmpty()) emit textMarkCreated(filePath); } @@ -170,11 +181,7 @@ void DiagnosticManager::clearDiagnostics() for (const DocumentUri &uri : m_diagnostics.keys()) hideDiagnostics(uri.toFilePath()); m_diagnostics.clear(); - if (!QTC_GUARD(m_marks.isEmpty())) { - for (const QList &marks : qAsConst(m_marks)) - qDeleteAll(marks); - m_marks.clear(); - } + QTC_ASSERT(m_marks.isEmpty(), m_marks.clear()); } QList DiagnosticManager::diagnosticsAt(const DocumentUri &uri, @@ -218,4 +225,9 @@ bool DiagnosticManager::hasDiagnostics(const TextDocument *doc) const return !it->diagnostics.isEmpty(); } +DiagnosticManager::Marks::~Marks() +{ + qDeleteAll(marks); +} + } // namespace LanguageClient diff --git a/src/plugins/languageclient/diagnosticmanager.h b/src/plugins/languageclient/diagnosticmanager.h index c4972524c00..aa229b91c00 100644 --- a/src/plugins/languageclient/diagnosticmanager.h +++ b/src/plugins/languageclient/diagnosticmanager.h @@ -61,6 +61,7 @@ public: virtual QList filteredDiagnostics( const QList &diagnostics) const; + void disableDiagnostics(TextEditor::TextDocument *document); void clearDiagnostics(); QList diagnosticsAt( @@ -91,7 +92,14 @@ private: QList diagnostics; }; QMap m_diagnostics; - QMap> m_marks; + class Marks + { + public: + ~Marks(); + bool enabled = true; + QList marks; + }; + QMap m_marks; Client *m_client; Utils::Id m_extraSelectionsId; };