diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index fa1d22e3120..3336726a72f 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -73,7 +73,11 @@ private: DiagnosticManager::DiagnosticManager(Client *client) : m_client(client) -{} +{ + m_textMarkCreator = [this](const FilePath &filePath, const Diagnostic &diagnostic) { + return createTextMark(filePath, diagnostic); + }; +} DiagnosticManager::~DiagnosticManager() { @@ -128,25 +132,9 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) QList extraSelections; const VersionedDiagnostics &versionedDiagnostics = m_diagnostics.value(uri); if (versionedDiagnostics.version.value_or(version) == version) { - const auto icon = QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon()); - const QString tooltip = tr("Copy to Clipboard"); for (const Diagnostic &diagnostic : versionedDiagnostics.diagnostics) { extraSelections << toDiagnosticsSelections(diagnostic, doc->document()); - if (m_textMarkCreator) { - doc->addMark(m_textMarkCreator(filePath, diagnostic)); - continue; - } - - QAction *action = new QAction(); - action->setIcon(icon); - action->setToolTip(tooltip); - QObject::connect(action, &QAction::triggered, [text = diagnostic.message()]() { - QApplication::clipboard()->setText(text); - }); - auto mark = new TextMark(filePath, diagnostic, m_client->id()); - mark->setActions({action}); - - doc->addMark(mark); + doc->addMark(m_textMarkCreator(filePath, diagnostic)); } } @@ -157,6 +145,22 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) } } +TextEditor::TextMark *DiagnosticManager::createTextMark(const FilePath &filePath, + const Diagnostic &diagnostic) const +{ + static const auto icon = QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon()); + static const QString tooltip = tr("Copy to Clipboard"); + QAction *action = new QAction(); + action->setIcon(icon); + action->setToolTip(tooltip); + QObject::connect(action, &QAction::triggered, [text = diagnostic.message()]() { + QApplication::clipboard()->setText(text); + }); + auto mark = new TextMark(filePath, diagnostic, m_client->id()); + mark->setActions({action}); + return mark; +} + 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 d876a8150de..e3a2aefcc8e 100644 --- a/src/plugins/languageclient/diagnosticmanager.h +++ b/src/plugins/languageclient/diagnosticmanager.h @@ -74,6 +74,8 @@ public: const HideDiagnosticsHandler &removalHandler); private: + TextEditor::TextMark *createTextMark(const Utils::FilePath &filePath, + const LanguageServerProtocol::Diagnostic &diagnostic) const; struct VersionedDiagnostics { Utils::optional version; QList diagnostics;