diff options
Diffstat (limited to 'plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp')
-rw-r--r-- | plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp | 35 |
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; |