aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp')
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp35
1 files changed, 33 insertions, 2 deletions
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp
index a8896b4565..94f7f27163 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 projectInfoBeforeBuild = m_tool->projectInfoBeforeBuild();
+ QTC_ASSERT(projectInfoBeforeBuild.isValid(), return 0);
+
+ Project *project = SessionManager::startupProject();
+ QTC_ASSERT(project, return 0);
+ const ProjectInfo projectInfoAfterBuild = CppModelManager::instance()->projectInfo(project);
+
+ if (projectInfoAfterBuild.configurationOrFilesChanged(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.
+
+ m_tool->resetCursorAndProjectInfoBeforeBuild();
+ 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;