From e5fbeb62190696ec2a067476a7408f7b2370c154 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 28 Jan 2019 11:43:18 +0100 Subject: Clang: Add API to convert diagnostics to plain text This is for a follow-up change that will allow to copy the diagnostic text from the tooltip to the clipboard. Change-Id: Iad5343a819c84ca83d562f69dcf2f50e1d4785c4 Reviewed-by: Ivan Donchevskii --- .../clangdiagnostictooltipwidget.cpp | 48 +++++++++++++--------- .../clangcodemodel/clangdiagnostictooltipwidget.h | 6 ++- .../clangeditordocumentprocessor.cpp | 7 ++-- src/plugins/clangcodemodel/clangtextmark.cpp | 3 +- 4 files changed, 38 insertions(+), 26 deletions(-) (limited to 'src/plugins/clangcodemodel') diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index d92b5d67ac..9fcec8d6b5 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include using namespace ClangCodeModel; @@ -101,16 +102,6 @@ public: bool allowTextSelection; }; - static QWidget *create(const QVector &diagnostics, - const DisplayHints &displayHints) - { - WidgetFromDiagnostics converter(displayHints); - return converter.createWidget(diagnostics); - } - -private: - enum class IndentMode { Indent, DoNotIndent }; - WidgetFromDiagnostics(const DisplayHints &displayHints) : m_displayHints(displayHints) { @@ -177,6 +168,9 @@ private: return text; } +private: + enum class IndentMode { Indent, DoNotIndent }; + static bool isClazyOption(const QString &option) { return option.startsWith("-Wclazy"); } class DiagnosticTextInfo @@ -446,18 +440,11 @@ private: QString m_mainFilePath; }; -} // anonymous namespace - -namespace ClangCodeModel { -namespace Internal { - -QWidget *ClangDiagnosticWidget::create( - const QVector &diagnostics, - const Destination &destination) +WidgetFromDiagnostics::DisplayHints toHints(const ClangDiagnosticWidget::Destination &destination) { WidgetFromDiagnostics::DisplayHints hints; - if (destination == ToolTip) { + if (destination == ClangDiagnosticWidget::ToolTip) { hints.showCategoryAndEnableOption = true; hints.showFileNameInMainDiagnostic = false; hints.enableClickableFixits = true; @@ -474,7 +461,28 @@ QWidget *ClangDiagnosticWidget::create( hints.allowTextSelection = true; } - return WidgetFromDiagnostics::create(diagnostics, hints); + return hints; +} + +} // anonymous namespace + +namespace ClangCodeModel { +namespace Internal { + +QString ClangDiagnosticWidget::createText( + const QVector &diagnostics, + const ClangDiagnosticWidget::Destination &destination) +{ + const QString htmlText = WidgetFromDiagnostics(toHints(destination)).htmlText(diagnostics); + QTextDocument document; + document.setHtml(htmlText); + return document.toPlainText(); +} + +QWidget *ClangDiagnosticWidget::createWidget( + const QVector &diagnostics, const Destination &destination) +{ + return WidgetFromDiagnostics(toHints(destination)).createWidget(diagnostics); } } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h index 91fdfc67d6..6469a0ff5f 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h @@ -38,8 +38,10 @@ class ClangDiagnosticWidget { public: enum Destination { ToolTip, InfoBar }; - static QWidget *create(const QVector &diagnostics, - const Destination &destination); + static QString createText(const QVector &diagnostics, + const Destination &destination); + static QWidget *createWidget(const QVector &diagnostics, + const Destination &destination); }; } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index f7bf55a242..8e1d06da6c 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -306,7 +306,8 @@ void ClangEditorDocumentProcessor::addDiagnosticToolTipToLayout(uint line, const QVector diagnostics = m_diagnosticManager.diagnosticsAt(line, column); - target->addWidget(ClangDiagnosticWidget::create(diagnostics, ClangDiagnosticWidget::ToolTip)); + target->addWidget( + ClangDiagnosticWidget::createWidget(diagnostics, ClangDiagnosticWidget::ToolTip)); auto link = TextEditor::DisplaySettings::createAnnotationSettingsLink(); target->addWidget(link); target->setAlignment(link, Qt::AlignRight); @@ -648,8 +649,8 @@ ClangEditorDocumentProcessor::creatorForHeaderErrorDiagnosticWidget( vbox->setContentsMargins(10, 0, 0, 2); vbox->setSpacing(2); - vbox->addWidget(ClangDiagnosticWidget::create({firstHeaderErrorDiagnostic}, - ClangDiagnosticWidget::InfoBar)); + vbox->addWidget(ClangDiagnosticWidget::createWidget({firstHeaderErrorDiagnostic}, + ClangDiagnosticWidget::InfoBar)); auto widget = new QWidget; widget->setLayout(vbox); diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index 51447e9147..0b66305d6e 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -101,7 +101,8 @@ bool ClangTextMark::addToolTipContent(QLayout *target) const { using Internal::ClangDiagnosticWidget; - QWidget *widget = ClangDiagnosticWidget::create({m_diagnostic}, ClangDiagnosticWidget::ToolTip); + QWidget *widget = ClangDiagnosticWidget::createWidget({m_diagnostic}, + ClangDiagnosticWidget::ToolTip); target->addWidget(widget); return true; -- cgit v1.2.1