ClangCodeModel: Provide source of diagnostics in tooltip

It's helpful to know whether a particular issue came from clangd,
libclang, or somewhere else.

Change-Id: I9e00d79ffe630a91028c2aeff219571e9979dbee
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-10-12 13:44:35 +02:00
parent 1b16eb209c
commit c92deea33f
4 changed files with 23 additions and 11 deletions

View File

@@ -104,9 +104,9 @@ public:
} }
QWidget *createWidget(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, QWidget *createWidget(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
const std::function<bool()> &canApplyFixIt) const std::function<bool()> &canApplyFixIt, const QString &source)
{ {
const QString text = htmlText(diagnostics); const QString text = htmlText(diagnostics, source);
auto *label = new QLabel; auto *label = new QLabel;
label->setTextFormat(Qt::RichText); label->setTextFormat(Qt::RichText);
@@ -154,13 +154,20 @@ public:
return label; return label;
} }
QString htmlText(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics) QString htmlText(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
const QString &source)
{ {
// For debugging, add: style='border-width:1px;border-color:black' // For debugging, add: style='border-width:1px;border-color:black'
QString text = "<table cellspacing='0' cellpadding='0' width='100%'>"; QString text = "<table cellspacing='0' cellpadding='0' width='100%'>";
foreach (const ClangBackEnd::DiagnosticContainer &diagnostic, diagnostics) foreach (const ClangBackEnd::DiagnosticContainer &diagnostic, diagnostics)
text.append(tableRows(diagnostic)); text.append(tableRows(diagnostic));
if (!source.isEmpty()) {
text.append(QString::fromUtf8("<tr><td colspan='2' align='left'>"
"<font color='gray'>%1</font></td></tr>")
.arg(QCoreApplication::translate("ClangDiagnosticWidget", "[Source: %1]"))
.arg(source));
}
text.append("</table>"); text.append("</table>");
@@ -396,7 +403,8 @@ QString ClangDiagnosticWidget::createText(
const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
const ClangDiagnosticWidget::Destination &destination) const ClangDiagnosticWidget::Destination &destination)
{ {
const QString htmlText = WidgetFromDiagnostics(toHints(destination, {})).htmlText(diagnostics); const QString htmlText = WidgetFromDiagnostics(toHints(destination, {}))
.htmlText(diagnostics, {});
QTextDocument document; QTextDocument document;
document.setHtml(htmlText); document.setHtml(htmlText);
@@ -410,11 +418,13 @@ QString ClangDiagnosticWidget::createText(
return text; return text;
} }
QWidget *ClangDiagnosticWidget::createWidget(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, QWidget *ClangDiagnosticWidget::createWidget(
const Destination &destination, const std::function<bool()> &canApplyFixIt) const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
const Destination &destination, const std::function<bool()> &canApplyFixIt,
const QString &source)
{ {
return WidgetFromDiagnostics(toHints(destination, canApplyFixIt)) return WidgetFromDiagnostics(toHints(destination, canApplyFixIt))
.createWidget(diagnostics, canApplyFixIt); .createWidget(diagnostics, canApplyFixIt, source);
} }
} // namespace Internal } // namespace Internal

View File

@@ -48,7 +48,8 @@ public:
static QWidget *createWidget(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, static QWidget *createWidget(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
const Destination &destination, const Destination &destination,
const std::function<bool()> &canApplyFixIt); const std::function<bool()> &canApplyFixIt,
const QString &source);
}; };
} // namespace Internal } // namespace Internal

View File

@@ -506,7 +506,8 @@ ClangEditorDocumentProcessor::creatorForHeaderErrorDiagnosticWidget(
vbox->setSpacing(2); vbox->setSpacing(2);
vbox->addWidget(ClangDiagnosticWidget::createWidget({firstHeaderErrorDiagnostic}, vbox->addWidget(ClangDiagnosticWidget::createWidget({firstHeaderErrorDiagnostic},
ClangDiagnosticWidget::InfoBar, {})); ClangDiagnosticWidget::InfoBar, {},
"libclang"));
auto widget = new QWidget; auto widget = new QWidget;
widget->setLayout(vbox); widget->setLayout(vbox);

View File

@@ -281,7 +281,7 @@ bool ClangTextMark::addToolTipContent(QLayout *target) const
&& diagMgr->diagnosticsWithFixIts().contains(diag); && diagMgr->diagnosticsWithFixIts().contains(diag);
}; };
QWidget *widget = ClangDiagnosticWidget::createWidget( QWidget *widget = ClangDiagnosticWidget::createWidget(
{m_diagnostic}, ClangDiagnosticWidget::ToolTip, canApplyFixIt); {m_diagnostic}, ClangDiagnosticWidget::ToolTip, canApplyFixIt, "libclang");
target->addWidget(widget); target->addWidget(widget);
return true; return true;
@@ -398,7 +398,7 @@ bool ClangdTextMark::addToolTipContent(QLayout *target) const
return c && c->reachable() && c->hasDiagnostic(DocumentUri::fromFilePath(fp), diag); return c && c->reachable() && c->hasDiagnostic(DocumentUri::fromFilePath(fp), diag);
}; };
target->addWidget(ClangDiagnosticWidget::createWidget({m_diagnostic}, target->addWidget(ClangDiagnosticWidget::createWidget({m_diagnostic},
ClangDiagnosticWidget::ToolTip, canApplyFixIt)); ClangDiagnosticWidget::ToolTip, canApplyFixIt, "clangd"));
return true; return true;
} }