summaryrefslogtreecommitdiff
path: root/src/plugins/clangtools
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2019-08-01 14:54:15 +0200
committerNikolai Kosjar <nikolai.kosjar@qt.io>2019-09-11 08:47:07 +0000
commit217332a48f5110325ba7ebdffd520966ce2824fa (patch)
tree397fe96d7ac5234956c9b941f7d22c02d214826a /src/plugins/clangtools
parenta4022c61569a4d286fc1624a4cca28857b403f06 (diff)
downloadqt-creator-217332a48f5110325ba7ebdffd520966ce2824fa.tar.gz
ClangTools: Prepare for more ClangToolRunners
Change-Id: I6bbdbff496c0604367896d279df1a197f8a041bd Reviewed-by: David Schulz <david.schulz@qt.io> Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/clangtools')
-rw-r--r--src/plugins/clangtools/clangtidyclazyruncontrol.cpp7
-rw-r--r--src/plugins/clangtools/clangtidyclazyrunner.cpp63
-rw-r--r--src/plugins/clangtools/clangtidyclazyrunner.h12
-rw-r--r--src/plugins/clangtools/clangtoolrunner.cpp16
-rw-r--r--src/plugins/clangtools/clangtoolrunner.h27
5 files changed, 64 insertions, 61 deletions
diff --git a/src/plugins/clangtools/clangtidyclazyruncontrol.cpp b/src/plugins/clangtools/clangtidyclazyruncontrol.cpp
index 4422020df3..3f1b2c4a0c 100644
--- a/src/plugins/clangtools/clangtidyclazyruncontrol.cpp
+++ b/src/plugins/clangtools/clangtidyclazyruncontrol.cpp
@@ -52,11 +52,8 @@ QList<RunnerCreator> ClangTidyClazyRunWorker::runnerCreators()
ClangToolRunner *ClangTidyClazyRunWorker::createRunner()
{
- auto runner = new ClangTidyClazyRunner(m_diagnosticConfig,
- m_clangExecutable,
- m_temporaryDir.path(),
- m_environment,
- this);
+ auto runner = new ClangTidyClazyRunner(m_diagnosticConfig, this);
+ runner->init(m_clangExecutable, m_temporaryDir.path(), m_environment);
connect(runner, &ClangToolRunner::finishedWithSuccess,
this, &ClangTidyClazyRunWorker::onRunnerFinishedWithSuccess);
connect(runner, &ClangToolRunner::finishedWithFailure,
diff --git a/src/plugins/clangtools/clangtidyclazyrunner.cpp b/src/plugins/clangtools/clangtidyclazyrunner.cpp
index 2bb0caf3aa..ab257212a3 100644
--- a/src/plugins/clangtools/clangtidyclazyrunner.cpp
+++ b/src/plugins/clangtools/clangtidyclazyrunner.cpp
@@ -40,50 +40,52 @@
static Q_LOGGING_CATEGORY(LOG, "qtc.clangtools.runner", QtWarningMsg)
+using namespace CppTools;
+
namespace ClangTools {
namespace Internal {
-ClangTidyClazyRunner::ClangTidyClazyRunner(const CppTools::ClangDiagnosticConfig &diagnosticConfig,
- const QString &clangExecutable,
- const QString &clangLogFileDir,
- const Utils::Environment &environment,
- QObject *parent)
- : ClangToolRunner(clangExecutable,
- clangLogFileDir,
- environment,
- tr("Clang-Tidy and Clazy"),
- parent)
- , m_diagnosticConfig(diagnosticConfig)
-{
-}
-
-QStringList ClangTidyClazyRunner::constructCommandLineArguments(const QStringList &options)
+static QStringList commonArguments(const QStringList &options,
+ const QString &logFile,
+ const ClangDiagnosticConfig diagnosticConfig)
{
- using namespace CppTools;
QStringList arguments;
-
if (LOG().isDebugEnabled())
arguments << QLatin1String("-v");
- const QStringList serializeArgs{"-serialize-diagnostics", m_logFile};
+ const QStringList serializeArgs{"-serialize-diagnostics", logFile};
if (options.contains("--driver-mode=cl"))
arguments << clangArgsForCl(serializeArgs);
else
arguments << serializeArgs;
arguments << ClangDiagnosticConfigsModel::globalDiagnosticOptions()
- << m_diagnosticConfig.clangOptions();
+ << diagnosticConfig.clangOptions();
+
+ return arguments;
+}
+
+static QStringList tidyPluginArguments(const ClangDiagnosticConfig diagnosticConfig)
+{
+ QStringList arguments;
- const ClangDiagnosticConfig::TidyMode tidyMode = m_diagnosticConfig.clangTidyMode();
+ const ClangDiagnosticConfig::TidyMode tidyMode = diagnosticConfig.clangTidyMode();
if (tidyMode != ClangDiagnosticConfig::TidyMode::Disabled) {
arguments << XclangArgs({"-add-plugin", "clang-tidy"});
if (tidyMode != ClangDiagnosticConfig::TidyMode::File) {
- const QString tidyChecks = m_diagnosticConfig.clangTidyChecks();
+ const QString tidyChecks = diagnosticConfig.clangTidyChecks();
arguments << XclangArgs({"-plugin-arg-clang-tidy", "-checks=" + tidyChecks});
}
}
- const QString clazyChecks = m_diagnosticConfig.clazyChecks();
+ return arguments;
+}
+
+static QStringList clazyPluginArguments(const ClangDiagnosticConfig diagnosticConfig)
+{
+ QStringList arguments;
+
+ const QString clazyChecks = diagnosticConfig.clazyChecks();
if (!clazyChecks.isEmpty()) {
arguments << XclangArgs({"-add-plugin",
"clazy",
@@ -92,12 +94,25 @@ QStringList ClangTidyClazyRunner::constructCommandLineArguments(const QStringLis
"-plugin-arg-clazy",
"no-autowrite-fixits",
"-plugin-arg-clazy",
- m_diagnosticConfig.clazyChecks()});
+ diagnosticConfig.clazyChecks()});
}
- arguments << options << QDir::toNativeSeparators(filePath());
return arguments;
}
+ClangTidyClazyRunner::ClangTidyClazyRunner(const ClangDiagnosticConfig &config,
+ QObject *parent)
+ : ClangToolRunner(parent)
+{
+ setName(tr("Clang-Tidy/Clazy"));
+ setArgsCreator([this, config](const QStringList &baseOptions) {
+ return commonArguments(baseOptions, m_logFile, config)
+ << tidyPluginArguments(config)
+ << clazyPluginArguments(config)
+ << baseOptions
+ << QDir::toNativeSeparators(filePath());
+ });
+}
+
} // namespace Internal
} // namespace ClangTools
diff --git a/src/plugins/clangtools/clangtidyclazyrunner.h b/src/plugins/clangtools/clangtidyclazyrunner.h
index 507ac2977d..6e5211a71c 100644
--- a/src/plugins/clangtools/clangtidyclazyrunner.h
+++ b/src/plugins/clangtools/clangtidyclazyrunner.h
@@ -37,17 +37,7 @@ class ClangTidyClazyRunner final : public ClangToolRunner
Q_OBJECT
public:
- ClangTidyClazyRunner(const CppTools::ClangDiagnosticConfig &diagnosticConfig,
- const QString &clangExecutable,
- const QString &clangLogFileDir,
- const Utils::Environment &environment,
- QObject *parent = nullptr);
-
-protected:
- QStringList constructCommandLineArguments(const QStringList &options) final;
-
-private:
- const CppTools::ClangDiagnosticConfig m_diagnosticConfig;
+ ClangTidyClazyRunner(const CppTools::ClangDiagnosticConfig &config, QObject *parent = nullptr);
};
} // namespace Internal
diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp
index c02d59a7da..09e5806cd8 100644
--- a/src/plugins/clangtools/clangtoolrunner.cpp
+++ b/src/plugins/clangtools/clangtoolrunner.cpp
@@ -58,16 +58,12 @@ QString finishedWithBadExitCode(const QString &name, int exitCode)
return ClangToolRunner::tr("%1 finished with exit code: %2.").arg(name).arg(exitCode);
}
-ClangToolRunner::ClangToolRunner(const QString &clangExecutable,
- const QString &clangLogFileDir,
- const Utils::Environment &environment,
- const QString &name,
- QObject *parent)
- : QObject(parent)
- , m_clangExecutable(QDir::toNativeSeparators(clangExecutable))
- , m_clangLogFileDir(clangLogFileDir)
- , m_name(name)
+void ClangToolRunner::init(const QString &clangExecutable,
+ const QString &clangLogFileDir,
+ const Utils::Environment &environment)
{
+ m_clangExecutable = QDir::toNativeSeparators(clangExecutable);
+ m_clangLogFileDir = clangLogFileDir;
QTC_CHECK(!m_clangExecutable.isEmpty());
QTC_CHECK(!m_clangLogFileDir.isEmpty());
@@ -97,7 +93,7 @@ bool ClangToolRunner::run(const QString &filePath, const QStringList &compilerOp
m_logFile = createLogFile(filePath);
QTC_ASSERT(!m_logFile.isEmpty(), return false);
- const QStringList arguments = constructCommandLineArguments(compilerOptions);
+ const QStringList arguments = m_argsCreator(compilerOptions);
m_commandLine = Utils::QtcProcess::joinArgs(QStringList(m_clangExecutable) + arguments);
qCDebug(LOG).noquote() << "Starting" << m_commandLine;
diff --git a/src/plugins/clangtools/clangtoolrunner.h b/src/plugins/clangtools/clangtoolrunner.h
index b0d0b605cc..72bcc60f5f 100644
--- a/src/plugins/clangtools/clangtoolrunner.h
+++ b/src/plugins/clangtools/clangtoolrunner.h
@@ -25,6 +25,8 @@
#pragma once
+#include <memory>
+
#include <QString>
#include <QProcess>
@@ -33,6 +35,8 @@ namespace Utils { class Environment; }
namespace ClangTools {
namespace Internal {
+using ArgsCreator = std::function<QStringList(const QStringList &baseOptions)>;
+
QString finishedWithBadExitCode(const QString &name, int exitCode); // exposed for tests
class ClangToolRunner : public QObject
@@ -40,13 +44,15 @@ class ClangToolRunner : public QObject
Q_OBJECT
public:
- ClangToolRunner(const QString &clangExecutable,
- const QString &clangLogFileDir,
- const Utils::Environment &environment,
- const QString &name,
- QObject *parent = nullptr);
+ ClangToolRunner(QObject *parent = nullptr) : QObject(parent) {}
~ClangToolRunner() override;
+ void init(const QString &clangExecutable,
+ const QString &clangLogFileDir,
+ const Utils::Environment &environment);
+ void setName(const QString &name) { m_name = name; }
+ void setArgsCreator(const ArgsCreator &argsCreator) { m_argsCreator = argsCreator; }
+
// compilerOptions is expected to contain everything except:
// (1) filePath, that is the file to analyze
// (2) -o output-file
@@ -60,12 +66,8 @@ signals:
void finishedWithSuccess(const QString &filePath);
void finishedWithFailure(const QString &errorMessage, const QString &errorDetails);
-protected:
- virtual QStringList constructCommandLineArguments(const QStringList &options) = 0;
-
- virtual void onProcessOutput();
-
private:
+ virtual void onProcessOutput();
void onProcessStarted();
void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
void onProcessError(QProcess::ProcessError error);
@@ -81,9 +83,12 @@ protected:
private:
QString m_clangExecutable;
QString m_clangLogFileDir;
+
+ QString m_name;
+ ArgsCreator m_argsCreator;
+
QString m_filePath;
QString m_commandLine;
- const QString m_name;
};
} // namespace Internal