diff options
author | Eike Ziller <eike.ziller@theqtcompany.com> | 2015-03-11 10:33:40 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@theqtcompany.com> | 2015-03-11 10:33:40 +0100 |
commit | 8b72a55054a1fa8aa3ae86c4cdd5a41384f640f4 (patch) | |
tree | 8c0f3505953f81d049f5af25f013a99c1777659e | |
parent | de77642551baa8bc4a88727b41a14d7ea7713185 (diff) | |
parent | 10acf6af840153b5b69e9dc32fa9ad671d8f8290 (diff) | |
download | qt-creator-8b72a55054a1fa8aa3ae86c4cdd5a41384f640f4.tar.gz |
Merge remote-tracking branch 'origin/3.4'
-rw-r--r-- | plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp | 88 | ||||
-rw-r--r-- | plugins/clangstaticanalyzer/clangstaticanalyzertool.h | 6 |
2 files changed, 77 insertions, 17 deletions
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp index 645186cc71..4e98a28ddd 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp @@ -48,6 +48,22 @@ using namespace ProjectExplorer; namespace ClangStaticAnalyzer { namespace Internal { +class DummyRunConfiguration : public RunConfiguration +{ + Q_OBJECT + +public: + DummyRunConfiguration(Target *parent) + : RunConfiguration(parent, "ClangStaticAnalyzer.DummyRunConfig") + { + setDefaultDisplayName(tr("Clang Static Analyzer")); + addExtraAspects(); + } + +private: + QWidget *createConfigurationWidget() { return 0; } +}; + ClangStaticAnalyzerTool::ClangStaticAnalyzerTool(QObject *parent) : QObject(parent) , m_diagnosticModel(0) @@ -82,6 +98,17 @@ QWidget *ClangStaticAnalyzerTool::createWidgets() m_diagnosticView->setAutoScroll(false); m_diagnosticView->setObjectName(QLatin1String("ClangStaticAnalyzerIssuesView")); m_diagnosticView->setWindowTitle(tr("Clang Static Analyzer Issues")); + foreach (auto * const model, + QList<QAbstractItemModel *>() << m_diagnosticModel << m_diagnosticFilterModel) { + connect(model, &QAbstractItemModel::rowsInserted, + this, &ClangStaticAnalyzerTool::handleStateUpdate); + connect(model, &QAbstractItemModel::rowsRemoved, + this, &ClangStaticAnalyzerTool::handleStateUpdate); + connect(model, &QAbstractItemModel::modelReset, + this, &ClangStaticAnalyzerTool::handleStateUpdate); + connect(model, &QAbstractItemModel::layoutChanged, // For QSortFilterProxyModel::invalidate() + this, &ClangStaticAnalyzerTool::handleStateUpdate); + } QDockWidget *issuesDock = AnalyzerManager::createDockWidget(ClangStaticAnalyzerToolId, m_diagnosticView); @@ -198,7 +225,6 @@ void ClangStaticAnalyzerTool::startTool() if (dontStartAfterHintForDebugMode()) return; - AnalyzerManager::showPermanentStatusMessage(QString()); m_diagnosticModel->clear(); setBusyCursor(true); Project *project = SessionManager::startupProject(); @@ -207,7 +233,23 @@ void ClangStaticAnalyzerTool::startTool() m_projectInfoBeforeBuild = CppTools::CppModelManager::instance()->projectInfo(project); QTC_ASSERT(m_projectInfoBeforeBuild.isValid(), return); m_running = true; - ProjectExplorerPlugin::runProject(project, ProjectExplorer::ClangStaticAnalyzerMode); + handleStateUpdate(); + + Target * const target = project->activeTarget(); + QTC_ASSERT(target, return); + DummyRunConfiguration *& rc = m_runConfigs[target]; + if (!rc) { + rc = new DummyRunConfiguration(target); + connect(project, &Project::aboutToRemoveTarget, this, + [this](Target *t) { m_runConfigs.remove(t); }); + const auto onProjectRemoved = [this](Project *p) { + foreach (Target * const t, p->targets()) + m_runConfigs.remove(t); + }; + connect(SessionManager::instance(), &SessionManager::aboutToRemoveProject, this, + onProjectRemoved, Qt::UniqueConnection); + } + ProjectExplorerPlugin::runRunConfiguration(rc, ProjectExplorer::ClangStaticAnalyzerMode); } CppTools::ProjectInfo ClangStaticAnalyzerTool::projectInfoBeforeBuild() const @@ -239,23 +281,9 @@ void ClangStaticAnalyzerTool::onNewDiagnosticsAvailable(const QList<Diagnostic> void ClangStaticAnalyzerTool::onEngineFinished() { - QTC_ASSERT(m_goBack, return); - QTC_ASSERT(m_goNext, return); - QTC_ASSERT(m_diagnosticModel, return); - QTC_ASSERT(m_diagnosticFilterModel, return); - resetCursorAndProjectInfoBeforeBuild(); - - const int issuesFound = m_diagnosticModel->rowCount(); - const int issuesVisible = m_diagnosticFilterModel->rowCount(); - m_goBack->setEnabled(issuesVisible > 1); - m_goNext->setEnabled(issuesVisible > 1); - - AnalyzerManager::showPermanentStatusMessage(issuesFound > 0 - ? AnalyzerManager::tr("Clang Static Analyzer finished, %n issues were found (%1 suppressed).", - 0, issuesFound).arg(issuesFound - issuesVisible) - : AnalyzerManager::tr("Clang Static Analyzer finished, no issues were found.")); m_running = false; + handleStateUpdate(); emit finished(); } @@ -266,5 +294,31 @@ void ClangStaticAnalyzerTool::setBusyCursor(bool busy) m_diagnosticView->setCursor(cursor); } +void ClangStaticAnalyzerTool::handleStateUpdate() +{ + QTC_ASSERT(m_goBack, return); + QTC_ASSERT(m_goNext, return); + QTC_ASSERT(m_diagnosticModel, return); + QTC_ASSERT(m_diagnosticFilterModel, return); + + const int issuesFound = m_diagnosticModel->rowCount(); + const int issuesVisible = m_diagnosticFilterModel->rowCount(); + m_goBack->setEnabled(issuesVisible > 1); + m_goNext->setEnabled(issuesVisible > 1); + + QString message = m_running ? tr("Clang Static Analyzer running.") + : tr("Clang Static Analyzer finished."); + message += QLatin1Char(' '); + if (issuesFound == 0) { + message += tr("No issues found."); + } else { + message += tr("%n issues found (%1 suppressed).", 0, issuesFound) + .arg(issuesFound - issuesVisible); + } + AnalyzerManager::showPermanentStatusMessage(message); +} + } // namespace Internal } // namespace ClangStaticAnalyzer + +#include "clangstaticanalyzertool.moc" diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzertool.h b/plugins/clangstaticanalyzer/clangstaticanalyzertool.h index 89c8851acc..4334884c7e 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzertool.h +++ b/plugins/clangstaticanalyzer/clangstaticanalyzertool.h @@ -22,7 +22,10 @@ #include <analyzerbase/ianalyzertool.h> #include <cpptools/cppprojects.h> +#include <QHash> + namespace Analyzer { class DetailedErrorView; } +namespace ProjectExplorer { class Target; } namespace ClangStaticAnalyzer { namespace Internal { @@ -31,6 +34,7 @@ class ClangStaticAnalyzerDiagnosticFilterModel; class ClangStaticAnalyzerDiagnosticModel; class ClangStaticAnalyzerDiagnosticView; class Diagnostic; +class DummyRunConfiguration; const char ClangStaticAnalyzerToolId[] = "ClangStaticAnalyzer"; @@ -61,6 +65,7 @@ private: void onEngineFinished(); void setBusyCursor(bool busy); + void handleStateUpdate(); private: CppTools::ProjectInfo m_projectInfoBeforeBuild; @@ -71,6 +76,7 @@ private: QAction *m_goBack; QAction *m_goNext; + QHash<ProjectExplorer::Target *, DummyRunConfiguration *> m_runConfigs; bool m_running; }; |