ClangTools: Allow selecting diagnostic config for project

When starting the Clazy/Tidy tool, allow to select the diagnostic
configuration for the run.

As a side effect, fix a race condition where the runner could end up
with no diagnostic config (removed during run) - copy the diagnostic
config instead of referencing/querying it by the id.

Change-Id: Iedafa8f31a3bbd233d65818fe8de16add1e4d443
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Nikolai Kosjar
2018-05-14 11:40:40 +02:00
parent 2522275b69
commit 9b74948a61
12 changed files with 206 additions and 25 deletions

View File

@@ -42,7 +42,8 @@ static Q_LOGGING_CATEGORY(LOG, "qtc.clangtools.runner")
namespace ClangTools {
namespace Internal {
ClangTidyClazyRunner::ClangTidyClazyRunner(const QString &clangExecutable,
ClangTidyClazyRunner::ClangTidyClazyRunner(const CppTools::ClangDiagnosticConfig &diagnosticConfig,
const QString &clangExecutable,
const QString &clangLogFileDir,
const Utils::Environment &environment,
QObject *parent)
@@ -51,6 +52,7 @@ ClangTidyClazyRunner::ClangTidyClazyRunner(const QString &clangExecutable,
environment,
tr("Clang-Tidy and Clazy"),
parent)
, m_diagnosticConfig(diagnosticConfig)
{
}
@@ -78,28 +80,21 @@ QStringList ClangTidyClazyRunner::constructCommandLineArguments(const QStringLis
<< QString("-serialize-diagnostics")
<< QString(m_logFile);
const ClangDiagnosticConfigsModel configsModel(
CppTools::codeModelSettings()->clangCustomDiagnosticConfigs());
const Core::Id configId = ClangToolsSettings::instance()->savedDiagnosticConfigId();
QTC_ASSERT(configsModel.hasConfigWithId(configId), return arguments;);
const ClangDiagnosticConfig &config = configsModel.configWithId(configId);
const ClangDiagnosticConfig::TidyMode tidyMode = config.clangTidyMode();
const ClangDiagnosticConfig::TidyMode tidyMode = m_diagnosticConfig.clangTidyMode();
if (tidyMode != ClangDiagnosticConfig::TidyMode::Disabled) {
addXclangArg(arguments, QString("-add-plugin"), QString("clang-tidy"));
if (tidyMode != ClangDiagnosticConfig::TidyMode::File) {
const QString tidyChecks = config.clangTidyChecks();
const QString tidyChecks = m_diagnosticConfig.clangTidyChecks();
addXclangArg(arguments, QString("-plugin-arg-clang-tidy"), "-checks=" + tidyChecks);
}
}
const QString clazyChecks = config.clazyChecks();
const QString clazyChecks = m_diagnosticConfig.clazyChecks();
if (!clazyChecks.isEmpty()) {
addXclangArg(arguments, QString("-add-plugin"), QString("clang-lazy"));
addXclangArg(arguments, QString("-plugin-arg-clang-lazy"), QString("enable-all-fixits"));
addXclangArg(arguments, QString("-plugin-arg-clang-lazy"), QString("no-autowrite-fixits"));
addXclangArg(arguments, QString("-plugin-arg-clang-lazy"), config.clazyChecks());
addXclangArg(arguments, QString("-plugin-arg-clang-lazy"), m_diagnosticConfig.clazyChecks());
}
arguments += options;