diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index e0c7b11e716..7c7e8a15547 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -53,6 +53,8 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl( ProjectExplorer::RunConfiguration *runConfiguration) : AnalyzerRunControl(startParams, runConfiguration) , m_initialFilesToProcessSize(0) + , m_filesAnalyzed(0) + , m_filesNotAnalyzed(0) { } @@ -126,6 +128,8 @@ bool ClangStaticAnalyzerRunControl::startEngine() } m_filesToProcess = filesToProcess; m_initialFilesToProcessSize = m_filesToProcess.count(); + m_filesAnalyzed = 0; + m_filesNotAnalyzed = 0; // Set up progress information using namespace Core; @@ -156,7 +160,10 @@ void ClangStaticAnalyzerRunControl::stopEngine() } m_runners.clear(); m_filesToProcess.clear(); - analyzeNextFile(); // emits finished + appendMessage(tr("Clang Static Analyzer stopped by user.") + QLatin1Char('\n'), + Utils::NormalMessageFormat); + m_progress.reportFinished(); + emit finished(); } void ClangStaticAnalyzerRunControl::analyzeNextFile() @@ -166,7 +173,11 @@ void ClangStaticAnalyzerRunControl::analyzeNextFile() if (m_filesToProcess.isEmpty()) { if (m_runners.size() == 0) { - appendMessage(tr("Clang Static Analyzer finished.") + QLatin1Char('\n'), + appendMessage(tr("Clang Static Analyzer finished: " + "Processed %1 files successfully, %2 failed.") + .arg(m_filesAnalyzed) + .arg(m_filesNotAnalyzed) + + QLatin1Char('\n'), Utils::NormalMessageFormat); m_progress.reportFinished(); emit finished(); @@ -182,6 +193,8 @@ void ClangStaticAnalyzerRunControl::analyzeNextFile() m_runners.insert(runner); qCDebug(LOG) << "analyzeNextFile:" << filePath; QTC_ASSERT(runner->run(filePath, options), return); + appendMessage(tr("Analyzing \"%1\".").arg(filePath) + QLatin1Char('\n'), + Utils::StdOutFormat); } ClangStaticAnalyzerRunner *ClangStaticAnalyzerRunControl::createRunner() @@ -201,21 +214,36 @@ ClangStaticAnalyzerRunner *ClangStaticAnalyzerRunControl::createRunner() void ClangStaticAnalyzerRunControl::onRunnerFinishedWithSuccess(const QString &logFilePath) { qCDebug(LOG) << "onRunnerFinishedWithSuccess:" << logFilePath; - handleFinished(); QString errorMessage; const QList diagnostics = LogFileReader::read(logFilePath, &errorMessage); - QTC_CHECK(errorMessage.isEmpty()); - if (!errorMessage.isEmpty()) + if (!errorMessage.isEmpty()) { qCDebug(LOG) << "onRunnerFinishedWithSuccess: Error reading log file:" << errorMessage; - if (!diagnostics.isEmpty()) - emit newDiagnosticsAvailable(diagnostics); + const QString filePath = qobject_cast(sender())->filePath(); + appendMessage(tr("Failed to analyze \"%1\": %2").arg(filePath, errorMessage) + + QLatin1Char('\n') + , Utils::StdErrFormat); + } else { + ++m_filesAnalyzed; + if (!diagnostics.isEmpty()) + emit newDiagnosticsAvailable(diagnostics); + } + + handleFinished(); } void ClangStaticAnalyzerRunControl::onRunnerFinishedWithFailure(const QString &errorMessage, const QString &errorDetails) { qCDebug(LOG) << "onRunnerFinishedWithFailure:" << errorMessage << errorDetails; + + ++m_filesNotAnalyzed; + const QString filePath = qobject_cast(sender())->filePath(); + appendMessage(tr("Failed to analyze \"%1\": %2").arg(filePath, errorMessage) + + QLatin1Char('\n') + , Utils::StdErrFormat); + appendMessage(errorDetails, Utils::StdErrFormat); + handleFinished(); } diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h index 661594bf112..03397517178 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -76,6 +76,8 @@ private: QList m_filesToProcess; QSet m_runners; int m_initialFilesToProcessSize; + int m_filesAnalyzed; + int m_filesNotAnalyzed; }; } // namespace Internal diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp index ed8efb93f84..1d4e5b527af 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp @@ -99,6 +99,7 @@ bool ClangStaticAnalyzerRunner::run(const QString &filePath, const QStringList & QTC_CHECK(!compilerOptions.contains(QLatin1String("-o"))); QTC_CHECK(!compilerOptions.contains(filePath)); + m_filePath = filePath; m_processOutput.clear(); m_logFile = createLogFile(filePath); @@ -112,6 +113,11 @@ bool ClangStaticAnalyzerRunner::run(const QString &filePath, const QStringList & return true; } +QString ClangStaticAnalyzerRunner::filePath() const +{ + return m_filePath; +} + void ClangStaticAnalyzerRunner::onProcessStarted() { emit started(); @@ -161,8 +167,8 @@ QString ClangStaticAnalyzerRunner::createLogFile(const QString &filePath) const QString ClangStaticAnalyzerRunner::processCommandlineAndOutput() const { return QObject::tr("Command line: \"%1\"\n" - "Process Error: \"%2\"\n" - "Output:\n\"%3\"") + "Process Error: %2\n" + "Output:\n%3") .arg(m_commandLine, QString::number(m_process.error()), QString::fromLocal8Bit(m_processOutput)); diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h index b535ec10778..461f694e2e7 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h @@ -45,6 +45,8 @@ public: // (2) -o output-file bool run(const QString &filePath, const QStringList &compilerOptions = QStringList()); + QString filePath() const; + signals: void started(); void finishedWithSuccess(const QString &logFilePath); @@ -62,6 +64,7 @@ private: private: QString m_clangExecutable; QString m_clangLogFileDir; + QString m_filePath; QString m_logFile; QString m_commandLine; QProcess m_process;