diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-08-01 16:08:40 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-09-12 10:24:30 +0000 |
commit | a8f00d147c4177be68ff5031b881066ee7004175 (patch) | |
tree | a129a991b8d3131da5a36ac2f1e797a620de9c07 /src/plugins/clangtools | |
parent | 9f868c44ce56a5a18b75f79cb482cfae6736cf14 (diff) | |
download | qt-creator-a8f00d147c4177be68ff5031b881066ee7004175.tar.gz |
ClangTools: Invoke clang-tidy instead of clang
Change-Id: Ibcc53cf8cb8bbaf262757bec52f15936506dad50
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins/clangtools')
-rw-r--r-- | src/plugins/clangtools/clangtidyclazyruncontrol.cpp | 7 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtidyclazyrunner.cpp | 94 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtidyclazyrunner.h | 4 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtidyclazytool.cpp | 8 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtidyclazytool.h | 3 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtool.h | 4 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolruncontrol.cpp | 16 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolruncontrol.h | 1 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolrunner.cpp | 11 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolrunner.h | 12 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolslogfilereader.h | 2 |
11 files changed, 90 insertions, 72 deletions
diff --git a/src/plugins/clangtools/clangtidyclazyruncontrol.cpp b/src/plugins/clangtools/clangtidyclazyruncontrol.cpp index c0b05d3350..8be64c2cfe 100644 --- a/src/plugins/clangtools/clangtidyclazyruncontrol.cpp +++ b/src/plugins/clangtools/clangtidyclazyruncontrol.cpp @@ -47,11 +47,12 @@ QList<RunnerCreator> ClangTidyClazyRunWorker::runnerCreators() { QList<RunnerCreator> creators; - if (!m_diagnosticConfig.clazyChecks().isEmpty()) - creators << [this]() { return createRunner<ClazyRunner>(); }; if (m_diagnosticConfig.clangTidyMode() != CppTools::ClangDiagnosticConfig::TidyMode::Disabled) creators << [this]() { return createRunner<ClangTidyRunner>(); }; + if (!m_diagnosticConfig.clazyChecks().isEmpty()) + creators << [this]() { return createRunner<ClazyPluginRunner>(); }; + return creators; } @@ -59,7 +60,7 @@ template <class T> ClangToolRunner *ClangTidyClazyRunWorker::createRunner() { auto runner = new T(m_diagnosticConfig, this); - runner->init(m_clangExecutable, m_temporaryDir.path(), m_environment); + runner->init(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 7615097b32..c09c914b11 100644 --- a/src/plugins/clangtools/clangtidyclazyrunner.cpp +++ b/src/plugins/clangtools/clangtidyclazyrunner.cpp @@ -27,6 +27,8 @@ #include "clangtoolssettings.h" +#include <coreplugin/icore.h> + #include <cpptools/compileroptionsbuilder.h> #include <cpptools/cppcodemodelsettings.h> #include <cpptools/cpptoolsreuse.h> @@ -45,40 +47,13 @@ using namespace CppTools; namespace ClangTools { namespace Internal { -static QStringList commonArguments(const QStringList &options, - const QString &logFile, - const ClangDiagnosticConfig diagnosticConfig) -{ - QStringList arguments; - if (LOG().isDebugEnabled()) - arguments << QLatin1String("-v"); - - const QStringList serializeArgs{"-serialize-diagnostics", logFile}; - if (options.contains("--driver-mode=cl")) - arguments << clangArgsForCl(serializeArgs); - else - arguments << serializeArgs; - - arguments << ClangDiagnosticConfigsModel::globalDiagnosticOptions() - << diagnosticConfig.clangOptions(); - - return arguments; -} - -static QStringList tidyPluginArguments(const ClangDiagnosticConfig diagnosticConfig) +static QStringList serializeDiagnosticsArguments(const QStringList &baseOptions, + const QString &outputFilePath) { - QStringList arguments; - - 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 = diagnosticConfig.clangTidyChecks(); - arguments << XclangArgs({"-plugin-arg-clang-tidy", "-checks=" + tidyChecks}); - } - } - - return arguments; + const QStringList serializeArgs{"-serialize-diagnostics", outputFilePath}; + if (baseOptions.contains("--driver-mode=cl")) + return clangArgsForCl(serializeArgs); + return serializeArgs; } static QStringList clazyPluginArguments(const ClangDiagnosticConfig diagnosticConfig) @@ -100,25 +75,64 @@ static QStringList clazyPluginArguments(const ClangDiagnosticConfig diagnosticCo return arguments; } +static QStringList tidyChecksArguments(const ClangDiagnosticConfig diagnosticConfig) +{ + const ClangDiagnosticConfig::TidyMode tidyMode = diagnosticConfig.clangTidyMode(); + if (tidyMode != ClangDiagnosticConfig::TidyMode::Disabled) { + if (tidyMode != ClangDiagnosticConfig::TidyMode::File) + return {"-checks=" + diagnosticConfig.clangTidyChecks()}; + } + + return {}; +} + +static QStringList mainToolArguments(const QString &mainFilePath, const QString &outputFilePath) +{ + return { + "-export-fixes=" + outputFilePath, + QDir::toNativeSeparators(mainFilePath), + }; +} + +static QStringList clangArguments(const ClangDiagnosticConfig &diagnosticConfig, + const QStringList &baseOptions) +{ + QStringList arguments; + arguments << ClangDiagnosticConfigsModel::globalDiagnosticOptions() + << diagnosticConfig.clangOptions() + << baseOptions; + + if (LOG().isDebugEnabled()) + arguments << QLatin1String("-v"); + + return arguments; +} + ClangTidyRunner::ClangTidyRunner(const ClangDiagnosticConfig &config, QObject *parent) : ClangToolRunner(parent) { setName(tr("Clang-Tidy")); + setOutputFileFormat(OutputFileFormat::Yaml); + setExecutable(Core::ICore::clangTidyExecutable(CLANG_BINDIR)); setArgsCreator([this, config](const QStringList &baseOptions) { - return commonArguments(baseOptions, m_logFile, config) - << tidyPluginArguments(config) - << baseOptions - << QDir::toNativeSeparators(filePath()); + return QStringList() + << tidyChecksArguments(config) + << mainToolArguments(filePath(), m_logFile) + << "--" + << clangArguments(config, baseOptions); }); } -ClazyRunner::ClazyRunner(const ClangDiagnosticConfig &config, QObject *parent) +ClazyPluginRunner::ClazyPluginRunner(const ClangDiagnosticConfig &config, QObject *parent) : ClangToolRunner(parent) { setName(tr("Clazy")); + setOutputFileFormat(OutputFileFormat::Serialized); + setExecutable(Core::ICore::clangExecutable(CLANG_BINDIR)); setArgsCreator([this, config](const QStringList &baseOptions) { - return commonArguments(baseOptions, m_logFile, config) - << clazyPluginArguments(config) << baseOptions + return serializeDiagnosticsArguments(baseOptions, m_logFile) + << clazyPluginArguments(config) + << clangArguments(config, baseOptions) << QDir::toNativeSeparators(filePath()); }); } diff --git a/src/plugins/clangtools/clangtidyclazyrunner.h b/src/plugins/clangtools/clangtidyclazyrunner.h index 39bd80580d..1edc684c0f 100644 --- a/src/plugins/clangtools/clangtidyclazyrunner.h +++ b/src/plugins/clangtools/clangtidyclazyrunner.h @@ -40,12 +40,12 @@ public: ClangTidyRunner(const CppTools::ClangDiagnosticConfig &config, QObject *parent = nullptr); }; -class ClazyRunner final : public ClangToolRunner +class ClazyPluginRunner final : public ClangToolRunner { Q_OBJECT public: - ClazyRunner(const CppTools::ClangDiagnosticConfig &config, QObject *parent = nullptr); + ClazyPluginRunner(const CppTools::ClangDiagnosticConfig &config, QObject *parent = nullptr); }; } // namespace Internal diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index 388dcd516e..3ca68b5505 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -516,7 +516,8 @@ void ClangTidyClazyTool::handleStateUpdate() Debugger::showPermanentStatusMessage(message); } -Diagnostics ClangTidyClazyTool::read(const QString &logFilePath, +Diagnostics ClangTidyClazyTool::read(OutputFileFormat outputFileFormat, + const QString &logFilePath, const QString &mainFilePath, const QSet<Utils::FilePath> &projectFiles, QString *errorMessage) const @@ -525,6 +526,11 @@ Diagnostics ClangTidyClazyTool::read(const QString &logFilePath, return projectFiles.contains(filePath); }; + if (outputFileFormat == OutputFileFormat::Yaml) { + return readExportedDiagnostics(Utils::FilePath::fromString(logFilePath), + acceptFromFilePath, + errorMessage); + } return readSerializedDiagnostics(Utils::FilePath::fromString(logFilePath), Utils::FilePath::fromString(mainFilePath), acceptFromFilePath, diff --git a/src/plugins/clangtools/clangtidyclazytool.h b/src/plugins/clangtools/clangtidyclazytool.h index 8834c733f2..21472da5eb 100644 --- a/src/plugins/clangtools/clangtidyclazytool.h +++ b/src/plugins/clangtools/clangtidyclazytool.h @@ -53,7 +53,8 @@ public: void startTool(bool askUserForFileSelection) final; - Diagnostics read(const QString &logFilePath, + Diagnostics read(OutputFileFormat outputFileFormat, + const QString &logFilePath, const QString &mainFilePath, const QSet<Utils::FilePath> &projectFiles, QString *errorMessage) const final; diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index 3f3c2d6998..39e1bbb464 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -27,6 +27,7 @@ #include "clangfileinfo.h" #include "clangtoolsdiagnostic.h" +#include "clangtoolslogfilereader.h" #include <projectexplorer/runconfiguration.h> #include <cpptools/projectinfo.h> @@ -50,7 +51,8 @@ public: virtual void startTool(bool askUserForFileSelection) = 0; - virtual Diagnostics read(const QString &logFilePath, + virtual Diagnostics read(OutputFileFormat outputFileFormat, + const QString &logFilePath, const QString &mainFilePath, const QSet<Utils::FilePath> &projectFiles, QString *errorMessage) const = 0; diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index ebda77aa6b..578839bbbb 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -232,7 +232,6 @@ ClangToolRunWorker::ClangToolRunWorker(RunControl *runControl, const FileInfos &fileInfos) : RunWorker(runControl) , m_projectBuilder(new ProjectBuilder(runControl, this)) - , m_clangExecutable(Core::ICore::clangExecutable(CLANG_BINDIR)) , m_temporaryDir("clangtools-XXXXXX") , m_fileInfos(fileInfos) { @@ -276,15 +275,6 @@ void ClangToolRunWorker::start() } const QString &toolName = tool()->name(); - if (m_clangExecutable.isEmpty()) { - const QString errorMessage = tr("%1: Can't find clang executable, stop.").arg(toolName); - appendMessage(errorMessage, Utils::ErrorMessageFormat); - TaskHub::addTask(Task::Error, errorMessage, Debugger::Constants::ANALYZERTASK_ID); - TaskHub::requestPopup(); - reportFailure(); - return; - } - Project *project = runControl()->project(); m_projectInfo = CppTools::CppModelManager::instance()->projectInfo(project); m_projectFiles = Utils::toSet(project->files(Project::AllFiles)); @@ -397,11 +387,13 @@ void ClangToolRunWorker::analyzeNextFile() void ClangToolRunWorker::onRunnerFinishedWithSuccess(const QString &filePath) { - const QString logFilePath = qobject_cast<ClangToolRunner *>(sender())->logFilePath(); + auto runner = qobject_cast<ClangToolRunner *>(sender()); + const QString logFilePath = runner->logFilePath(); qCDebug(LOG) << "onRunnerFinishedWithSuccess:" << logFilePath; QString errorMessage; - const Diagnostics diagnostics = tool()->read(logFilePath, + const Diagnostics diagnostics = tool()->read(runner->outputFileFormat(), + logFilePath, filePath, m_projectFiles, &errorMessage); diff --git a/src/plugins/clangtools/clangtoolruncontrol.h b/src/plugins/clangtools/clangtoolruncontrol.h index e30c2e2cf9..28734cdb02 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.h +++ b/src/plugins/clangtools/clangtoolruncontrol.h @@ -97,7 +97,6 @@ private: protected: ProjectBuilder *m_projectBuilder; Utils::Environment m_environment; - QString m_clangExecutable; Utils::TemporaryDirectory m_temporaryDir; private: diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp index 09e5806cd8..e722bba07a 100644 --- a/src/plugins/clangtools/clangtoolrunner.cpp +++ b/src/plugins/clangtools/clangtoolrunner.cpp @@ -58,13 +58,10 @@ QString finishedWithBadExitCode(const QString &name, int exitCode) return ClangToolRunner::tr("%1 finished with exit code: %2.").arg(name).arg(exitCode); } -void ClangToolRunner::init(const QString &clangExecutable, - const QString &clangLogFileDir, +void ClangToolRunner::init(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()); m_process.setProcessChannelMode(QProcess::MergedChannels); @@ -84,7 +81,7 @@ ClangToolRunner::~ClangToolRunner() bool ClangToolRunner::run(const QString &filePath, const QStringList &compilerOptions) { - QTC_ASSERT(!m_clangExecutable.isEmpty(), return false); + QTC_ASSERT(!m_executable.isEmpty(), return false); QTC_CHECK(!compilerOptions.contains(QLatin1String("-o"))); QTC_CHECK(!compilerOptions.contains(filePath)); @@ -94,10 +91,10 @@ bool ClangToolRunner::run(const QString &filePath, const QStringList &compilerOp m_logFile = createLogFile(filePath); QTC_ASSERT(!m_logFile.isEmpty(), return false); const QStringList arguments = m_argsCreator(compilerOptions); - m_commandLine = Utils::QtcProcess::joinArgs(QStringList(m_clangExecutable) + arguments); + m_commandLine = Utils::QtcProcess::joinArgs(QStringList(m_executable) + arguments); qCDebug(LOG).noquote() << "Starting" << m_commandLine; - m_process.start(m_clangExecutable, arguments); + m_process.start(m_executable, arguments); return true; } diff --git a/src/plugins/clangtools/clangtoolrunner.h b/src/plugins/clangtools/clangtoolrunner.h index 164ddb7729..e38b5bcc4a 100644 --- a/src/plugins/clangtools/clangtoolrunner.h +++ b/src/plugins/clangtools/clangtoolrunner.h @@ -25,6 +25,8 @@ #pragma once +#include "clangtoolslogfilereader.h" + #include <memory> #include <QString> @@ -47,11 +49,11 @@ public: ClangToolRunner(QObject *parent = nullptr) : QObject(parent) {} ~ClangToolRunner() override; - void init(const QString &clangExecutable, - const QString &clangLogFileDir, - const Utils::Environment &environment); + void init(const QString &clangLogFileDir, const Utils::Environment &environment); void setName(const QString &name) { m_name = name; } + void setExecutable(const QString &executable) { m_executable = executable; } void setArgsCreator(const ArgsCreator &argsCreator) { m_argsCreator = argsCreator; } + void setOutputFileFormat(const OutputFileFormat &format) { m_outputFileFormat = format; } // compilerOptions is expected to contain everything except: // (1) filePath, that is the file to analyze @@ -59,6 +61,7 @@ public: bool run(const QString &filePath, const QStringList &compilerOptions = QStringList()); QString name() const { return m_name; } + OutputFileFormat outputFileFormat() const { return m_outputFileFormat; } QString filePath() const { return m_filePath; } QString logFilePath() const { return m_logFile; } @@ -82,11 +85,12 @@ protected: QByteArray m_processOutput; private: - QString m_clangExecutable; QString m_clangLogFileDir; QString m_name; + QString m_executable; ArgsCreator m_argsCreator; + OutputFileFormat m_outputFileFormat = OutputFileFormat::Yaml; QString m_filePath; QString m_commandLine; diff --git a/src/plugins/clangtools/clangtoolslogfilereader.h b/src/plugins/clangtools/clangtoolslogfilereader.h index 6d53fa67c2..996f7ffbeb 100644 --- a/src/plugins/clangtools/clangtoolslogfilereader.h +++ b/src/plugins/clangtools/clangtoolslogfilereader.h @@ -34,6 +34,8 @@ namespace Utils { class FilePath; } namespace ClangTools { namespace Internal { +enum class OutputFileFormat { Serialized, Yaml }; + using AcceptDiagsFromFilePath = std::function<bool(const Utils::FilePath &)>; // Reads diagnostics generated by "clang -serialize-diagnostics path/to/file" |