summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@theqtcompany.com>2015-03-11 10:33:40 +0100
committerEike Ziller <eike.ziller@theqtcompany.com>2015-03-11 10:33:40 +0100
commit8b72a55054a1fa8aa3ae86c4cdd5a41384f640f4 (patch)
tree8c0f3505953f81d049f5af25f013a99c1777659e
parentde77642551baa8bc4a88727b41a14d7ea7713185 (diff)
parent10acf6af840153b5b69e9dc32fa9ad671d8f8290 (diff)
downloadqt-creator-8b72a55054a1fa8aa3ae86c4cdd5a41384f640f4.tar.gz
Merge remote-tracking branch 'origin/3.4'
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp88
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzertool.h6
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;
};