Debugger: Small corrections to "Generic" item handling

Change-Id: Idd8f6a64aa64b8f13e713b3337ad1f8f2b8735db
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2023-03-28 18:22:58 +02:00
parent 463e47bbdd
commit cf138ad909
3 changed files with 81 additions and 33 deletions

View File

@@ -116,6 +116,9 @@ void DebuggerItem::createId()
void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *customEnv) void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *customEnv)
{ {
if (isGeneric())
return;
// CDB only understands the single-dash -version, whereas GDB and LLDB are // CDB only understands the single-dash -version, whereas GDB and LLDB are
// happy with both -version and --version. So use the "working" -version // happy with both -version and --version. So use the "working" -version
// except for the experimental LLDB-MI which insists on --version. // except for the experimental LLDB-MI which insists on --version.
@@ -282,6 +285,16 @@ QString DebuggerItem::engineTypeName() const
} }
} }
void DebuggerItem::setGeneric(bool on)
{
m_detectionSource = on ? QLatin1String("Generic") : QLatin1String();
}
bool DebuggerItem::isGeneric() const
{
return m_detectionSource == "Generic";
}
QStringList DebuggerItem::abiNames() const QStringList DebuggerItem::abiNames() const
{ {
QStringList list; QStringList list;
@@ -297,13 +310,15 @@ QDateTime DebuggerItem::lastModified() const
QIcon DebuggerItem::decoration() const QIcon DebuggerItem::decoration() const
{ {
if (isGeneric())
return {};
if (m_engineType == NoEngineType) if (m_engineType == NoEngineType)
return Icons::CRITICAL.icon(); return Icons::CRITICAL.icon();
if (!m_command.isExecutableFile()) if (!m_command.isExecutableFile())
return Icons::WARNING.icon(); return Icons::WARNING.icon();
if (!m_workingDirectory.isEmpty() && !m_workingDirectory.isDir()) if (!m_workingDirectory.isEmpty() && !m_workingDirectory.isDir())
return Icons::WARNING.icon(); return Icons::WARNING.icon();
return QIcon(); return {};
} }
QString DebuggerItem::validityMessage() const QString DebuggerItem::validityMessage() const

View File

@@ -8,7 +8,7 @@
#include <projectexplorer/abi.h> #include <projectexplorer/abi.h>
#include <utils/fileutils.h> #include <utils/filepath.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <QDateTime> #include <QDateTime>
@@ -84,6 +84,9 @@ public:
QString detectionSource() const { return m_detectionSource; } QString detectionSource() const { return m_detectionSource; }
void setDetectionSource(const QString &source) { m_detectionSource = source; } void setDetectionSource(const QString &source) { m_detectionSource = source; }
bool isGeneric() const;
void setGeneric(bool on);
static bool addAndroidLldbPythonEnv(const Utils::FilePath &lldbCmd, Utils::Environment &env); static bool addAndroidLldbPythonEnv(const Utils::FilePath &lldbCmd, Utils::Environment &env);
private: private:

View File

@@ -92,7 +92,8 @@ static DebuggerItemManagerPrivate *d = nullptr;
class DebuggerItemConfigWidget : public QWidget class DebuggerItemConfigWidget : public QWidget
{ {
public: public:
explicit DebuggerItemConfigWidget(); DebuggerItemConfigWidget();
void load(const DebuggerItem *item); void load(const DebuggerItem *item);
void store() const; void store() const;
@@ -104,13 +105,18 @@ private:
QLineEdit *m_displayNameLineEdit; QLineEdit *m_displayNameLineEdit;
QLineEdit *m_typeLineEdit; QLineEdit *m_typeLineEdit;
QLabel *m_cdbLabel; QLabel *m_cdbLabel;
QLineEdit *m_versionLabel;
PathChooser *m_binaryChooser; PathChooser *m_binaryChooser;
PathChooser *m_workingDirectoryChooser;
QLineEdit *m_abis;
bool m_autodetected = false; bool m_autodetected = false;
bool m_generic = false;
DebuggerEngineType m_engineType = NoEngineType; DebuggerEngineType m_engineType = NoEngineType;
QVariant m_id; QVariant m_id;
QLabel *m_abisLabel;
QLineEdit *m_abis;
QLabel *m_versionLabel;
QLineEdit *m_version;
QLabel *m_workingDirectoryLabel;
PathChooser *m_workingDirectoryChooser;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -174,7 +180,7 @@ public:
QModelIndex lastIndex() const; QModelIndex lastIndex() const;
void setCurrentIndex(const QModelIndex &index); void setCurrentIndex(const QModelIndex &index);
void addDebugger(const DebuggerItem &item, bool changed = false); DebuggerTreeItem *addDebugger(const DebuggerItem &item, bool changed = false);
void updateDebugger(const DebuggerItem &item); void updateDebugger(const DebuggerItem &item);
void apply(); void apply();
void cancel(); void cancel();
@@ -213,6 +219,7 @@ DebuggerItemModel::DebuggerItemModel()
DebuggerItem genericGdb(QVariant("gdb")); DebuggerItem genericGdb(QVariant("gdb"));
genericGdb.setAutoDetected(true); genericGdb.setAutoDetected(true);
genericGdb.setGeneric(true);
genericGdb.setEngineType(GdbEngineType); genericGdb.setEngineType(GdbEngineType);
genericGdb.setAbi(Abi()); genericGdb.setAbi(Abi());
genericGdb.setCommand("gdb"); genericGdb.setCommand("gdb");
@@ -222,17 +229,20 @@ DebuggerItemModel::DebuggerItemModel()
DebuggerItem genericLldb(QVariant("lldb")); DebuggerItem genericLldb(QVariant("lldb"));
genericLldb.setAutoDetected(true); genericLldb.setAutoDetected(true);
genericLldb.setEngineType(LldbEngineType); genericLldb.setEngineType(LldbEngineType);
genericLldb.setGeneric(true);
genericLldb.setAbi(Abi()); genericLldb.setAbi(Abi());
genericLldb.setCommand("lldb"); genericLldb.setCommand("lldb");
genericLldb.setUnexpandedDisplayName(Tr::tr("%1 from PATH on Build Device").arg("LLDB")); genericLldb.setUnexpandedDisplayName(Tr::tr("%1 from PATH on Build Device").arg("LLDB"));
generic->appendChild(new DebuggerTreeItem(genericLldb, false)); generic->appendChild(new DebuggerTreeItem(genericLldb, false));
} }
void DebuggerItemModel::addDebugger(const DebuggerItem &item, bool changed) DebuggerTreeItem *DebuggerItemModel::addDebugger(const DebuggerItem &item, bool changed)
{ {
QTC_ASSERT(item.id().isValid(), return); QTC_ASSERT(item.id().isValid(), return {});
int group = item.isAutoDetected() ? AutoDetected : Manual; int group = item.isGeneric() ? Generic : (item.isAutoDetected() ? AutoDetected : Manual);
rootItem()->childAt(group)->appendChild(new DebuggerTreeItem(item, changed)); auto treeItem = new DebuggerTreeItem(item, changed);
rootItem()->childAt(group)->appendChild(treeItem);
return treeItem;
} }
void DebuggerItemModel::updateDebugger(const DebuggerItem &item) void DebuggerItemModel::updateDebugger(const DebuggerItem &item)
@@ -321,6 +331,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
}); });
m_binaryChooser->setAllowPathFromDevice(true); m_binaryChooser->setAllowPathFromDevice(true);
m_workingDirectoryLabel = new QLabel(Tr::tr("ABIs:"));
m_workingDirectoryChooser = new PathChooser(this); m_workingDirectoryChooser = new PathChooser(this);
m_workingDirectoryChooser->setExpectedKind(PathChooser::Directory); m_workingDirectoryChooser->setExpectedKind(PathChooser::Directory);
m_workingDirectoryChooser->setMinimumWidth(400); m_workingDirectoryChooser->setMinimumWidth(400);
@@ -330,10 +341,12 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
m_cdbLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); m_cdbLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
m_cdbLabel->setOpenExternalLinks(true); m_cdbLabel->setOpenExternalLinks(true);
m_versionLabel = new QLineEdit(this); m_versionLabel = new QLabel(Tr::tr("Version:"));
m_versionLabel->setPlaceholderText(Tr::tr("Unknown")); m_version = new QLineEdit(this);
m_versionLabel->setEnabled(false); m_version->setPlaceholderText(Tr::tr("Unknown"));
m_version->setEnabled(false);
m_abisLabel = new QLabel(Tr::tr("Working directory:"));
m_abis = new QLineEdit(this); m_abis = new QLineEdit(this);
m_abis->setEnabled(false); m_abis->setEnabled(false);
@@ -343,9 +356,9 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
formLayout->addRow(m_cdbLabel); formLayout->addRow(m_cdbLabel);
formLayout->addRow(new QLabel(Tr::tr("Path:")), m_binaryChooser); formLayout->addRow(new QLabel(Tr::tr("Path:")), m_binaryChooser);
formLayout->addRow(new QLabel(Tr::tr("Type:")), m_typeLineEdit); formLayout->addRow(new QLabel(Tr::tr("Type:")), m_typeLineEdit);
formLayout->addRow(new QLabel(Tr::tr("ABIs:")), m_abis); formLayout->addRow(m_abisLabel, m_abis);
formLayout->addRow(new QLabel(Tr::tr("Version:")), m_versionLabel); formLayout->addRow(m_versionLabel, m_version);
formLayout->addRow(new QLabel(Tr::tr("Working directory:")), m_workingDirectoryChooser); formLayout->addRow(m_workingDirectoryLabel, m_workingDirectoryChooser);
connect(m_binaryChooser, &PathChooser::textChanged, connect(m_binaryChooser, &PathChooser::textChanged,
this, &DebuggerItemConfigWidget::binaryPathHasChanged); this, &DebuggerItemConfigWidget::binaryPathHasChanged);
@@ -357,21 +370,24 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
DebuggerItem DebuggerItemConfigWidget::item() const DebuggerItem DebuggerItemConfigWidget::item() const
{ {
static const QRegularExpression noAbi("[^A-Za-z0-9-_]+");
DebuggerItem item(m_id); DebuggerItem item(m_id);
item.setUnexpandedDisplayName(m_displayNameLineEdit->text()); item.setUnexpandedDisplayName(m_displayNameLineEdit->text());
item.setCommand(m_binaryChooser->filePath()); item.setCommand(m_binaryChooser->filePath());
item.setWorkingDirectory(m_workingDirectoryChooser->filePath()); item.setWorkingDirectory(m_workingDirectoryChooser->filePath());
item.setAutoDetected(m_autodetected); item.setAutoDetected(m_autodetected);
Abis abiList; Abis abiList;
const QStringList abis = m_abis->text().split(QRegularExpression("[^A-Za-z0-9-_]+")); const QStringList abis = m_abis->text().split(noAbi);
for (const QString &a : abis) { for (const QString &a : abis) {
if (a.isNull()) if (a.isNull())
continue; continue;
abiList << Abi::fromString(a); abiList << Abi::fromString(a);
} }
item.setAbis(abiList); item.setAbis(abiList);
item.setVersion(m_versionLabel->text()); item.setVersion(m_version->text());
item.setEngineType(m_engineType); item.setEngineType(m_engineType);
item.setGeneric(m_generic);
return item; return item;
} }
@@ -393,6 +409,7 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
return; return;
// Set values: // Set values:
m_generic = item->isGeneric();
m_autodetected = item->isAutoDetected(); m_autodetected = item->isAutoDetected();
m_displayNameLineEdit->setEnabled(!item->isAutoDetected()); m_displayNameLineEdit->setEnabled(!item->isAutoDetected());
@@ -402,6 +419,15 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
m_binaryChooser->setReadOnly(item->isAutoDetected()); m_binaryChooser->setReadOnly(item->isAutoDetected());
m_binaryChooser->setFilePath(item->command()); m_binaryChooser->setFilePath(item->command());
m_binaryChooser->setExpectedKind(m_generic ? PathChooser::Any : PathChooser::ExistingCommand);
m_abisLabel->setVisible(!m_generic);
m_abis->setVisible(!m_generic);
m_versionLabel->setVisible(!m_generic);
m_version->setVisible(!m_generic);
m_workingDirectoryLabel->setVisible(!m_generic);
m_workingDirectoryChooser->setVisible(!m_generic);
m_workingDirectoryChooser->setReadOnly(item->isAutoDetected()); m_workingDirectoryChooser->setReadOnly(item->isAutoDetected());
m_workingDirectoryChooser->setFilePath(item->workingDirectory()); m_workingDirectoryChooser->setFilePath(item->workingDirectory());
@@ -425,7 +451,7 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
m_cdbLabel->setText(text); m_cdbLabel->setText(text);
m_cdbLabel->setVisible(!text.isEmpty()); m_cdbLabel->setVisible(!text.isEmpty());
m_binaryChooser->setCommandVersionArguments(QStringList(versionCommand)); m_binaryChooser->setCommandVersionArguments(QStringList(versionCommand));
m_versionLabel->setText(item->version()); m_version->setText(item->version());
setAbis(item->abiNames()); setAbis(item->abiNames());
m_engineType = item->engineType(); m_engineType = item->engineType();
m_id = item->id(); m_id = item->id();
@@ -437,6 +463,7 @@ void DebuggerItemConfigWidget::binaryPathHasChanged()
if (!m_id.isValid()) if (!m_id.isValid())
return; return;
if (!m_generic) {
DebuggerItem tmp; DebuggerItem tmp;
if (m_binaryChooser->filePath().isExecutableFile()) { if (m_binaryChooser->filePath().isExecutableFile()) {
tmp = item(); tmp = item();
@@ -444,9 +471,10 @@ void DebuggerItemConfigWidget::binaryPathHasChanged()
} }
setAbis(tmp.abiNames()); setAbis(tmp.abiNames());
m_versionLabel->setText(tmp.version()); m_version->setText(tmp.version());
m_engineType = tmp.engineType(); m_engineType = tmp.engineType();
m_typeLineEdit->setText(tmp.engineTypeName()); m_typeLineEdit->setText(tmp.engineTypeName());
}
store(); store();
} }
@@ -554,8 +582,10 @@ void DebuggerConfigWidget::cloneDebugger()
newItem.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("Clone of %1").arg(item->displayName()))); newItem.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("Clone of %1").arg(item->displayName())));
newItem.reinitializeFromFile(); newItem.reinitializeFromFile();
newItem.setAutoDetected(false); newItem.setAutoDetected(false);
d->m_model->addDebugger(newItem, true); newItem.setGeneric(item->isGeneric());
m_debuggerView->setCurrentIndex(d->m_model->lastIndex()); newItem.setEngineType(item->engineType());
auto addedItem = d->m_model->addDebugger(newItem, true);
m_debuggerView->setCurrentIndex(d->m_model->indexForItem(addedItem));
} }
void DebuggerConfigWidget::addDebugger() void DebuggerConfigWidget::addDebugger()
@@ -565,8 +595,8 @@ void DebuggerConfigWidget::addDebugger()
item.setEngineType(NoEngineType); item.setEngineType(NoEngineType);
item.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("New Debugger"))); item.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("New Debugger")));
item.setAutoDetected(false); item.setAutoDetected(false);
d->m_model->addDebugger(item, true); auto addedItem = d->m_model->addDebugger(item, true);
m_debuggerView->setCurrentIndex(d->m_model->lastIndex()); m_debuggerView->setCurrentIndex(d->m_model->indexForItem(addedItem));
} }
void DebuggerConfigWidget::removeDebugger() void DebuggerConfigWidget::removeDebugger()