forked from qt-creator/qt-creator
Valgrind: Dissolve ValgrindTool hierarchy level
Medium term all *Tool should be replaced by RunControl(Factory) to make the analyzer architecture more similar to Qt Creator core Change-Id: I892cfc7fe45c73cc6ac4442a288810b83cb24c17 Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
This commit is contained in:
@@ -31,6 +31,31 @@
|
||||
|
||||
#include "ianalyzertool.h"
|
||||
|
||||
#include "analyzermanager.h"
|
||||
#include "analyzerruncontrol.h"
|
||||
#include "startremotedialog.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/imode.h>
|
||||
#include <coreplugin/modemanager.h>
|
||||
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/buildconfiguration.h>
|
||||
#include <projectexplorer/session.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/checkablemessagebox.h>
|
||||
|
||||
#include <QAction>
|
||||
#include <QDialog>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QSettings>
|
||||
|
||||
using namespace Core;
|
||||
using namespace ProjectExplorer;
|
||||
|
||||
namespace Analyzer {
|
||||
|
||||
IAnalyzerTool::IAnalyzerTool(QObject *parent)
|
||||
@@ -62,4 +87,93 @@ AnalyzerAction::AnalyzerAction(QObject *parent)
|
||||
: QAction(parent)
|
||||
{}
|
||||
|
||||
static bool buildTypeAccepted(IAnalyzerTool::ToolMode toolMode,
|
||||
BuildConfiguration::BuildType buildType)
|
||||
{
|
||||
if (toolMode == IAnalyzerTool::AnyMode)
|
||||
return true;
|
||||
if (buildType == BuildConfiguration::Unknown)
|
||||
return true;
|
||||
if (buildType == BuildConfiguration::Debug
|
||||
&& toolMode == IAnalyzerTool::DebugMode)
|
||||
return true;
|
||||
if (buildType == BuildConfiguration::Release
|
||||
&& toolMode == IAnalyzerTool::ReleaseMode)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void IAnalyzerTool::startLocalTool()
|
||||
{
|
||||
// Make sure mode is shown.
|
||||
AnalyzerManager::showMode();
|
||||
|
||||
// ### not sure if we're supposed to check if the RunConFiguration isEnabled
|
||||
Project *pro = SessionManager::startupProject();
|
||||
BuildConfiguration::BuildType buildType = BuildConfiguration::Unknown;
|
||||
if (pro) {
|
||||
if (const Target *target = pro->activeTarget()) {
|
||||
// Build configuration is 0 for QML projects.
|
||||
if (const BuildConfiguration *buildConfig = target->activeBuildConfiguration())
|
||||
buildType = buildConfig->buildType();
|
||||
}
|
||||
}
|
||||
|
||||
// Check the project for whether the build config is in the correct mode
|
||||
// if not, notify the user and urge him to use the correct mode.
|
||||
if (!buildTypeAccepted(toolMode(), buildType)) {
|
||||
const QString currentMode = buildType == BuildConfiguration::Debug
|
||||
? AnalyzerManager::tr("Debug")
|
||||
: AnalyzerManager::tr("Release");
|
||||
|
||||
QString toolModeString;
|
||||
switch (toolMode()) {
|
||||
case IAnalyzerTool::DebugMode:
|
||||
toolModeString = AnalyzerManager::tr("Debug");
|
||||
break;
|
||||
case IAnalyzerTool::ReleaseMode:
|
||||
toolModeString = AnalyzerManager::tr("Release");
|
||||
break;
|
||||
default:
|
||||
QTC_CHECK(false);
|
||||
}
|
||||
//const QString toolName = displayName();
|
||||
const QString toolName = AnalyzerManager::tr("Tool"); // FIXME
|
||||
const QString title = AnalyzerManager::tr("Run %1 in %2 Mode?").arg(toolName).arg(currentMode);
|
||||
const QString message = AnalyzerManager::tr("<html><head/><body><p>You are trying "
|
||||
"to run the tool \"%1\" on an application in %2 mode. "
|
||||
"The tool is designed to be used in %3 mode.</p><p>"
|
||||
"Debug and Release mode run-time characteristics differ "
|
||||
"significantly, analytical findings for one mode may or "
|
||||
"may not be relevant for the other.</p><p>"
|
||||
"Do you want to continue and run the tool in %2 mode?</p></body></html>")
|
||||
.arg(toolName).arg(currentMode).arg(toolModeString);
|
||||
if (Utils::CheckableMessageBox::doNotAskAgainQuestion(ICore::mainWindow(),
|
||||
title, message, ICore::settings(), QLatin1String("AnalyzerCorrectModeWarning"))
|
||||
!= QDialogButtonBox::Yes)
|
||||
return;
|
||||
}
|
||||
|
||||
ProjectExplorerPlugin::instance()->runProject(pro, runMode());
|
||||
}
|
||||
|
||||
void IAnalyzerTool::startRemoteTool()
|
||||
{
|
||||
StartRemoteDialog dlg;
|
||||
if (dlg.exec() != QDialog::Accepted)
|
||||
return;
|
||||
|
||||
AnalyzerStartParameters sp;
|
||||
sp.startMode = StartRemote;
|
||||
sp.connParams = dlg.sshParams();
|
||||
sp.debuggee = dlg.executable();
|
||||
sp.debuggeeArgs = dlg.arguments();
|
||||
sp.displayName = dlg.executable();
|
||||
sp.workingDirectory = dlg.workingDirectory();
|
||||
|
||||
AnalyzerRunControl *rc = createRunControl(sp, 0);
|
||||
|
||||
ProjectExplorerPlugin::startRunControl(rc, runMode());
|
||||
}
|
||||
|
||||
} // namespace Analyzer
|
||||
|
||||
@@ -51,7 +51,7 @@ class AnalyzerRunControl;
|
||||
/**
|
||||
* This class represents an analyzation tool, e.g. "Valgrind Memcheck".
|
||||
*
|
||||
* Each tool can run in different run modes. The modes are specific to the mode.
|
||||
* Each tool can run in different run modes. The modes are specific to the tool.
|
||||
*
|
||||
* @code
|
||||
* bool YourPlugin::initialize(const QStringList &arguments, QString *errorString)
|
||||
@@ -98,6 +98,9 @@ public:
|
||||
|
||||
virtual void startTool(StartMode mode) = 0;
|
||||
|
||||
void startLocalTool();
|
||||
void startRemoteTool();
|
||||
|
||||
private:
|
||||
ProjectExplorer::RunMode m_runMode;
|
||||
ToolMode m_toolMode;
|
||||
|
||||
@@ -548,7 +548,7 @@ void QmlProfilerTool::startTool(StartMode mode)
|
||||
Project *pro = SessionManager::startupProject();
|
||||
ProjectExplorerPlugin::instance()->runProject(pro, runMode());
|
||||
} else if (mode == StartRemote) {
|
||||
startRemoteTool(this, mode);
|
||||
Internal::startRemoteTool(this, mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -498,7 +498,7 @@ static QToolButton *createToolButton(QAction *action)
|
||||
}
|
||||
|
||||
CallgrindTool::CallgrindTool(QObject *parent)
|
||||
: ValgrindTool(parent)
|
||||
: IAnalyzerTool(parent)
|
||||
{
|
||||
d = new CallgrindToolPrivate(this);
|
||||
setObjectName(QLatin1String("CallgrindTool"));
|
||||
@@ -560,7 +560,10 @@ AnalyzerRunControl *CallgrindToolPrivate::createRunControl(const AnalyzerStartPa
|
||||
|
||||
void CallgrindTool::startTool(StartMode mode)
|
||||
{
|
||||
ValgrindTool::startTool(mode);
|
||||
if (mode == StartLocal)
|
||||
startLocalTool();
|
||||
if (mode == StartRemote)
|
||||
startRemoteTool();
|
||||
d->setBusyCursor(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,14 +31,14 @@
|
||||
#ifndef CALLGRINDTOOL_H
|
||||
#define CALLGRINDTOOL_H
|
||||
|
||||
#include "valgrindtool.h"
|
||||
#include <analyzerbase/ianalyzertool.h>
|
||||
|
||||
namespace Valgrind {
|
||||
namespace Internal {
|
||||
|
||||
class CallgrindToolPrivate;
|
||||
|
||||
class CallgrindTool : public ValgrindTool
|
||||
class CallgrindTool : public Analyzer::IAnalyzerTool
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ static void initKindFilterAction(QAction *action, const QList<int> &kinds)
|
||||
}
|
||||
|
||||
MemcheckTool::MemcheckTool(QObject *parent)
|
||||
: ValgrindTool(parent)
|
||||
: IAnalyzerTool(parent)
|
||||
{
|
||||
m_settings = 0;
|
||||
m_errorModel = 0;
|
||||
@@ -599,6 +599,14 @@ void MemcheckTool::setBusyCursor(bool busy)
|
||||
m_errorView->setCursor(cursor);
|
||||
}
|
||||
|
||||
void MemcheckTool::startTool(StartMode mode)
|
||||
{
|
||||
if (mode == StartLocal)
|
||||
startLocalTool();
|
||||
if (mode == StartRemote)
|
||||
startRemoteTool();
|
||||
}
|
||||
|
||||
MemcheckWithGdbTool::MemcheckWithGdbTool(QObject *parent) :
|
||||
MemcheckTool(parent)
|
||||
{
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#ifndef MEMCHECKTOOL_H
|
||||
#define MEMCHECKTOOL_H
|
||||
|
||||
#include "valgrindtool.h"
|
||||
#include <analyzerbase/ianalyzertool.h>
|
||||
|
||||
#include <QSortFilterProxyModel>
|
||||
|
||||
@@ -76,7 +76,7 @@ private:
|
||||
bool m_filterExternalIssues;
|
||||
};
|
||||
|
||||
class MemcheckTool : public ValgrindTool
|
||||
class MemcheckTool : public Analyzer::IAnalyzerTool
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@@ -99,6 +99,7 @@ private slots:
|
||||
void loadExternalXmlLogFile();
|
||||
|
||||
private:
|
||||
void startTool(Analyzer::StartMode mode);
|
||||
QWidget *createWidgets();
|
||||
void setBusyCursor(bool busy);
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ HEADERS += \
|
||||
callgrindengine.h \
|
||||
workarounds.h \
|
||||
callgrindtextmark.h \
|
||||
valgrindtool.h \
|
||||
memchecktool.h \
|
||||
memcheckengine.h \
|
||||
memcheckerrorview.h \
|
||||
@@ -36,7 +35,6 @@ SOURCES += \
|
||||
valgrindsettings.cpp \
|
||||
valgrindrunner.cpp \
|
||||
valgrindprocess.cpp \
|
||||
valgrindtool.cpp \
|
||||
callgrindcostdelegate.cpp \
|
||||
callgrindcostview.cpp \
|
||||
callgrindhelper.cpp \
|
||||
|
||||
@@ -37,7 +37,6 @@ QtcPlugin {
|
||||
"valgrindruncontrolfactory.cpp", "valgrindruncontrolfactory.h",
|
||||
"valgrindrunner.cpp", "valgrindrunner.h",
|
||||
"valgrindsettings.cpp", "valgrindsettings.h",
|
||||
"valgrindtool.cpp", "valgrindtool.h",
|
||||
"workarounds.cpp", "workarounds.h",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing
|
||||
** Author: Nicolas Arnaud-Cormos, KDAB (nicolas.arnaud-cormos@kdab.com)
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms and
|
||||
** conditions see http://www.qt.io/terms-conditions. For further information
|
||||
** use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 or version 3 as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
||||
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
||||
** following information to ensure the GNU Lesser General Public License
|
||||
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, The Qt Company gives you certain additional
|
||||
** rights. These rights are described in The Qt Company LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "valgrindtool.h"
|
||||
|
||||
#include <analyzerbase/analyzermanager.h>
|
||||
#include <analyzerbase/analyzerruncontrol.h>
|
||||
#include <analyzerbase/startremotedialog.h>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/imode.h>
|
||||
#include <coreplugin/modemanager.h>
|
||||
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/buildconfiguration.h>
|
||||
#include <projectexplorer/session.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/checkablemessagebox.h>
|
||||
|
||||
#include <QAction>
|
||||
#include <QDialog>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QSettings>
|
||||
|
||||
using namespace Analyzer;
|
||||
using namespace Core;
|
||||
using namespace ProjectExplorer;
|
||||
|
||||
namespace Valgrind {
|
||||
namespace Internal {
|
||||
|
||||
ValgrindTool::ValgrindTool(QObject *parent)
|
||||
: IAnalyzerTool(parent)
|
||||
{}
|
||||
|
||||
static bool buildTypeAccepted(IAnalyzerTool::ToolMode toolMode,
|
||||
BuildConfiguration::BuildType buildType)
|
||||
{
|
||||
if (toolMode == IAnalyzerTool::AnyMode)
|
||||
return true;
|
||||
if (buildType == BuildConfiguration::Unknown)
|
||||
return true;
|
||||
if (buildType == BuildConfiguration::Debug
|
||||
&& toolMode == IAnalyzerTool::DebugMode)
|
||||
return true;
|
||||
if (buildType == BuildConfiguration::Release
|
||||
&& toolMode == IAnalyzerTool::ReleaseMode)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void startLocalTool(IAnalyzerTool *tool)
|
||||
{
|
||||
// Make sure mode is shown.
|
||||
AnalyzerManager::showMode();
|
||||
|
||||
// ### not sure if we're supposed to check if the RunConFiguration isEnabled
|
||||
Project *pro = SessionManager::startupProject();
|
||||
BuildConfiguration::BuildType buildType = BuildConfiguration::Unknown;
|
||||
if (pro) {
|
||||
if (const Target *target = pro->activeTarget()) {
|
||||
// Build configuration is 0 for QML projects.
|
||||
if (const BuildConfiguration *buildConfig = target->activeBuildConfiguration())
|
||||
buildType = buildConfig->buildType();
|
||||
}
|
||||
}
|
||||
|
||||
// Check the project for whether the build config is in the correct mode
|
||||
// if not, notify the user and urge him to use the correct mode.
|
||||
if (!buildTypeAccepted(tool->toolMode(), buildType)) {
|
||||
const QString currentMode = buildType == BuildConfiguration::Debug
|
||||
? AnalyzerManager::tr("Debug")
|
||||
: AnalyzerManager::tr("Release");
|
||||
|
||||
QString toolModeString;
|
||||
switch (tool->toolMode()) {
|
||||
case IAnalyzerTool::DebugMode:
|
||||
toolModeString = AnalyzerManager::tr("Debug");
|
||||
break;
|
||||
case IAnalyzerTool::ReleaseMode:
|
||||
toolModeString = AnalyzerManager::tr("Release");
|
||||
break;
|
||||
default:
|
||||
QTC_CHECK(false);
|
||||
}
|
||||
//const QString toolName = tool->displayName();
|
||||
const QString toolName = AnalyzerManager::tr("Tool"); // FIXME
|
||||
const QString title = AnalyzerManager::tr("Run %1 in %2 Mode?").arg(toolName).arg(currentMode);
|
||||
const QString message = AnalyzerManager::tr("<html><head/><body><p>You are trying "
|
||||
"to run the tool \"%1\" on an application in %2 mode. "
|
||||
"The tool is designed to be used in %3 mode.</p><p>"
|
||||
"Debug and Release mode run-time characteristics differ "
|
||||
"significantly, analytical findings for one mode may or "
|
||||
"may not be relevant for the other.</p><p>"
|
||||
"Do you want to continue and run the tool in %2 mode?</p></body></html>")
|
||||
.arg(toolName).arg(currentMode).arg(toolModeString);
|
||||
if (Utils::CheckableMessageBox::doNotAskAgainQuestion(ICore::mainWindow(),
|
||||
title, message, ICore::settings(), QLatin1String("AnalyzerCorrectModeWarning"))
|
||||
!= QDialogButtonBox::Yes)
|
||||
return;
|
||||
}
|
||||
|
||||
ProjectExplorerPlugin::instance()->runProject(pro, tool->runMode());
|
||||
}
|
||||
|
||||
static void startRemoteTool(IAnalyzerTool *tool)
|
||||
{
|
||||
StartRemoteDialog dlg;
|
||||
if (dlg.exec() != QDialog::Accepted)
|
||||
return;
|
||||
|
||||
AnalyzerStartParameters sp;
|
||||
sp.startMode = StartRemote;
|
||||
sp.connParams = dlg.sshParams();
|
||||
sp.debuggee = dlg.executable();
|
||||
sp.debuggeeArgs = dlg.arguments();
|
||||
sp.displayName = dlg.executable();
|
||||
sp.workingDirectory = dlg.workingDirectory();
|
||||
|
||||
AnalyzerRunControl *rc = tool->createRunControl(sp, 0);
|
||||
|
||||
ProjectExplorerPlugin::startRunControl(rc, tool->runMode());
|
||||
}
|
||||
|
||||
void ValgrindTool::startTool(StartMode mode)
|
||||
{
|
||||
if (mode == StartLocal)
|
||||
startLocalTool(this);
|
||||
if (mode == StartRemote)
|
||||
startRemoteTool(this);
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Valgrind
|
||||
@@ -1,53 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
** Contact: http://www.qt.io/licensing
|
||||
** Author: Nicolas Arnaud-Cormos, KDAB (nicolas.arnaud-cormos@kdab.com)
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms and
|
||||
** conditions see http://www.qt.io/terms-conditions. For further information
|
||||
** use the contact form at http://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 or version 3 as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
||||
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
||||
** following information to ensure the GNU Lesser General Public License
|
||||
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, The Qt Company gives you certain additional
|
||||
** rights. These rights are described in The Qt Company LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef VALGRINDTOOL_H
|
||||
#define VALGRINDTOOL_H
|
||||
|
||||
#include <analyzerbase/ianalyzertool.h>
|
||||
|
||||
namespace Valgrind {
|
||||
namespace Internal {
|
||||
|
||||
class ValgrindTool : public Analyzer::IAnalyzerTool
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ValgrindTool(QObject *parent = 0);
|
||||
|
||||
void startTool(Analyzer::StartMode mode);
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Valgrind
|
||||
|
||||
#endif // VALGRIND_TOOL
|
||||
Reference in New Issue
Block a user