summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2014-11-05 13:28:44 +0100
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2014-11-07 12:01:44 +0200
commit2f3666a3f05bfe5e71241b55ce72e913d547f2a4 (patch)
tree7df4b1d2daa39c9759c36406075bb1b7837389ee
parent22003c8ea05926ae1faa5497e60cacff9fadfbdd (diff)
downloadqt-creator-2f3666a3f05bfe5e71241b55ce72e913d547f2a4.tar.gz
Ensure that project configuration did not change
Otherwise we might try to analyze invalid or vanished files. Change-Id: I387dfb127618f2db21a538b07e1c152dbd026ca6 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerplugin.cpp5
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp23
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h5
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp35
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.h8
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp23
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzertool.h5
7 files changed, 81 insertions, 23 deletions
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerplugin.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerplugin.cpp
index 0a321d64e8..e635305b97 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerplugin.cpp
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerplugin.cpp
@@ -121,10 +121,9 @@ bool ClangStaticAnalyzerPlugin::initializeEnterpriseFeatures(const QStringList &
Q_UNUSED(arguments);
Q_UNUSED(errorString);
- addAutoReleasedObject(new ClangStaticAnalyzerOptionsPage);
- addAutoReleasedObject(new ClangStaticAnalyzerRunControlFactory);
-
m_analyzerTool = new ClangStaticAnalyzerTool(this);
+ addAutoReleasedObject(new ClangStaticAnalyzerRunControlFactory(m_analyzerTool));
+ addAutoReleasedObject(new ClangStaticAnalyzerOptionsPage);
const QString toolTip = tr("Clang Static Analyzer uses the analyzer from the clang project "
"to find bugs.");
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
index ba37140795..17a63f3a20 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
@@ -49,9 +49,11 @@ namespace ClangStaticAnalyzer {
namespace Internal {
ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl(
- const Analyzer::AnalyzerStartParameters &startParams,
- ProjectExplorer::RunConfiguration *runConfiguration)
+ const Analyzer::AnalyzerStartParameters &startParams,
+ ProjectExplorer::RunConfiguration *runConfiguration,
+ const ProjectInfo &projectInfo)
: AnalyzerRunControl(startParams, runConfiguration)
+ , m_projectInfo(projectInfo)
, m_initialFilesToProcessSize(0)
, m_filesAnalyzed(0)
, m_filesNotAnalyzed(0)
@@ -145,10 +147,9 @@ static QList<ClangStaticAnalyzerRunControl::AnalyzeUnit> unitsToAnalyzeFromProje
return unitsToAnalyze;
}
-static QList<ClangStaticAnalyzerRunControl::AnalyzeUnit> unitsToAnalyze(Project *project)
+static QList<ClangStaticAnalyzerRunControl::AnalyzeUnit> unitsToAnalyze(
+ const CppTools::ProjectInfo &projectInfo)
{
- QTC_ASSERT(project, return QList<ClangStaticAnalyzerRunControl::AnalyzeUnit>());
- ProjectInfo projectInfo = CppModelManager::instance()->projectInfo(project);
QTC_ASSERT(projectInfo.isValid(), return QList<ClangStaticAnalyzerRunControl::AnalyzeUnit>());
const ProjectInfo::CompilerCallData compilerCallData = projectInfo.compilerCallData();
@@ -161,14 +162,8 @@ bool ClangStaticAnalyzerRunControl::startEngine()
{
emit starting(this);
- RunConfiguration *runConfig = runConfiguration();
- QTC_ASSERT(runConfig, emit finished(); return false);
- Target *target = runConfig->target();
- QTC_ASSERT(target, emit finished(); return false);
- Project *project = target->project();
- QTC_ASSERT(project, emit finished(); return false);
-
- const QString projectFile = project->projectFilePath().toString();
+ QTC_ASSERT(m_projectInfo.isValid(), emit finished(); return false);
+ const QString projectFile = m_projectInfo.project()->projectFilePath().toString();
appendMessage(tr("Running Clang Static Analyzer on %1").arg(projectFile) + QLatin1Char('\n'),
Utils::NormalMessageFormat);
@@ -196,7 +191,7 @@ bool ClangStaticAnalyzerRunControl::startEngine()
m_clangLogFileDir = temporaryDir.path();
// Collect files
- const QList<AnalyzeUnit> filesToProcess = unitsToAnalyze(project);
+ const QList<AnalyzeUnit> filesToProcess = unitsToAnalyze(m_projectInfo);
qCDebug(LOG) << "Files to process:";
foreach (const AnalyzeUnit &fileConfig, filesToProcess)
qCDebug(LOG) << fileConfig.file;
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h
index 8de898c23a..cc56f107f6 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h
@@ -46,7 +46,8 @@ public:
public:
explicit ClangStaticAnalyzerRunControl(const Analyzer::AnalyzerStartParameters &startParams,
- ProjectExplorer::RunConfiguration *runConfiguration);
+ ProjectExplorer::RunConfiguration *runConfiguration,
+ const CppTools::ProjectInfo &projectInfo);
bool startEngine();
void stopEngine();
@@ -66,6 +67,8 @@ private:
void updateProgressValue();
private:
+ const CppTools::ProjectInfo m_projectInfo;
+
QString m_clangExecutable;
QString m_clangLogFileDir;
QFutureInterface<void> m_progress;
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp
index a8896b4565..df683464db 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp
@@ -22,21 +22,31 @@
#include <analyzerbase/analyzerruncontrol.h>
#include <analyzerbase/analyzerstartparameters.h>
+#include <cpptools/cppmodelmanager.h>
+#include <cpptools/cppprojects.h>
+
#include <projectexplorer/gcctoolchain.h>
#include <projectexplorer/kit.h>
#include <projectexplorer/kitinformation.h>
+#include <projectexplorer/session.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h>
+#include <utils/qtcassert.h>
+
using namespace Analyzer;
using namespace ProjectExplorer;
namespace ClangStaticAnalyzer {
namespace Internal {
-ClangStaticAnalyzerRunControlFactory::ClangStaticAnalyzerRunControlFactory(QObject *parent)
+ClangStaticAnalyzerRunControlFactory::ClangStaticAnalyzerRunControlFactory(
+ ClangStaticAnalyzerTool *tool,
+ QObject *parent)
: IRunControlFactory(parent)
+ , m_tool(tool)
{
+ QTC_CHECK(m_tool);
}
bool ClangStaticAnalyzerRunControlFactory::canRun(RunConfiguration *runConfiguration,
@@ -58,9 +68,30 @@ RunControl *ClangStaticAnalyzerRunControlFactory::create(RunConfiguration *runCo
RunMode runMode,
QString *errorMessage)
{
- Q_UNUSED(errorMessage);
Q_UNUSED(runMode);
+ using namespace CppTools;
+ const ProjectInfo projectInfoAtAnalyzerStart = m_tool->projectInfo();
+ QTC_ASSERT(projectInfoAtAnalyzerStart.isValid(), return 0);
+
+ Project *project = SessionManager::startupProject();
+ QTC_ASSERT(project, return 0);
+ const ProjectInfo projectInfoNow = CppModelManager::instance()->projectInfo(project);
+
+ if (projectInfoNow.configurationOrFilesChanged(projectInfoAtAnalyzerStart)) {
+ // 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.
+
+ m_tool->resetCursorAndProjectInfo();
+ if (errorMessage) {
+ *errorMessage = tr(
+ "The project configuration changed since the start of the Clang Static Analyzer. "
+ "Please re-run with current configuration.");
+ }
+ return 0;
+ }
+
AnalyzerStartParameters sp;
sp.runMode = runMode;
sp.startMode = StartLocal;
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.h b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.h
index ec3b2d8c9c..a325691972 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.h
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.h
@@ -19,6 +19,8 @@
#ifndef CLANGSTATICANALYZERRUNCONTROLFACTORY_H
#define CLANGSTATICANALYZERRUNCONTROLFACTORY_H
+#include "clangstaticanalyzertool.h"
+
#include <projectexplorer/runconfiguration.h>
namespace ClangStaticAnalyzer {
@@ -29,7 +31,8 @@ class ClangStaticAnalyzerRunControlFactory : public ProjectExplorer::IRunControl
Q_OBJECT
public:
- explicit ClangStaticAnalyzerRunControlFactory(QObject *parent = 0);
+ explicit ClangStaticAnalyzerRunControlFactory(ClangStaticAnalyzerTool *tool,
+ QObject *parent = 0);
bool canRun(ProjectExplorer::RunConfiguration *runConfiguration,
ProjectExplorer::RunMode runMode) const;
@@ -37,6 +40,9 @@ public:
ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration,
ProjectExplorer::RunMode runMode,
QString *errorMessage);
+
+private:
+ ClangStaticAnalyzerTool *m_tool;
};
} // namespace Internal
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp
index c2b663074e..591e8da4ce 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp
@@ -25,6 +25,7 @@
#include <analyzerbase/analyzermanager.h>
#include <coreplugin/coreconstants.h>
#include <coreplugin/icore.h>
+#include <cpptools/cppmodelmanager.h>
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectexplorerconstants.h>
@@ -133,7 +134,11 @@ AnalyzerRunControl *ClangStaticAnalyzerTool::createRunControl(
const AnalyzerStartParameters &sp,
ProjectExplorer::RunConfiguration *runConfiguration)
{
- ClangStaticAnalyzerRunControl *engine = new ClangStaticAnalyzerRunControl(sp, runConfiguration);
+ QTC_ASSERT(runConfiguration, return 0);
+ QTC_ASSERT(m_projectInfo.isValid(), return 0);
+
+ ClangStaticAnalyzerRunControl *engine = new ClangStaticAnalyzerRunControl(sp, runConfiguration,
+ m_projectInfo);
connect(engine, &ClangStaticAnalyzerRunControl::starting,
this, &ClangStaticAnalyzerTool::onEngineIsStarting);
connect(engine, &ClangStaticAnalyzerRunControl::newDiagnosticsAvailable,
@@ -192,6 +197,18 @@ void ClangStaticAnalyzerTool::startTool(StartMode mode)
Project *project = SessionManager::startupProject();
QTC_ASSERT(project, return);
ProjectExplorerPlugin::instance()->runProject(project, runMode());
+ m_projectInfo = CppTools::CppModelManager::instance()->projectInfo(project);
+}
+
+CppTools::ProjectInfo ClangStaticAnalyzerTool::projectInfo() const
+{
+ return m_projectInfo;
+}
+
+void ClangStaticAnalyzerTool::resetCursorAndProjectInfo()
+{
+ setBusyCursor(false);
+ m_projectInfo = CppTools::ProjectInfo();
}
void ClangStaticAnalyzerTool::onEngineIsStarting()
@@ -210,10 +227,12 @@ void ClangStaticAnalyzerTool::onEngineFinished()
QTC_ASSERT(m_goBack, return);
QTC_ASSERT(m_goNext, return);
QTC_ASSERT(m_diagnosticModel, return);
+
+ resetCursorAndProjectInfo();
+
const int issuesFound = m_diagnosticModel->rowCount();
m_goBack->setEnabled(issuesFound > 1);
m_goNext->setEnabled(issuesFound > 1);
- setBusyCursor(false);
AnalyzerManager::showStatusMessage(issuesFound > 0
? AnalyzerManager::tr("Clang Static Analyzer finished, %n issues were found.", 0, issuesFound)
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzertool.h b/plugins/clangstaticanalyzer/clangstaticanalyzertool.h
index 2cb1393a7a..f049740d89 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzertool.h
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzertool.h
@@ -20,6 +20,7 @@
#define CLANGSTATICANALYZERTOOL_H
#include <analyzerbase/ianalyzertool.h>
+#include <cpptools/cppprojects.h>
namespace Analyzer { class DetailedErrorView; }
@@ -36,6 +37,8 @@ class ClangStaticAnalyzerTool : public Analyzer::IAnalyzerTool
public:
explicit ClangStaticAnalyzerTool(QObject *parent = 0);
+ CppTools::ProjectInfo projectInfo() const;
+ void resetCursorAndProjectInfo();
private:
QWidget *createWidgets();
@@ -50,6 +53,8 @@ private:
void setBusyCursor(bool busy);
private:
+ CppTools::ProjectInfo m_projectInfo;
+
ClangStaticAnalyzerDiagnosticModel *m_diagnosticModel;
Analyzer::DetailedErrorView *m_diagnosticView;