aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangtools/clangtoolruncontrol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/clangtools/clangtoolruncontrol.cpp')
-rw-r--r--src/plugins/clangtools/clangtoolruncontrol.cpp112
1 files changed, 39 insertions, 73 deletions
diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp
index 82c2ba0b38c..1503961aab8 100644
--- a/src/plugins/clangtools/clangtoolruncontrol.cpp
+++ b/src/plugins/clangtools/clangtoolruncontrol.cpp
@@ -56,11 +56,9 @@
#include <projectexplorer/projectexplorericons.h>
#include <projectexplorer/runconfiguration.h>
#include <projectexplorer/target.h>
-#include <projectexplorer/taskhub.h>
#include <projectexplorer/toolchain.h>
#include <utils/algorithm.h>
-#include <utils/checkablemessagebox.h>
#include <utils/hostosinfo.h>
#include <utils/qtcprocess.h>
@@ -137,29 +135,6 @@ private:
Target *target = runControl()->target();
QTC_ASSERT(target, reportFailure(); return);
- if (runControl()->buildType() == BuildConfiguration::Release) {
- const QString wrongMode = ClangToolRunWorker::tr("Release");
- const QString toolName = tool()->name();
- const QString title = ClangToolRunWorker::tr("Run %1 in %2 Mode?").arg(toolName, wrongMode);
- const QString problem = ClangToolRunWorker::tr(
- "You are trying to run the tool \"%1\" on an application in %2 mode. The tool is "
- "designed to be used in Debug mode since enabled assertions can reduce the number of "
- "false positives.").arg(toolName, wrongMode);
- const QString question = ClangToolRunWorker::tr(
- "Do you want to continue and run the tool in %1 mode?").arg(wrongMode);
- const QString message = QString("<html><head/><body>"
- "<p>%1</p>"
- "<p>%2</p>"
- "</body></html>").arg(problem, question);
- if (Utils::CheckableMessageBox::doNotAskAgainQuestion(Core::ICore::mainWindow(),
- title, message, Core::ICore::settings(),
- "ClangToolsCorrectModeWarning") != QDialogButtonBox::Yes)
- {
- reportFailure();
- return;
- }
- }
-
connect(BuildManager::instance(), &BuildManager::buildQueueFinished,
this, &ProjectBuilder::onBuildFinished, Qt::QueuedConnection);
@@ -225,7 +200,7 @@ ClangToolRunWorker::ClangToolRunWorker(RunControl *runControl,
const RunSettings &runSettings,
const CppTools::ClangDiagnosticConfig &diagnosticConfig,
const FileInfos &fileInfos,
- bool preventBuild)
+ bool buildBeforeAnalysis)
: RunWorker(runControl)
, m_runSettings(runSettings)
, m_diagnosticConfig(diagnosticConfig)
@@ -235,7 +210,7 @@ ClangToolRunWorker::ClangToolRunWorker(RunControl *runControl,
setId("ClangTidyClazyRunner");
setSupportsReRunning(false);
- if (!preventBuild && runSettings.buildBeforeAnalysis()) {
+ if (buildBeforeAnalysis) {
m_projectBuilder = new ProjectBuilder(runControl);
addStartDependency(m_projectBuilder);
}
@@ -273,11 +248,11 @@ QList<RunnerCreator> ClangToolRunWorker::runnerCreators()
void ClangToolRunWorker::start()
{
- TaskHub::clearTasks(Debugger::Constants::ANALYZERTASK_ID);
ProjectExplorerPlugin::saveModifiedFiles();
if (m_projectBuilder && !m_projectBuilder->success()) {
- reportFailure();
+ emit buildFailed();
+ reportFailure(tr("Failed to build the project."));
return;
}
@@ -286,13 +261,23 @@ void ClangToolRunWorker::start()
m_projectInfo = CppTools::CppModelManager::instance()->projectInfo(project);
m_projectFiles = Utils::toSet(project->files(Project::AllFiles));
- // Some projects provides CompilerCallData once a build is finished,
+ // Project changed in the mean time?
if (m_projectInfo.configurationOrFilesChanged(m_projectInfoBeforeBuild)) {
// If it's more than a release/debug build configuration change, e.g.
// a version control checkout, files might be not valid C++ anymore
// or even gone, so better stop here.
reportFailure(tr("The project configuration changed since the start of "
- "the %1. Please re-run with current configuration.").arg(toolName));
+ "the %1. Please re-run with current configuration.")
+ .arg(toolName));
+ emit startFailed();
+ return;
+ }
+
+ // Create log dir
+ if (!m_temporaryDir.isValid()) {
+ reportFailure(
+ tr("Failed to create temporary directory: %1.").arg(m_temporaryDir.errorString()));
+ emit startFailed();
return;
}
@@ -303,17 +288,6 @@ void ClangToolRunWorker::start()
.arg(m_diagnosticConfig.displayName()),
Utils::NormalMessageFormat);
- // Create log dir
- if (!m_temporaryDir.isValid()) {
- const QString errorMessage
- = tr("%1: Failed to create temporary directory. Stopped.").arg(toolName);
- appendMessage(errorMessage, Utils::ErrorMessageFormat);
- TaskHub::addTask(Task::Error, errorMessage, Debugger::Constants::ANALYZERTASK_ID);
- TaskHub::requestPopup();
- reportFailure(errorMessage);
- return;
- }
-
// Collect files
const AnalyzeUnits unitsToProcess = unitsToAnalyze();
qCDebug(LOG) << "Files to process:" << unitsToProcess;
@@ -389,22 +363,14 @@ void ClangToolRunWorker::analyzeNextFile()
ClangToolRunner *runner = queueItem.runnerCreator();
m_runners.insert(runner);
- const QString executable = runner->executable();
- if (!isFileExecutable(executable)) {
- const QString errorMessage = tr("%1: Invalid executable \"%2\". Stopped.")
- .arg(runner->name(), executable);
- TaskHub::addTask(Task::Error, errorMessage, Debugger::Constants::ANALYZERTASK_ID);
- TaskHub::requestPopup();
- reportFailure(errorMessage);
+ if (runner->run(unit.file, unit.arguments)) {
+ const QString filePath = FilePath::fromString(unit.file).toUserOutput();
+ appendMessage(tr("Analyzing \"%1\" [%2].").arg(filePath, runner->name()),
+ Utils::StdOutFormat);
+ } else {
+ reportFailure(tr("Failed to start runner \"%1\".").arg(runner->name()));
stop();
- return;
}
-
- QTC_ASSERT(runner->run(unit.file, unit.arguments), return);
-
- appendMessage(tr("Analyzing \"%1\" [%2].")
- .arg(FilePath::fromString(unit.file).toUserOutput(), runner->name()),
- Utils::StdOutFormat);
}
void ClangToolRunWorker::onRunnerFinishedWithSuccess(const QString &filePath)
@@ -413,6 +379,8 @@ void ClangToolRunWorker::onRunnerFinishedWithSuccess(const QString &filePath)
const QString outputFilePath = runner->outputFilePath();
qCDebug(LOG) << "onRunnerFinishedWithSuccess:" << outputFilePath;
+ emit runnerFinished();
+
QString errorMessage;
const Diagnostics diagnostics = tool()->read(runner->outputFileFormat(),
outputFilePath,
@@ -444,6 +412,8 @@ void ClangToolRunWorker::onRunnerFinishedWithFailure(const QString &errorMessage
qCDebug(LOG).noquote() << "onRunnerFinishedWithFailure:"
<< errorMessage << '\n' << errorDetails;
+ emit runnerFinished();
+
auto *toolRunner = qobject_cast<ClangToolRunner *>(sender());
const QString fileToAnalyze = toolRunner->fileToAnalyze();
const QString outputFilePath = toolRunner->outputFilePath();
@@ -458,7 +428,6 @@ void ClangToolRunWorker::onRunnerFinishedWithFailure(const QString &errorMessage
const QString message = tr("Failed to analyze \"%1\": %2").arg(fileToAnalyze, errorMessage);
appendMessage(message, Utils::StdErrFormat);
appendMessage(errorDetails, Utils::StdErrFormat);
- TaskHub::addTask(Task::Error, message, Debugger::Constants::ANALYZERTASK_ID);
handleFinished();
}
@@ -484,29 +453,26 @@ void ClangToolRunWorker::updateProgressValue()
void ClangToolRunWorker::finalize()
{
const QString toolName = tool()->name();
- appendMessage(tr("%1 finished: "
- "Processed %2 files successfully, %3 failed.")
- .arg(toolName)
- .arg(m_filesAnalyzed.size())
- .arg(m_filesNotAnalyzed.size()),
- Utils::NormalMessageFormat);
-
if (m_filesNotAnalyzed.size() != 0) {
- QString msg = tr("%1: Not all files could be analyzed.").arg(toolName);
- TaskHub::addTask(Task::Error, msg, Debugger::Constants::ANALYZERTASK_ID);
+ appendMessage(tr("Error: Failed to analyze %1 files.").arg(m_filesAnalyzed.size()),
+ ErrorMessageFormat);
Target *target = runControl()->target();
if (target && target->activeBuildConfiguration() && !target->activeBuildConfiguration()->buildDirectory().exists()
&& !m_runSettings.buildBeforeAnalysis()) {
- msg = tr("%1: You might need to build the project to generate or update source "
- "files. To build automatically, enable \"Build the project before starting "
- "analysis\".")
- .arg(toolName);
- TaskHub::addTask(Task::Error, msg, Debugger::Constants::ANALYZERTASK_ID);
+ appendMessage(
+ tr("Note: You might need to build the project to generate or update source "
+ "files. To build automatically, enable \"Build the project before analysis\"."),
+ NormalMessageFormat);
}
-
- TaskHub::requestPopup();
}
+ appendMessage(tr("%1 finished: "
+ "Processed %2 files successfully, %3 failed.")
+ .arg(toolName)
+ .arg(m_filesAnalyzed.size())
+ .arg(m_filesNotAnalyzed.size()),
+ Utils::NormalMessageFormat);
+
m_progress.reportFinished();
runControl()->initiateStop();
}