diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2014-11-05 13:28:44 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2014-11-07 12:01:44 +0200 |
commit | 2f3666a3f05bfe5e71241b55ce72e913d547f2a4 (patch) | |
tree | 7df4b1d2daa39c9759c36406075bb1b7837389ee /plugins | |
parent | 22003c8ea05926ae1faa5497e60cacff9fadfbdd (diff) | |
download | qt-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>
Diffstat (limited to 'plugins')
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; |