forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/3.4'
This commit is contained in:
@@ -48,6 +48,22 @@ using namespace ProjectExplorer;
|
|||||||
namespace ClangStaticAnalyzer {
|
namespace ClangStaticAnalyzer {
|
||||||
namespace Internal {
|
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)
|
ClangStaticAnalyzerTool::ClangStaticAnalyzerTool(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_diagnosticModel(0)
|
, m_diagnosticModel(0)
|
||||||
@@ -82,6 +98,17 @@ QWidget *ClangStaticAnalyzerTool::createWidgets()
|
|||||||
m_diagnosticView->setAutoScroll(false);
|
m_diagnosticView->setAutoScroll(false);
|
||||||
m_diagnosticView->setObjectName(QLatin1String("ClangStaticAnalyzerIssuesView"));
|
m_diagnosticView->setObjectName(QLatin1String("ClangStaticAnalyzerIssuesView"));
|
||||||
m_diagnosticView->setWindowTitle(tr("Clang Static Analyzer Issues"));
|
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,
|
QDockWidget *issuesDock = AnalyzerManager::createDockWidget(ClangStaticAnalyzerToolId,
|
||||||
m_diagnosticView);
|
m_diagnosticView);
|
||||||
@@ -198,7 +225,6 @@ void ClangStaticAnalyzerTool::startTool()
|
|||||||
if (dontStartAfterHintForDebugMode())
|
if (dontStartAfterHintForDebugMode())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
AnalyzerManager::showPermanentStatusMessage(QString());
|
|
||||||
m_diagnosticModel->clear();
|
m_diagnosticModel->clear();
|
||||||
setBusyCursor(true);
|
setBusyCursor(true);
|
||||||
Project *project = SessionManager::startupProject();
|
Project *project = SessionManager::startupProject();
|
||||||
@@ -207,7 +233,23 @@ void ClangStaticAnalyzerTool::startTool()
|
|||||||
m_projectInfoBeforeBuild = CppTools::CppModelManager::instance()->projectInfo(project);
|
m_projectInfoBeforeBuild = CppTools::CppModelManager::instance()->projectInfo(project);
|
||||||
QTC_ASSERT(m_projectInfoBeforeBuild.isValid(), return);
|
QTC_ASSERT(m_projectInfoBeforeBuild.isValid(), return);
|
||||||
m_running = true;
|
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
|
CppTools::ProjectInfo ClangStaticAnalyzerTool::projectInfoBeforeBuild() const
|
||||||
@@ -239,23 +281,9 @@ void ClangStaticAnalyzerTool::onNewDiagnosticsAvailable(const QList<Diagnostic>
|
|||||||
|
|
||||||
void ClangStaticAnalyzerTool::onEngineFinished()
|
void ClangStaticAnalyzerTool::onEngineFinished()
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_goBack, return);
|
|
||||||
QTC_ASSERT(m_goNext, return);
|
|
||||||
QTC_ASSERT(m_diagnosticModel, return);
|
|
||||||
QTC_ASSERT(m_diagnosticFilterModel, return);
|
|
||||||
|
|
||||||
resetCursorAndProjectInfoBeforeBuild();
|
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;
|
m_running = false;
|
||||||
|
handleStateUpdate();
|
||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,5 +294,31 @@ void ClangStaticAnalyzerTool::setBusyCursor(bool busy)
|
|||||||
m_diagnosticView->setCursor(cursor);
|
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 Internal
|
||||||
} // namespace ClangStaticAnalyzer
|
} // namespace ClangStaticAnalyzer
|
||||||
|
|
||||||
|
#include "clangstaticanalyzertool.moc"
|
||||||
|
@@ -22,7 +22,10 @@
|
|||||||
#include <analyzerbase/ianalyzertool.h>
|
#include <analyzerbase/ianalyzertool.h>
|
||||||
#include <cpptools/cppprojects.h>
|
#include <cpptools/cppprojects.h>
|
||||||
|
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
namespace Analyzer { class DetailedErrorView; }
|
namespace Analyzer { class DetailedErrorView; }
|
||||||
|
namespace ProjectExplorer { class Target; }
|
||||||
|
|
||||||
namespace ClangStaticAnalyzer {
|
namespace ClangStaticAnalyzer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -31,6 +34,7 @@ class ClangStaticAnalyzerDiagnosticFilterModel;
|
|||||||
class ClangStaticAnalyzerDiagnosticModel;
|
class ClangStaticAnalyzerDiagnosticModel;
|
||||||
class ClangStaticAnalyzerDiagnosticView;
|
class ClangStaticAnalyzerDiagnosticView;
|
||||||
class Diagnostic;
|
class Diagnostic;
|
||||||
|
class DummyRunConfiguration;
|
||||||
|
|
||||||
const char ClangStaticAnalyzerToolId[] = "ClangStaticAnalyzer";
|
const char ClangStaticAnalyzerToolId[] = "ClangStaticAnalyzer";
|
||||||
|
|
||||||
@@ -61,6 +65,7 @@ private:
|
|||||||
void onEngineFinished();
|
void onEngineFinished();
|
||||||
|
|
||||||
void setBusyCursor(bool busy);
|
void setBusyCursor(bool busy);
|
||||||
|
void handleStateUpdate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CppTools::ProjectInfo m_projectInfoBeforeBuild;
|
CppTools::ProjectInfo m_projectInfoBeforeBuild;
|
||||||
@@ -71,6 +76,7 @@ private:
|
|||||||
|
|
||||||
QAction *m_goBack;
|
QAction *m_goBack;
|
||||||
QAction *m_goNext;
|
QAction *m_goNext;
|
||||||
|
QHash<ProjectExplorer::Target *, DummyRunConfiguration *> m_runConfigs;
|
||||||
bool m_running;
|
bool m_running;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user