diff options
Diffstat (limited to 'plugins/clangstaticanalyzer')
3 files changed, 29 insertions, 17 deletions
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp index df683464db..94f7f27163 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrolfactory.cpp @@ -71,19 +71,19 @@ RunControl *ClangStaticAnalyzerRunControlFactory::create(RunConfiguration *runCo Q_UNUSED(runMode); using namespace CppTools; - const ProjectInfo projectInfoAtAnalyzerStart = m_tool->projectInfo(); - QTC_ASSERT(projectInfoAtAnalyzerStart.isValid(), return 0); + const ProjectInfo projectInfoBeforeBuild = m_tool->projectInfoBeforeBuild(); + QTC_ASSERT(projectInfoBeforeBuild.isValid(), return 0); Project *project = SessionManager::startupProject(); QTC_ASSERT(project, return 0); - const ProjectInfo projectInfoNow = CppModelManager::instance()->projectInfo(project); + const ProjectInfo projectInfoAfterBuild = CppModelManager::instance()->projectInfo(project); - if (projectInfoNow.configurationOrFilesChanged(projectInfoAtAnalyzerStart)) { + 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->resetCursorAndProjectInfo(); + m_tool->resetCursorAndProjectInfoBeforeBuild(); if (errorMessage) { *errorMessage = tr( "The project configuration changed since the start of the Clang Static Analyzer. " diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp index 591e8da4ce..5042267776 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp @@ -135,10 +135,21 @@ AnalyzerRunControl *ClangStaticAnalyzerTool::createRunControl( ProjectExplorer::RunConfiguration *runConfiguration) { QTC_ASSERT(runConfiguration, return 0); - QTC_ASSERT(m_projectInfo.isValid(), return 0); + QTC_ASSERT(m_projectInfoBeforeBuild.isValid(), return 0); - ClangStaticAnalyzerRunControl *engine = new ClangStaticAnalyzerRunControl(sp, runConfiguration, - m_projectInfo); + // Some projects provides CompilerCallData once a build is finished, + // so pass on the updated Project Info unless no configuration change + // (defines/includes/files) happened. + Project *project = SessionManager::startupProject(); + QTC_ASSERT(project, return 0); + const CppTools::ProjectInfo projectInfoAfterBuild + = CppTools::CppModelManager::instance()->projectInfo(project); + QTC_ASSERT(!projectInfoAfterBuild.configurationOrFilesChanged(m_projectInfoBeforeBuild), + return 0); + m_projectInfoBeforeBuild = CppTools::ProjectInfo(); + + ClangStaticAnalyzerRunControl *engine + = new ClangStaticAnalyzerRunControl(sp, runConfiguration, projectInfoAfterBuild); connect(engine, &ClangStaticAnalyzerRunControl::starting, this, &ClangStaticAnalyzerTool::onEngineIsStarting); connect(engine, &ClangStaticAnalyzerRunControl::newDiagnosticsAvailable, @@ -196,19 +207,20 @@ void ClangStaticAnalyzerTool::startTool(StartMode mode) setBusyCursor(true); Project *project = SessionManager::startupProject(); QTC_ASSERT(project, return); + m_projectInfoBeforeBuild = CppTools::CppModelManager::instance()->projectInfo(project); + QTC_ASSERT(m_projectInfoBeforeBuild.isValid(), return); ProjectExplorerPlugin::instance()->runProject(project, runMode()); - m_projectInfo = CppTools::CppModelManager::instance()->projectInfo(project); } -CppTools::ProjectInfo ClangStaticAnalyzerTool::projectInfo() const +CppTools::ProjectInfo ClangStaticAnalyzerTool::projectInfoBeforeBuild() const { - return m_projectInfo; + return m_projectInfoBeforeBuild; } -void ClangStaticAnalyzerTool::resetCursorAndProjectInfo() +void ClangStaticAnalyzerTool::resetCursorAndProjectInfoBeforeBuild() { setBusyCursor(false); - m_projectInfo = CppTools::ProjectInfo(); + m_projectInfoBeforeBuild = CppTools::ProjectInfo(); } void ClangStaticAnalyzerTool::onEngineIsStarting() @@ -228,7 +240,7 @@ void ClangStaticAnalyzerTool::onEngineFinished() QTC_ASSERT(m_goNext, return); QTC_ASSERT(m_diagnosticModel, return); - resetCursorAndProjectInfo(); + resetCursorAndProjectInfoBeforeBuild(); const int issuesFound = m_diagnosticModel->rowCount(); m_goBack->setEnabled(issuesFound > 1); diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzertool.h b/plugins/clangstaticanalyzer/clangstaticanalyzertool.h index f049740d89..8f3bb1f196 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzertool.h +++ b/plugins/clangstaticanalyzer/clangstaticanalyzertool.h @@ -37,8 +37,8 @@ class ClangStaticAnalyzerTool : public Analyzer::IAnalyzerTool public: explicit ClangStaticAnalyzerTool(QObject *parent = 0); - CppTools::ProjectInfo projectInfo() const; - void resetCursorAndProjectInfo(); + CppTools::ProjectInfo projectInfoBeforeBuild() const; + void resetCursorAndProjectInfoBeforeBuild(); private: QWidget *createWidgets(); @@ -53,7 +53,7 @@ private: void setBusyCursor(bool busy); private: - CppTools::ProjectInfo m_projectInfo; + CppTools::ProjectInfo m_projectInfoBeforeBuild; ClangStaticAnalyzerDiagnosticModel *m_diagnosticModel; Analyzer::DetailedErrorView *m_diagnosticView; |