diff options
author | David Schulz <david.schulz@qt.io> | 2022-02-22 10:29:10 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2022-02-24 05:25:25 +0000 |
commit | 3cf6d15096d4191908169cb22d0d350345923cf1 (patch) | |
tree | ee521fe99cc2954b4d5ee606e726bd31e5bc95f5 | |
parent | ee4757a8e84336de1f53e9b6a528916313a355fd (diff) | |
download | qt-creator-3cf6d15096d4191908169cb22d0d350345923cf1.tar.gz |
LanguageClient: track all created diagnostic marks
Removing a block results in taking marks of that line out of the
document, but does not delete those marks. So we cannot rely on
iterating over marks of a document to delete all marks for a specific
file. Instead save all marks from text mark creator for a file path and
iterate this list to delete diagnostic marks.
Fixes: QTCREATORBUG-26585
Change-Id: Idc41fce5de4ade68f4a29c23ba02844701b44d3c
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | src/plugins/languageclient/client.cpp | 2 | ||||
-rw-r--r-- | src/plugins/languageclient/diagnosticmanager.cpp | 33 | ||||
-rw-r--r-- | src/plugins/languageclient/diagnosticmanager.h | 4 |
3 files changed, 19 insertions, 20 deletions
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index eb2633fef1..79a6782e06 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -617,7 +617,7 @@ void Client::activateDocument(TextEditor::TextDocument *document) void Client::deactivateDocument(TextEditor::TextDocument *document) { - m_diagnosticManager.hideDiagnostics(document); + m_diagnosticManager.hideDiagnostics(document->filePath()); resetAssistProviders(document); document->setFormatter(nullptr); m_tokenSupport.clearHighlight(document); diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index 3336726a72..cdaadb7d4a 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -88,26 +88,19 @@ void DiagnosticManager::setDiagnostics(const LanguageServerProtocol::DocumentUri const QList<LanguageServerProtocol::Diagnostic> &diagnostics, const Utils::optional<int> &version) { - removeDiagnostics(uri); + hideDiagnostics(uri.toFilePath()); m_diagnostics[uri] = {version, diagnostics}; } -void DiagnosticManager::hideDiagnostics(TextDocument *doc) +void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath) { - if (!doc) - return; - if (m_hideHandler) m_hideHandler(); - for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) - editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, {}); - qDeleteAll(Utils::filtered(doc->marks(), Utils::equal(&TextMark::category, m_client->id()))); -} - -void DiagnosticManager::removeDiagnostics(const LanguageServerProtocol::DocumentUri &uri) -{ - hideDiagnostics(TextDocument::textDocumentForFilePath(uri.toFilePath())); - m_diagnostics.remove(uri); + if (auto doc = TextDocument::textDocumentForFilePath(filePath)) { + for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) + editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, {}); + } + qDeleteAll(m_marks.take(filePath)); } static QTextEdit::ExtraSelection toDiagnosticsSelections(const Diagnostic &diagnostic, @@ -130,11 +123,11 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) const FilePath &filePath = uri.toFilePath(); if (TextDocument *doc = TextDocument::textDocumentForFilePath(filePath)) { QList<QTextEdit::ExtraSelection> extraSelections; - const VersionedDiagnostics &versionedDiagnostics = m_diagnostics.value(uri); + const VersionedDiagnostics &versionedDiagnostics = m_diagnostics.value(uri); if (versionedDiagnostics.version.value_or(version) == version) { for (const Diagnostic &diagnostic : versionedDiagnostics.diagnostics) { extraSelections << toDiagnosticsSelections(diagnostic, doc->document()); - doc->addMark(m_textMarkCreator(filePath, diagnostic)); + m_marks[filePath].append(m_textMarkCreator(filePath, diagnostic)); } } @@ -164,7 +157,13 @@ TextEditor::TextMark *DiagnosticManager::createTextMark(const FilePath &filePath void DiagnosticManager::clearDiagnostics() { for (const DocumentUri &uri : m_diagnostics.keys()) - removeDiagnostics(uri); + hideDiagnostics(uri.toFilePath()); + m_diagnostics.clear(); + if (!QTC_GUARD(m_marks.isEmpty())) { + for (const QList<TextEditor::TextMark *> &marks : qAsConst(m_marks)) + qDeleteAll(marks); + m_marks.clear(); + } } QList<Diagnostic> DiagnosticManager::diagnosticsAt(const DocumentUri &uri, diff --git a/src/plugins/languageclient/diagnosticmanager.h b/src/plugins/languageclient/diagnosticmanager.h index e3a2aefcc8..a7e2e47485 100644 --- a/src/plugins/languageclient/diagnosticmanager.h +++ b/src/plugins/languageclient/diagnosticmanager.h @@ -56,10 +56,9 @@ public: void setDiagnostics(const LanguageServerProtocol::DocumentUri &uri, const QList<LanguageServerProtocol::Diagnostic> &diagnostics, const Utils::optional<int> &version); - void removeDiagnostics(const LanguageServerProtocol::DocumentUri &uri); void showDiagnostics(const LanguageServerProtocol::DocumentUri &uri, int version); - void hideDiagnostics(TextEditor::TextDocument *doc); + void hideDiagnostics(const Utils::FilePath &filePath); void clearDiagnostics(); @@ -81,6 +80,7 @@ private: QList<LanguageServerProtocol::Diagnostic> diagnostics; }; QMap<LanguageServerProtocol::DocumentUri, VersionedDiagnostics> m_diagnostics; + QMap<Utils::FilePath, QList<TextEditor::TextMark *>> m_marks; TextMarkCreator m_textMarkCreator; HideDiagnosticsHandler m_hideHandler; Client *m_client; |