ClangTools: Make sure clazy doc URL corresponds to tool version

Note that this will only work with clazy >= 1.10. For earlier versions,
we fall back to the master branch documentation, as before.

Fixes: QTCREATORBUG-25869
Change-Id: I7a8188eda15c4e0548bfaa63aa90f721aa44d6c2
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2021-07-26 15:42:28 +02:00
parent c5d080570b
commit 1b1e18a869
7 changed files with 35 additions and 13 deletions

View File

@@ -227,8 +227,7 @@ QVersionNumber ClangToolsSettings::clangTidyVersion()
QVersionNumber ClangToolsSettings::clazyVersion() QVersionNumber ClangToolsSettings::clazyVersion()
{ {
return getVersionNumber(instance()->m_clazyVersion, return ClazyStandaloneInfo(ClangTools::Internal::clazyStandaloneExecutable()).version;
ClangTools::Internal::clazyStandaloneExecutable());
} }
} // namespace Internal } // namespace Internal

View File

@@ -304,7 +304,7 @@ QString documentationUrl(const QString &checkName)
const QString clangStaticAnalyzerPrefix = "clang-analyzer-core."; const QString clangStaticAnalyzerPrefix = "clang-analyzer-core.";
if (name.startsWith(clazyPrefix)) { if (name.startsWith(clazyPrefix)) {
name = checkName.mid(clazyPrefix.length()); name = checkName.mid(clazyPrefix.length());
url = QString(CppTools::Constants::CLAZY_DOCUMENTATION_URL_TEMPLATE).arg(name); url = clazyDocUrl(name);
} else if (name.startsWith(clangStaticAnalyzerPrefix)) { } else if (name.startsWith(clangStaticAnalyzerPrefix)) {
url = CppTools::Constants::CLANG_STATIC_ANALYZER_DOCUMENTATION_URL; url = CppTools::Constants::CLANG_STATIC_ANALYZER_DOCUMENTATION_URL;
} else { } else {
@@ -362,5 +362,16 @@ QString clangTidyDocUrl(const QString &check)
return QString::fromLatin1(urlTemplate).arg(version.toString(), check); return QString::fromLatin1(urlTemplate).arg(version.toString(), check);
} }
QString clazyDocUrl(const QString &check)
{
QVersionNumber version = ClangToolsSettings::clazyVersion();
if (!version.isNull())
version = QVersionNumber(version.majorVersion(), version.minorVersion(), 0);
const QString versionString = version.isNull() ? "master" : version.toString();
static const char urlTemplate[]
= "https://github.com/KDE/clazy/blob/%1/docs/checks/README-%2.md";
return QString::fromLatin1(urlTemplate).arg(versionString, check);
}
} // namespace Internal } // namespace Internal
} // namespace ClangTools } // namespace ClangTools

View File

@@ -43,6 +43,7 @@ namespace ClangTools {
namespace Internal { namespace Internal {
QString clangTidyDocUrl(const QString &check); QString clangTidyDocUrl(const QString &check);
QString clazyDocUrl(const QString &check);
class Diagnostic; class Diagnostic;

View File

@@ -629,8 +629,7 @@ private:
if (role == LinkRole || role == Qt::ToolTipRole) { if (role == LinkRole || role == Qt::ToolTipRole) {
if (node->check.name.isEmpty()) if (node->check.name.isEmpty())
return QVariant(); return QVariant();
return QString::fromUtf8(CppTools::Constants::CLAZY_DOCUMENTATION_URL_TEMPLATE) return clazyDocUrl(node->name);
.arg(node->name);
} }
if (role == Qt::DisplayRole && node->kind != ClazyChecksTree::CheckNode) if (role == Qt::DisplayRole && node->kind != ClazyChecksTree::CheckNode)
return QVariant(); return QVariant();

View File

@@ -166,7 +166,23 @@ ClangTidyInfo::ClangTidyInfo(const QString &executablePath)
ClazyStandaloneInfo::ClazyStandaloneInfo(const QString &executablePath) ClazyStandaloneInfo::ClazyStandaloneInfo(const QString &executablePath)
: defaultChecks(queryClangTidyChecks(executablePath, {})) // Yup, behaves as clang-tidy. : defaultChecks(queryClangTidyChecks(executablePath, {})) // Yup, behaves as clang-tidy.
, supportedChecks(querySupportedClazyChecks(executablePath)) , supportedChecks(querySupportedClazyChecks(executablePath))
{} {
QString output = runExecutable(CommandLine(executablePath, {"--version"}),
QueryFailMode::Silent);
QTextStream stream(&output);
while (!stream.atEnd()) {
// It's just "clazy version " right now, but let's be prepared for someone adding a colon
// later on.
static const QStringList versionPrefixes{"clazy version ", "clazy version: "};
const QString line = stream.readLine().simplified();
for (const QString &prefix : versionPrefixes) {
if (line.startsWith(prefix)) {
version = QVersionNumber::fromString(line.mid(prefix.length()));
break;
}
}
}
}
static FilePath queryResourceDir(const FilePath &clangToolPath) static FilePath queryResourceDir(const FilePath &clangToolPath)
{ {

View File

@@ -30,6 +30,7 @@
#include <QPair> #include <QPair>
#include <QStringList> #include <QStringList>
#include <QVector> #include <QVector>
#include <QVersionNumber>
namespace ClangTools { namespace ClangTools {
namespace Internal { namespace Internal {
@@ -60,6 +61,8 @@ class ClazyStandaloneInfo
{ {
public: public:
ClazyStandaloneInfo(const QString &executablePath); ClazyStandaloneInfo(const QString &executablePath);
QVersionNumber version;
QStringList defaultChecks; QStringList defaultChecks;
ClazyChecks supportedChecks; ClazyChecks supportedChecks;
}; };

View File

@@ -98,12 +98,5 @@ const char SYMBOLS_FIND_FILTER_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("CppTools", "C
constexpr const char CLANG_STATIC_ANALYZER_DOCUMENTATION_URL[] constexpr const char CLANG_STATIC_ANALYZER_DOCUMENTATION_URL[]
= "https://clang-analyzer.llvm.org/available_checks.html"; = "https://clang-analyzer.llvm.org/available_checks.html";
// CLANG-UPGRADE-CHECK: Checks/update URLs.
//
// Once it gets dedicated documentation pages for released versions,
// use them instead of pointing to master, as checks might vanish.
constexpr const char CLAZY_DOCUMENTATION_URL_TEMPLATE[]
= "https://github.com/KDE/clazy/blob/master/docs/checks/README-%1.md";
} // namespace Constants } // namespace Constants
} // namespace CppTools } // namespace CppTools