From bf275331dd28b4706127029d2941b9163461ae14 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 8 Sep 2021 12:08:55 +0200 Subject: [PATCH] ClangTools: Cache information about the clazy executable Fixes: QTCREATORBUG-26237 Change-Id: I43203d58b8ed278664427e3b4112a7c7848354b9 Reviewed-by: David Schulz --- src/plugins/clangtools/clangtoolssettings.cpp | 2 +- .../clangtools/diagnosticconfigswidget.cpp | 5 +++-- src/plugins/clangtools/executableinfo.cpp | 19 +++++++++++++++++++ src/plugins/clangtools/executableinfo.h | 9 ++++++++- src/plugins/clangtools/runsettingswidget.cpp | 2 +- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/plugins/clangtools/clangtoolssettings.cpp b/src/plugins/clangtools/clangtoolssettings.cpp index bab2cc5b507..08b10a1c9ad 100644 --- a/src/plugins/clangtools/clangtoolssettings.cpp +++ b/src/plugins/clangtools/clangtoolssettings.cpp @@ -227,7 +227,7 @@ QVersionNumber ClangToolsSettings::clangTidyVersion() QVersionNumber ClangToolsSettings::clazyVersion() { - return ClazyStandaloneInfo(ClangTools::Internal::clazyStandaloneExecutable()).version; + return ClazyStandaloneInfo::getInfo(ClangTools::Internal::clazyStandaloneExecutable()).version; } } // namespace Internal diff --git a/src/plugins/clangtools/diagnosticconfigswidget.cpp b/src/plugins/clangtools/diagnosticconfigswidget.cpp index 4c10136dc4d..ac899ff7588 100644 --- a/src/plugins/clangtools/diagnosticconfigswidget.cpp +++ b/src/plugins/clangtools/diagnosticconfigswidget.cpp @@ -1140,7 +1140,7 @@ QString removeClangTidyCheck(const QString &checks, const QString &check) QString removeClazyCheck(const QString &checks, const QString &check) { - const ClazyStandaloneInfo clazyInfo(clazyStandaloneExecutable()); + const ClazyStandaloneInfo clazyInfo = ClazyStandaloneInfo::getInfo(clazyStandaloneExecutable()); ClazyChecksTreeModel model(clazyInfo.supportedChecks); model.enableChecks(checks.split(',', Qt::SkipEmptyParts)); const QModelIndex index = model.indexForName(check.mid(QString("clazy-").length())); @@ -1190,7 +1190,8 @@ void disableChecks(const QList &diagnostics) if (diag.name.startsWith("clazy-")) { if (config.clazyMode() == ClangDiagnosticConfig::ClazyMode::UseDefaultChecks) { config.setClazyMode(ClangDiagnosticConfig::ClazyMode::UseCustomChecks); - const ClazyStandaloneInfo clazyInfo(clazyStandaloneExecutable()); + const ClazyStandaloneInfo clazyInfo + = ClazyStandaloneInfo::getInfo(clazyStandaloneExecutable()); config.setClazyChecks(clazyInfo.defaultChecks.join(',')); } config.setClazyChecks(removeClazyCheck(config.clazyChecks(), diag.name)); diff --git a/src/plugins/clangtools/executableinfo.cpp b/src/plugins/clangtools/executableinfo.cpp index 57a4aca7193..e91e74b028d 100644 --- a/src/plugins/clangtools/executableinfo.cpp +++ b/src/plugins/clangtools/executableinfo.cpp @@ -163,6 +163,23 @@ ClangTidyInfo::ClangTidyInfo(const QString &executablePath) , supportedChecks(queryClangTidyChecks(executablePath, "-checks=*")) {} +ClazyStandaloneInfo ClazyStandaloneInfo::getInfo(const QString &_executablePath) +{ + const FilePath executablePath = FilePath::fromString(_executablePath); + const QDateTime timeStamp = executablePath.lastModified(); + const auto it = cache.find(executablePath); + if (it == cache.end()) { + const ClazyStandaloneInfo info(executablePath.toString()); + cache.insert(executablePath, qMakePair(timeStamp, info)); + return info; + } + if (it->first != timeStamp) { + it->first = timeStamp; + it->second = ClazyStandaloneInfo(executablePath.toString()); + } + return it->second; +} + ClazyStandaloneInfo::ClazyStandaloneInfo(const QString &executablePath) : defaultChecks(queryClangTidyChecks(executablePath, {})) // Yup, behaves as clang-tidy. , supportedChecks(querySupportedClazyChecks(executablePath)) @@ -229,5 +246,7 @@ QPair getClangIncludeDirAndVersion(const FilePath &clangToolP return qMakePair(dynamicResourceDir + "/include", dynamicVersion); } +QHash> ClazyStandaloneInfo::cache; + } // namespace Internal } // namespace ClangTools diff --git a/src/plugins/clangtools/executableinfo.h b/src/plugins/clangtools/executableinfo.h index 55fd6d1f0e6..5362e9639a6 100644 --- a/src/plugins/clangtools/executableinfo.h +++ b/src/plugins/clangtools/executableinfo.h @@ -27,6 +27,8 @@ #include +#include +#include #include #include #include @@ -60,11 +62,16 @@ using ClazyChecks = QVector; class ClazyStandaloneInfo { public: - ClazyStandaloneInfo(const QString &executablePath); + static ClazyStandaloneInfo getInfo(const QString &executablePath); QVersionNumber version; QStringList defaultChecks; ClazyChecks supportedChecks; + +private: + ClazyStandaloneInfo(const QString &executablePath); + + static QHash> cache; }; } // namespace Internal diff --git a/src/plugins/clangtools/runsettingswidget.cpp b/src/plugins/clangtools/runsettingswidget.cpp index 64fd25836e1..51d3e3f2c05 100644 --- a/src/plugins/clangtools/runsettingswidget.cpp +++ b/src/plugins/clangtools/runsettingswidget.cpp @@ -80,7 +80,7 @@ static CppTools::ClangDiagnosticConfigsWidget *createEditWidget( return new DiagnosticConfigsWidget(configs, configToSelect, ClangTidyInfo(clangTidyPath), - ClazyStandaloneInfo(clazyStandalonePath)); + ClazyStandaloneInfo::getInfo(clazyStandalonePath)); } void RunSettingsWidget::fromSettings(const RunSettings &s)