From 71b84417b3f0d62e335d00d6e8b76fc68755abff Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 12 Apr 2022 14:37:29 +0200 Subject: [PATCH] LanguageClient: allow generating specialized extra selections for LanguageClient Diagnostics Change-Id: Ib7226aaaa420d4c7531b9c534ab193d1b22b467d Reviewed-by: Christian Stenger --- .../languageclient/diagnosticmanager.cpp | 51 ++++++++++--------- .../languageclient/diagnosticmanager.h | 11 +++- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index deac1279dc1..f3bb4521a77 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -40,7 +40,6 @@ #include #include #include -#include using namespace LanguageServerProtocol; using namespace Utils; @@ -68,6 +67,7 @@ public: DiagnosticManager::DiagnosticManager(Client *client) : m_client(client) + , m_extraSelectionsId(TextEditorWidget::CodeWarningsSelection) { } @@ -88,7 +88,7 @@ void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath) { if (auto doc = TextDocument::textDocumentForFilePath(filePath)) { for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) - editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, {}); + editor->editorWidget()->setExtraSelections(m_extraSelectionsId, {}); } qDeleteAll(m_marks.take(filePath)); } @@ -98,21 +98,6 @@ QList DiagnosticManager::filteredDiagnostics(const QList return diagnostics; } -static QTextEdit::ExtraSelection toDiagnosticsSelections(const Diagnostic &diagnostic, - QTextDocument *textDocument) -{ - QTextCursor cursor(textDocument); - cursor.setPosition(diagnostic.range().start().toPositionInDocument(textDocument)); - cursor.setPosition(diagnostic.range().end().toPositionInDocument(textDocument), - QTextCursor::KeepAnchor); - - const FontSettings &fontSettings = TextEditorSettings::fontSettings(); - const DiagnosticSeverity severity = diagnostic.severity().value_or(DiagnosticSeverity::Warning); - const TextStyle style = severity == DiagnosticSeverity::Error ? C_ERROR : C_WARNING; - - return QTextEdit::ExtraSelection{cursor, fontSettings.toTextCharFormat(style)}; -} - void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) { const FilePath &filePath = uri.toFilePath(); @@ -120,22 +105,20 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) QList extraSelections; const VersionedDiagnostics &versionedDiagnostics = m_diagnostics.value(uri); if (versionedDiagnostics.version.value_or(version) == version - && !versionedDiagnostics.diagnostics.isEmpty()) { + && !versionedDiagnostics.diagnostics.isEmpty()) { QList &marks = m_marks[filePath]; const bool isProjectFile = m_client->project() && m_client->project()->isKnownFile(filePath); for (const Diagnostic &diagnostic : versionedDiagnostics.diagnostics) { - extraSelections << toDiagnosticsSelections(diagnostic, doc->document()); + extraSelections << createDiagnosticSelection(diagnostic, doc->document()); marks.append(createTextMark(filePath, diagnostic, isProjectFile)); } if (!marks.isEmpty()) emit textMarkCreated(filePath); } - for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) { - editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, - extraSelections); - } + for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) + editor->editorWidget()->setExtraSelections(m_extraSelectionsId, extraSelections); } } @@ -156,6 +139,28 @@ TextEditor::TextMark *DiagnosticManager::createTextMark(const FilePath &filePath return mark; } +QTextEdit::ExtraSelection DiagnosticManager::createDiagnosticSelection( + const LanguageServerProtocol::Diagnostic &diagnostic, QTextDocument *textDocument) const +{ + QTextCursor cursor(textDocument); + cursor.setPosition(diagnostic.range().start().toPositionInDocument(textDocument)); + cursor.setPosition(diagnostic.range().end().toPositionInDocument(textDocument), + QTextCursor::KeepAnchor); + + const FontSettings &fontSettings = TextEditorSettings::fontSettings(); + const DiagnosticSeverity severity = diagnostic.severity().value_or(DiagnosticSeverity::Warning); + const TextStyle style = severity == DiagnosticSeverity::Error ? C_ERROR : C_WARNING; + + return QTextEdit::ExtraSelection{cursor, fontSettings.toTextCharFormat(style)}; +} + +void DiagnosticManager::setExtraSelectionsId(const Utils::Id &extraSelectionsId) +{ + // this function should be called before any diagnostics are handled + QTC_CHECK(m_diagnostics.isEmpty()); + m_extraSelectionsId = extraSelectionsId; +} + void DiagnosticManager::clearDiagnostics() { for (const DocumentUri &uri : m_diagnostics.keys()) diff --git a/src/plugins/languageclient/diagnosticmanager.h b/src/plugins/languageclient/diagnosticmanager.h index b6366752ce1..8844eaeb7f8 100644 --- a/src/plugins/languageclient/diagnosticmanager.h +++ b/src/plugins/languageclient/diagnosticmanager.h @@ -32,6 +32,7 @@ #include #include +#include #include @@ -49,7 +50,7 @@ class LANGUAGECLIENT_EXPORT DiagnosticManager : public QObject Q_OBJECT public: explicit DiagnosticManager(Client *client); - ~DiagnosticManager(); + ~DiagnosticManager() override; virtual void setDiagnostics(const LanguageServerProtocol::DocumentUri &uri, const QList &diagnostics, @@ -77,15 +78,21 @@ protected: virtual TextEditor::TextMark *createTextMark(const Utils::FilePath &filePath, const LanguageServerProtocol::Diagnostic &diagnostic, bool isProjectFile) const; + virtual QTextEdit::ExtraSelection createDiagnosticSelection( + const LanguageServerProtocol::Diagnostic &diagnostic, QTextDocument *textDocument) const; + + void setExtraSelectionsId(const Utils::Id &extraSelectionsId); private: - struct VersionedDiagnostics { + struct VersionedDiagnostics + { Utils::optional version; QList diagnostics; }; QMap m_diagnostics; QMap> m_marks; Client *m_client; + Utils::Id m_extraSelectionsId; }; } // namespace LanguageClient