forked from qt-creator/qt-creator
Debugger: Add some expandable macros to Debugger options page
New %{Debugger:Name} for global use, %{Debugger:{Type,Version,...}} for expansion within the name. Also re-initialize from file if the saved version is empty (e.g. if the debugger was registered before the version field was present) Change-Id: I45568d78147597b30074a2ce4ddcf569bce15192 Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com> Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
@@ -1183,7 +1183,7 @@ void AndroidConfigurations::updateAutomaticKitList()
|
|||||||
Debugger::DebuggerItem debugger;
|
Debugger::DebuggerItem debugger;
|
||||||
debugger.setCommand(tc->suggestedDebugger());
|
debugger.setCommand(tc->suggestedDebugger());
|
||||||
debugger.setEngineType(Debugger::GdbEngineType);
|
debugger.setEngineType(Debugger::GdbEngineType);
|
||||||
debugger.setDisplayName(tr("Android Debugger for %1").arg(tc->displayName()));
|
debugger.setUnexpandedDisplayName(tr("Android Debugger for %1").arg(tc->displayName()));
|
||||||
debugger.setAutoDetected(true);
|
debugger.setAutoDetected(true);
|
||||||
debugger.setAbi(tc->targetAbi());
|
debugger.setAbi(tc->targetAbi());
|
||||||
QVariant id = Debugger::DebuggerItemManager::registerDebugger(debugger);
|
QVariant id = Debugger::DebuggerItemManager::registerDebugger(debugger);
|
||||||
@@ -1229,7 +1229,7 @@ void AndroidConfigurations::updateAutomaticKitList()
|
|||||||
Debugger::DebuggerItem debugger;
|
Debugger::DebuggerItem debugger;
|
||||||
debugger.setCommand(tc->suggestedDebugger());
|
debugger.setCommand(tc->suggestedDebugger());
|
||||||
debugger.setEngineType(Debugger::GdbEngineType);
|
debugger.setEngineType(Debugger::GdbEngineType);
|
||||||
debugger.setDisplayName(tr("Android Debugger for %1").arg(tc->displayName()));
|
debugger.setUnexpandedDisplayName(tr("Android Debugger for %1").arg(tc->displayName()));
|
||||||
debugger.setAutoDetected(true);
|
debugger.setAutoDetected(true);
|
||||||
debugger.setAbi(tc->targetAbi());
|
debugger.setAbi(tc->targetAbi());
|
||||||
QVariant id = Debugger::DebuggerItemManager::registerDebugger(debugger);
|
QVariant id = Debugger::DebuggerItemManager::registerDebugger(debugger);
|
||||||
|
@@ -35,8 +35,10 @@
|
|||||||
#include "debuggerprotocol.h"
|
#include "debuggerprotocol.h"
|
||||||
|
|
||||||
#include <projectexplorer/abi.h>
|
#include <projectexplorer/abi.h>
|
||||||
|
|
||||||
#include <utils/fileutils.h>
|
#include <utils/fileutils.h>
|
||||||
#include <utils/hostosinfo.h>
|
#include <utils/hostosinfo.h>
|
||||||
|
#include <utils/macroexpander.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
@@ -83,7 +85,7 @@ DebuggerItem::DebuggerItem(const QVariantMap &data)
|
|||||||
{
|
{
|
||||||
m_command = FileName::fromUserInput(data.value(QLatin1String(DEBUGGER_INFORMATION_COMMAND)).toString());
|
m_command = FileName::fromUserInput(data.value(QLatin1String(DEBUGGER_INFORMATION_COMMAND)).toString());
|
||||||
m_id = data.value(QLatin1String(DEBUGGER_INFORMATION_ID)).toString();
|
m_id = data.value(QLatin1String(DEBUGGER_INFORMATION_ID)).toString();
|
||||||
m_displayName = data.value(QLatin1String(DEBUGGER_INFORMATION_DISPLAYNAME)).toString();
|
m_unexpandedDisplayName = data.value(QLatin1String(DEBUGGER_INFORMATION_DISPLAYNAME)).toString();
|
||||||
m_isAutoDetected = data.value(QLatin1String(DEBUGGER_INFORMATION_AUTODETECTED), false).toBool();
|
m_isAutoDetected = data.value(QLatin1String(DEBUGGER_INFORMATION_AUTODETECTED), false).toBool();
|
||||||
m_autoDetectionSource = data.value(QLatin1String(DEBUGGER_INFORMATION_AUTODETECTION_SOURCE)).toString();
|
m_autoDetectionSource = data.value(QLatin1String(DEBUGGER_INFORMATION_AUTODETECTION_SOURCE)).toString();
|
||||||
m_version = data.value(QLatin1String(DEBUGGER_INFORMATION_VERSION)).toString();
|
m_version = data.value(QLatin1String(DEBUGGER_INFORMATION_VERSION)).toString();
|
||||||
@@ -95,6 +97,9 @@ DebuggerItem::DebuggerItem(const QVariantMap &data)
|
|||||||
if (!abi.isNull())
|
if (!abi.isNull())
|
||||||
m_abis.append(abi);
|
m_abis.append(abi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_version.isEmpty())
|
||||||
|
reinitializeFromFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerItem::createId()
|
void DebuggerItem::createId()
|
||||||
@@ -204,7 +209,7 @@ QStringList DebuggerItem::abiNames() const
|
|||||||
bool DebuggerItem::operator==(const DebuggerItem &other) const
|
bool DebuggerItem::operator==(const DebuggerItem &other) const
|
||||||
{
|
{
|
||||||
return m_id == other.m_id
|
return m_id == other.m_id
|
||||||
&& m_displayName == other.m_displayName
|
&& m_unexpandedDisplayName == other.m_unexpandedDisplayName
|
||||||
&& m_isAutoDetected == other.m_isAutoDetected
|
&& m_isAutoDetected == other.m_isAutoDetected
|
||||||
&& m_command == other.m_command;
|
&& m_command == other.m_command;
|
||||||
}
|
}
|
||||||
@@ -212,7 +217,7 @@ bool DebuggerItem::operator==(const DebuggerItem &other) const
|
|||||||
QVariantMap DebuggerItem::toMap() const
|
QVariantMap DebuggerItem::toMap() const
|
||||||
{
|
{
|
||||||
QVariantMap data;
|
QVariantMap data;
|
||||||
data.insert(QLatin1String(DEBUGGER_INFORMATION_DISPLAYNAME), m_displayName);
|
data.insert(QLatin1String(DEBUGGER_INFORMATION_DISPLAYNAME), m_unexpandedDisplayName);
|
||||||
data.insert(QLatin1String(DEBUGGER_INFORMATION_ID), m_id);
|
data.insert(QLatin1String(DEBUGGER_INFORMATION_ID), m_id);
|
||||||
data.insert(QLatin1String(DEBUGGER_INFORMATION_COMMAND), m_command.toString());
|
data.insert(QLatin1String(DEBUGGER_INFORMATION_COMMAND), m_command.toString());
|
||||||
data.insert(QLatin1String(DEBUGGER_INFORMATION_ENGINETYPE), int(m_engineType));
|
data.insert(QLatin1String(DEBUGGER_INFORMATION_ENGINETYPE), int(m_engineType));
|
||||||
@@ -223,9 +228,26 @@ QVariantMap DebuggerItem::toMap() const
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerItem::setDisplayName(const QString &displayName)
|
QString DebuggerItem::displayName() const
|
||||||
{
|
{
|
||||||
m_displayName = displayName;
|
if (!m_unexpandedDisplayName.contains(QLatin1Char('%')))
|
||||||
|
return m_unexpandedDisplayName;
|
||||||
|
|
||||||
|
MacroExpander expander;
|
||||||
|
expander.registerVariable("Debugger:Type", DebuggerKitInformation::tr("Type of Debugger Backend"),
|
||||||
|
[this] { return engineTypeName(); });
|
||||||
|
expander.registerVariable("Debugger:Version", DebuggerKitInformation::tr("Debugger"),
|
||||||
|
[this] { return !m_version.isEmpty() ? m_version :
|
||||||
|
DebuggerKitInformation::tr("Unknown debugger version"); });
|
||||||
|
expander.registerVariable("Debugger:Abi", DebuggerKitInformation::tr("Debugger"),
|
||||||
|
[this] { return !m_abis.isEmpty() ? abiNames().join(QLatin1Char(' ')) :
|
||||||
|
DebuggerKitInformation::tr("Unknown debugger ABI"); });
|
||||||
|
return expander.expand(m_unexpandedDisplayName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DebuggerItem::setUnexpandedDisplayName(const QString &displayName)
|
||||||
|
{
|
||||||
|
m_unexpandedDisplayName = displayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerItem::setEngineType(const DebuggerEngineType &engineType)
|
void DebuggerItem::setEngineType(const DebuggerEngineType &engineType)
|
||||||
|
@@ -44,7 +44,9 @@
|
|||||||
namespace Debugger {
|
namespace Debugger {
|
||||||
|
|
||||||
class DebuggerItemManager;
|
class DebuggerItemManager;
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
class DebuggerConfigWidget;
|
||||||
class DebuggerItemConfigWidget;
|
class DebuggerItemConfigWidget;
|
||||||
class DebuggerItemModel;
|
class DebuggerItemModel;
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
@@ -68,8 +70,9 @@ public:
|
|||||||
|
|
||||||
QVariant id() const { return m_id; }
|
QVariant id() const { return m_id; }
|
||||||
|
|
||||||
QString displayName() const { return m_displayName; }
|
QString displayName() const;
|
||||||
void setDisplayName(const QString &displayName);
|
QString unexpandedDisplayName() const { return m_unexpandedDisplayName; }
|
||||||
|
void setUnexpandedDisplayName(const QString &unexpandedDisplayName);
|
||||||
|
|
||||||
DebuggerEngineType engineType() const { return m_engineType; }
|
DebuggerEngineType engineType() const { return m_engineType; }
|
||||||
void setEngineType(const DebuggerEngineType &engineType);
|
void setEngineType(const DebuggerEngineType &engineType);
|
||||||
@@ -101,9 +104,10 @@ public:
|
|||||||
private:
|
private:
|
||||||
DebuggerItem(const QVariant &id);
|
DebuggerItem(const QVariant &id);
|
||||||
void reinitializeFromFile();
|
void reinitializeFromFile();
|
||||||
|
void initMacroExpander();
|
||||||
|
|
||||||
QVariant m_id;
|
QVariant m_id;
|
||||||
QString m_displayName;
|
QString m_unexpandedDisplayName;
|
||||||
DebuggerEngineType m_engineType;
|
DebuggerEngineType m_engineType;
|
||||||
Utils::FileName m_command;
|
Utils::FileName m_command;
|
||||||
bool m_isAutoDetected;
|
bool m_isAutoDetected;
|
||||||
@@ -111,6 +115,7 @@ private:
|
|||||||
QString m_version;
|
QString m_version;
|
||||||
QList<ProjectExplorer::Abi> m_abis;
|
QList<ProjectExplorer::Abi> m_abis;
|
||||||
|
|
||||||
|
friend class Internal::DebuggerConfigWidget;
|
||||||
friend class Internal::DebuggerItemConfigWidget;
|
friend class Internal::DebuggerItemConfigWidget;
|
||||||
friend class Internal::DebuggerItemModel;
|
friend class Internal::DebuggerItemModel;
|
||||||
friend class DebuggerItemManager;
|
friend class DebuggerItemManager;
|
||||||
|
@@ -191,7 +191,7 @@ void DebuggerItemManager::autoDetectCdbDebuggers()
|
|||||||
item.setAbis(Abi::abisOfBinary(cdb));
|
item.setAbis(Abi::abisOfBinary(cdb));
|
||||||
item.setCommand(cdb);
|
item.setCommand(cdb);
|
||||||
item.setEngineType(CdbEngineType);
|
item.setEngineType(CdbEngineType);
|
||||||
item.setDisplayName(uniqueDisplayName(tr("Auto-detected CDB at %1").arg(cdb.toUserOutput())));
|
item.setUnexpandedDisplayName(uniqueDisplayName(tr("Auto-detected CDB at %1").arg(cdb.toUserOutput())));
|
||||||
addDebugger(item);
|
addDebugger(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,7 +260,7 @@ void DebuggerItemManager::autoDetectGdbOrLldbDebuggers()
|
|||||||
item.setCommand(command);
|
item.setCommand(command);
|
||||||
item.reinitializeFromFile();
|
item.reinitializeFromFile();
|
||||||
//: %1: Debugger engine type (GDB, LLDB, CDB...), %2: Path
|
//: %1: Debugger engine type (GDB, LLDB, CDB...), %2: Path
|
||||||
item.setDisplayName(tr("System %1 at %2")
|
item.setUnexpandedDisplayName(tr("System %1 at %2")
|
||||||
.arg(item.engineTypeName()).arg(command.toUserOutput()));
|
.arg(item.engineTypeName()).arg(command.toUserOutput()));
|
||||||
item.setAutoDetected(true);
|
item.setAutoDetected(true);
|
||||||
addDebugger(item);
|
addDebugger(item);
|
||||||
@@ -299,7 +299,7 @@ void DebuggerItemManager::readLegacyDebuggers(const FileName &file)
|
|||||||
item.setCommand(command);
|
item.setCommand(command);
|
||||||
item.setAutoDetected(true);
|
item.setAutoDetected(true);
|
||||||
item.reinitializeFromFile();
|
item.reinitializeFromFile();
|
||||||
item.setDisplayName(tr("Extracted from Kit %1").arg(kitName));
|
item.setUnexpandedDisplayName(tr("Extracted from Kit %1").arg(kitName));
|
||||||
addDebugger(item);
|
addDebugger(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -379,7 +379,7 @@ QVariant DebuggerItemManager::registerDebugger(const DebuggerItem &item)
|
|||||||
if (d.command() == item.command()
|
if (d.command() == item.command()
|
||||||
&& d.isAutoDetected() == item.isAutoDetected()
|
&& d.isAutoDetected() == item.isAutoDetected()
|
||||||
&& d.engineType() == item.engineType()
|
&& d.engineType() == item.engineType()
|
||||||
&& d.displayName() == item.displayName()
|
&& d.unexpandedDisplayName() == item.unexpandedDisplayName()
|
||||||
&& d.abis() == item.abis()) {
|
&& d.abis() == item.abis()) {
|
||||||
return d.id();
|
return d.id();
|
||||||
}
|
}
|
||||||
@@ -407,7 +407,7 @@ void DebuggerItemManager::deregisterDebugger(const QVariant &id)
|
|||||||
QString DebuggerItemManager::uniqueDisplayName(const QString &base)
|
QString DebuggerItemManager::uniqueDisplayName(const QString &base)
|
||||||
{
|
{
|
||||||
foreach (const DebuggerItem &item, m_debuggers)
|
foreach (const DebuggerItem &item, m_debuggers)
|
||||||
if (item.displayName() == base)
|
if (item.unexpandedDisplayName() == base)
|
||||||
return uniqueDisplayName(base + QLatin1String(" (1)"));
|
return uniqueDisplayName(base + QLatin1String(" (1)"));
|
||||||
|
|
||||||
return base;
|
return base;
|
||||||
|
@@ -304,18 +304,18 @@ KitConfigWidget *DebuggerKitInformation::createConfigWidget(Kit *k) const
|
|||||||
|
|
||||||
void DebuggerKitInformation::addToMacroExpander(Kit *kit, MacroExpander *expander) const
|
void DebuggerKitInformation::addToMacroExpander(Kit *kit, MacroExpander *expander) const
|
||||||
{
|
{
|
||||||
|
expander->registerVariable("Debugger:Name", tr("Name of Debugger"),
|
||||||
|
[this, kit]() -> QString {
|
||||||
|
const DebuggerItem *item = debugger(kit);
|
||||||
|
return item ? item->displayName() : tr("Unknown debugger");
|
||||||
|
});
|
||||||
|
|
||||||
expander->registerVariable("Debugger:Type", tr("Type of Debugger Backend"),
|
expander->registerVariable("Debugger:Type", tr("Type of Debugger Backend"),
|
||||||
[this, kit]() -> QString {
|
[this, kit]() -> QString {
|
||||||
const DebuggerItem *item = debugger(kit);
|
const DebuggerItem *item = debugger(kit);
|
||||||
return item ? item->engineTypeName() : tr("Unknown debugger type");
|
return item ? item->engineTypeName() : tr("Unknown debugger type");
|
||||||
});
|
});
|
||||||
|
|
||||||
expander->registerVariable("Debugger:Name", tr("Debugger"),
|
|
||||||
[this, kit]() -> QString {
|
|
||||||
const DebuggerItem *item = debugger(kit);
|
|
||||||
return item ? item->displayName() : tr("Unknown debugger");
|
|
||||||
});
|
|
||||||
|
|
||||||
expander->registerVariable("Debugger:Version", tr("Debugger"),
|
expander->registerVariable("Debugger:Version", tr("Debugger"),
|
||||||
[this, kit]() -> QString {
|
[this, kit]() -> QString {
|
||||||
const DebuggerItem *item = debugger(kit);
|
const DebuggerItem *item = debugger(kit);
|
||||||
|
@@ -259,7 +259,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget(DebuggerItemModel *model)
|
|||||||
DebuggerItem DebuggerItemConfigWidget::item() const
|
DebuggerItem DebuggerItemConfigWidget::item() const
|
||||||
{
|
{
|
||||||
DebuggerItem item(m_id);
|
DebuggerItem item(m_id);
|
||||||
item.setDisplayName(m_displayNameLineEdit->text());
|
item.setUnexpandedDisplayName(m_displayNameLineEdit->text());
|
||||||
item.setCommand(m_binaryChooser->fileName());
|
item.setCommand(m_binaryChooser->fileName());
|
||||||
item.setAutoDetected(m_autodetected);
|
item.setAutoDetected(m_autodetected);
|
||||||
QList<ProjectExplorer::Abi> abiList;
|
QList<ProjectExplorer::Abi> abiList;
|
||||||
@@ -295,7 +295,7 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
|
|||||||
m_autodetected = item->isAutoDetected();
|
m_autodetected = item->isAutoDetected();
|
||||||
|
|
||||||
m_displayNameLineEdit->setEnabled(!item->isAutoDetected());
|
m_displayNameLineEdit->setEnabled(!item->isAutoDetected());
|
||||||
m_displayNameLineEdit->setText(item->displayName());
|
m_displayNameLineEdit->setText(item->unexpandedDisplayName());
|
||||||
|
|
||||||
m_typeLineEdit->setText(item->engineTypeName());
|
m_typeLineEdit->setText(item->engineTypeName());
|
||||||
|
|
||||||
@@ -435,11 +435,9 @@ void DebuggerConfigWidget::cloneDebugger()
|
|||||||
|
|
||||||
DebuggerItem newItem;
|
DebuggerItem newItem;
|
||||||
newItem.createId();
|
newItem.createId();
|
||||||
newItem.setAutoDetected(false);
|
|
||||||
newItem.setCommand(item->command());
|
newItem.setCommand(item->command());
|
||||||
newItem.setEngineType(item->engineType());
|
newItem.setUnexpandedDisplayName(DebuggerItemManager::uniqueDisplayName(tr("Clone of %1").arg(item->displayName())));
|
||||||
newItem.setAbis(item->abis());
|
newItem.reinitializeFromFile();
|
||||||
newItem.setDisplayName(DebuggerItemManager::uniqueDisplayName(tr("Clone of %1").arg(item->displayName())));
|
|
||||||
newItem.setAutoDetected(false);
|
newItem.setAutoDetected(false);
|
||||||
m_model.addDebugger(newItem, true);
|
m_model.addDebugger(newItem, true);
|
||||||
m_debuggerView->setCurrentIndex(m_model.lastIndex());
|
m_debuggerView->setCurrentIndex(m_model.lastIndex());
|
||||||
@@ -451,7 +449,7 @@ void DebuggerConfigWidget::addDebugger()
|
|||||||
item.createId();
|
item.createId();
|
||||||
item.setAutoDetected(false);
|
item.setAutoDetected(false);
|
||||||
item.setEngineType(NoEngineType);
|
item.setEngineType(NoEngineType);
|
||||||
item.setDisplayName(DebuggerItemManager::uniqueDisplayName(tr("New Debugger")));
|
item.setUnexpandedDisplayName(DebuggerItemManager::uniqueDisplayName(tr("New Debugger")));
|
||||||
item.setAutoDetected(false);
|
item.setAutoDetected(false);
|
||||||
m_model.addDebugger(item, true);
|
m_model.addDebugger(item, true);
|
||||||
m_debuggerView->setCurrentIndex(m_model.lastIndex());
|
m_debuggerView->setCurrentIndex(m_model.lastIndex());
|
||||||
|
@@ -183,7 +183,7 @@ QVariant QnxBaseConfiguration::createDebuggerItem(QnxArchitecture arch,
|
|||||||
debugger.setAbi(Abi(arch == Qnx::ArmLeV7 ? Abi::ArmArchitecture : Abi::X86Architecture,
|
debugger.setAbi(Abi(arch == Qnx::ArmLeV7 ? Abi::ArmArchitecture : Abi::X86Architecture,
|
||||||
Abi::LinuxOS, Abi::GenericLinuxFlavor, Abi::ElfFormat, 32));
|
Abi::LinuxOS, Abi::GenericLinuxFlavor, Abi::ElfFormat, 32));
|
||||||
debugger.setAutoDetected(true);
|
debugger.setAutoDetected(true);
|
||||||
debugger.setDisplayName(displayName);
|
debugger.setUnexpandedDisplayName(displayName);
|
||||||
return Debugger::DebuggerItemManager::registerDebugger(debugger);
|
return Debugger::DebuggerItemManager::registerDebugger(debugger);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user