Clang: Improve diagnostic tooltips for tidy/clazy

Introduce the header for tidy/clazy issues showing "Clang-Tidy Issue" / "Clazy
Issue" and the option that led to the warning, as for normal clang
diagnostics.

Having that, chop off the option in the text to avoid redundancy.

Change-Id: I30a87dc739faa38c51d9e1fb5b9dfc7ffb7055c5
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Nikolai Kosjar
2018-05-11 12:47:54 +02:00
parent 53d7906061
commit 6afd9ecaf3

View File

@@ -157,20 +157,90 @@ private:
return text; return text;
} }
class DiagnosticTextInfo
{
public:
DiagnosticTextInfo(const QString &text)
: m_text(text)
, m_squareBracketStartIndex(text.lastIndexOf('['))
{}
QString textWithoutOption() const
{
if (m_squareBracketStartIndex == -1)
return m_text;
return m_text.mid(0, m_squareBracketStartIndex - 1);
}
QString option() const
{
if (m_squareBracketStartIndex == -1)
return QString();
const int index = m_squareBracketStartIndex + 1;
return m_text.mid(index, m_text.count() - index - 1);
}
QString category() const
{
if (m_squareBracketStartIndex == -1)
return QString();
const int index = m_squareBracketStartIndex + 1;
if (m_text.midRef(index).startsWith("-Wclazy"))
return QCoreApplication::translate("ClangDiagnosticWidget", "Clazy Issue");
else
return QCoreApplication::translate("ClangDiagnosticWidget", "Clang-Tidy Issue");
}
private:
const QString m_text;
const int m_squareBracketStartIndex;
};
// Diagnostics from clazy/tidy do not have any category or option set but
// we will conclude them from the diagnostic message.
//
// Ideally, libclang should provide the correct category/option by default.
// However, tidy and clazy diagnostics use "custom diagnostic ids" and
// clang's static diagnostic table does not know anything about them.
//
// For clazy/tidy diagnostics, we expect something like "some text [some option]", e.g.:
// * clazy: "Use the static QFileInfo::exists() instead. It's documented to be faster. [-Wclazy-qfileinfo-exists]"
// * tidy: "use emplace_back instead of push_back [modernize-use-emplace]"
static ClangBackEnd::DiagnosticContainer supplementedDiagnostic(
const ClangBackEnd::DiagnosticContainer &diagnostic)
{
if (!diagnostic.category.isEmpty() && !diagnostic.enableOption.isEmpty())
return diagnostic; // OK, diagnostics from clang have this set.
ClangBackEnd::DiagnosticContainer supplementedDiagnostic = diagnostic;
DiagnosticTextInfo info(diagnostic.text);
supplementedDiagnostic.enableOption = info.option();
supplementedDiagnostic.category = info.category();
supplementedDiagnostic.text = info.textWithoutOption();
for (auto &child : supplementedDiagnostic.children)
child.text = DiagnosticTextInfo(diagnostic.text.toString()).textWithoutOption();
return supplementedDiagnostic;
}
QString tableRows(const ClangBackEnd::DiagnosticContainer &diagnostic) QString tableRows(const ClangBackEnd::DiagnosticContainer &diagnostic)
{ {
m_mainFilePath = m_displayHints.showFileNameInMainDiagnostic m_mainFilePath = m_displayHints.showFileNameInMainDiagnostic
? Utf8String() ? Utf8String()
: diagnostic.location.filePath; : diagnostic.location.filePath;
QString text; const ClangBackEnd::DiagnosticContainer diag = supplementedDiagnostic(diagnostic);
// Diagnostics from clazy/tidy do not have any category or option set, so QString text;
// avoid to add an empty line. if (m_displayHints.showCategoryAndEnableOption)
if (m_displayHints.showCategoryAndEnableOption && !diagnostic.category.isEmpty()) text.append(diagnosticCategoryAndEnableOptionRow(diag));
text.append(diagnosticCategoryAndEnableOptionRow(diagnostic)); text.append(diagnosticRow(diag, IndentMode::DoNotIndent));
text.append(diagnosticRow(diagnostic, IndentMode::DoNotIndent)); text.append(diagnosticRowsForChildren(diag));
text.append(diagnosticRowsForChildren(diagnostic));
return text; return text;
} }