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:
hjk
2015-02-18 10:36:00 +01:00
parent 538af8ba17
commit da92b09969
11 changed files with 138 additions and 230 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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 \

View File

@@ -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",
]
}

View File

@@ -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

View File

@@ -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