Utils: Use more views in Id setup

Since this means that StringBuilder expressions are not usable
as arguments anymore, use .withSuffix() more extensively.

This makes this "unusual" construction also a bit better findable.

No measurable performance gain or loss in either direction.

Change-Id: I04508e77764455bd9d3a21eda63bc6de01508e4b
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2024-07-23 19:11:52 +02:00
parent f64440e4b8
commit 87280f25ce
18 changed files with 69 additions and 75 deletions

View File

@@ -16,6 +16,7 @@
#include "floatingdockcontainer.h"
#include <QAbstractButton>
#include <QCoreApplication>
#include <QDebug>
#include <QGridLayout>
#include <QList>

View File

@@ -82,7 +82,7 @@ static QHash<quintptr, StringHolder> stringFromId;
static IdCache idFromString;
static QReadWriteLock s_cacheMutex;
static quintptr theId(const char *str, int n = 0)
static quintptr theId(const char *str, int n)
{
QTC_ASSERT(str && *str, return 0);
StringHolder sh(str, n);
@@ -107,11 +107,6 @@ static quintptr theId(const char *str, int n = 0)
return res;
}
static quintptr theId(const QByteArray &ba)
{
return theId(ba.constData(), ba.size());
}
/*!
\fn Utils::Id::Id(quintptr uid)
\internal
@@ -181,11 +176,12 @@ Key Id::toKey() const
\sa toString(), fromSetting()
*/
Id Id::fromString(const QString &name)
Id Id::fromString(const QStringView name)
{
if (name.isEmpty())
return Id();
return Id(theId(name.toUtf8()));
const QByteArray ba = name.toUtf8();
return Id(theId(ba.data(), ba.size()));
}
/*!
@@ -199,9 +195,9 @@ Id Id::fromString(const QString &name)
\sa toString(), fromSetting()
*/
Id Id::fromName(const QByteArray &name)
Id Id::fromName(const QByteArrayView name)
{
return Id(theId(name));
return Id(theId(name.data(), name.size()));
}
/*!
@@ -228,7 +224,7 @@ Id Id::fromSetting(const QVariant &variant)
const QByteArray ba = variant.toString().toUtf8();
if (ba.isEmpty())
return Id();
return Id(theId(ba));
return Id(theId(ba.data(), ba.size()));
}
QSet<Id> Id::fromStringList(const QStringList &list)
@@ -252,7 +248,7 @@ QStringList Id::toStringList(const QSet<Id> &ids)
Id Id::withSuffix(int suffix) const
{
const QByteArray ba = name() + QByteArray::number(suffix);
return Id(ba.constData());
return Id(theId(ba.data(), ba.size()));
}
/*!
@@ -262,17 +258,17 @@ Id Id::withSuffix(int suffix) const
Id Id::withSuffix(const char *suffix) const
{
const QByteArray ba = name() + suffix;
return Id(ba.constData());
return Id(theId(ba.data(), ba.size()));
}
/*!
\overload
*/
Id Id::withSuffix(const QString &suffix) const
Id Id::withSuffix(const QStringView suffix) const
{
const QByteArray ba = name() + suffix.toUtf8();
return Id(ba.constData());
return Id(theId(ba.data(), ba.size()));
}
/*!
@@ -286,10 +282,9 @@ Id Id::withSuffix(const QString &suffix) const
Id Id::withPrefix(const char *prefix) const
{
const QByteArray ba = prefix + name();
return Id(ba.constData());
return Id(theId(ba.data(), ba.size()));
}
bool Id::operator==(const char *name) const
{
QReadLocker lock(&s_cacheMutex);

View File

@@ -29,7 +29,7 @@ public:
Id withSuffix(int suffix) const;
Id withSuffix(const char *suffix) const;
Id withSuffix(const QString &suffix) const;
Id withSuffix(const QStringView suffix) const;
Id withPrefix(const char *prefix) const;
QByteArray name() const;
@@ -47,8 +47,8 @@ public:
bool alphabeticallyBefore(Id other) const;
quintptr uniqueIdentifier() const { return m_id; } // Avoid.
static Id fromString(const QString &str); // FIXME: avoid.
static Id fromName(const QByteArray &ba); // FIXME: avoid.
static Id fromString(const QStringView str); // FIXME: avoid.
static Id fromName(const QByteArrayView ba); // FIXME: avoid.
static Id fromSetting(const QVariant &variant); // Good to use.
static QSet<Id> fromStringList(const QStringList &list);

View File

@@ -441,12 +441,12 @@ AndroidDeviceInfo AndroidDevice::androidDeviceInfoFromIDevice(const IDevice *dev
Id AndroidDevice::idFromDeviceInfo(const AndroidDeviceInfo &info)
{
const QString id = (info.type == IDevice::Hardware ? info.serialNumber : info.avdName);
return Id(Constants::ANDROID_DEVICE_ID).withSuffix(':' + id);
return Id(Constants::ANDROID_DEVICE_ID).withSuffix(':').withSuffix(id);
}
Id AndroidDevice::idFromAvdInfo(const CreateAvdInfo &info)
{
return Id(Constants::ANDROID_DEVICE_ID).withSuffix(':' + info.name);
return Id(Constants::ANDROID_DEVICE_ID).withSuffix(':').withSuffix(info.name);
}
QStringList AndroidDevice::supportedAbis() const
@@ -650,10 +650,10 @@ static void handleDevicesListChange(const QString &serialNumber)
if (isEmulator) {
const QString avdName = emulatorName(serial);
const Id avdId = Id(Constants::ANDROID_DEVICE_ID).withSuffix(':' + avdName);
const Id avdId = Id(Constants::ANDROID_DEVICE_ID).withSuffix(':').withSuffix(avdName);
devMgr->setDeviceState(avdId, state);
} else {
const Id id = Id(Constants::ANDROID_DEVICE_ID).withSuffix(':' + serial);
const Id id = Id(Constants::ANDROID_DEVICE_ID).withSuffix(':').withSuffix(serial);
QString displayName = AndroidConfig::getProductModel(serial);
// Check if the device is connected via WiFi. A sample serial of such devices can be
// like: "192.168.1.190:5555"

View File

@@ -75,8 +75,9 @@ void DeviceDetector::handleDeviceEvent(QdbDeviceTracker::DeviceEventType eventTy
return;
}
const Utils::Id deviceId = Constants::QdbHardwareDevicePrefix.withSuffix(':' + serial);
const auto messagePrefix = Tr::tr("Device \"%1\" %2").arg(serial);
const Utils::Id deviceId =
Utils::Id(Constants::QdbHardwareDevicePrefix).withSuffix(':').withSuffix(serial);
const QString messagePrefix = Tr::tr("Device \"%1\" %2").arg(serial);
DeviceManager * const dm = DeviceManager::instance();
if (eventType == QdbDeviceTracker::NewDevice) {

View File

@@ -16,7 +16,7 @@ const char QdbDeployConfigurationId[] = "Qt4ProjectManager.Qdb.QdbDeployConfigur
const char QdbStopApplicationStepId[] = "Qdb.StopApplicationStep";
const char QdbMakeDefaultAppStepId[] = "Qdb.MakeDefaultAppStep";
const Utils::Id QdbHardwareDevicePrefix = "QdbHardwareDevice";
const char QdbHardwareDevicePrefix[] = "QdbHardwareDevice";
const char AppcontrollerFilepath[] = "/usr/bin/appcontroller";
} // namespace Constants

View File

@@ -97,7 +97,7 @@ ProcessProgress::ProcessProgress(Process *process)
d->m_futureInterface.reportStarted();
const QString name = d->displayName();
const auto id = Id::fromString(name + ".action");
const Id id = Id::fromString(name).withSuffix(".action");
if (d->m_parser) {
d->m_futureProgress = ProgressManager::addTask(d->m_futureInterface.future(), name, id);
} else {

View File

@@ -120,7 +120,7 @@ TaskProgress::TaskProgress(TaskTree *taskTree)
d->m_futureInterface.reportStarted();
d->advanceProgress(0);
const Id id = d->m_id.isValid() ? d->m_id : Id::fromString(d->m_displayName + ".action");
const Id id = d->m_id.isValid() ? d->m_id : Id::fromString(d->m_displayName).withSuffix(".action");
d->m_futureProgress = ProgressManager::addTask(d->m_futureInterface.future(),
d->m_displayName, id);
d->m_futureProgress->setKeepOnFinish(d->m_keep);

View File

@@ -133,7 +133,7 @@ void GitLabCloneDialog::updateUi()
void GitLabCloneDialog::cloneProject()
{
VersionControlBase *vc = static_cast<VersionControlBase *>(
Core::VcsManager::versionControl(Id::fromString("G.Git")));
Core::VcsManager::versionControl(Id("G.Git")));
QTC_ASSERT(vc, return);
const QStringList extraArgs = m_submodulesCB->isChecked() ? QStringList{ "--recursive" }
: QStringList{};

View File

@@ -204,7 +204,7 @@ void addFetchModule()
}
Utils::InfoBarEntry entry{
Utils::Id::fromString("Fetch" + pluginName),
Utils::Id("Fetch").withSuffix(pluginName),
Tr::tr("Allow the extension \"%1\" to fetch data from the internet?")
.arg(pluginName)};
entry.setDetailsWidgetCreator([pluginName, url] {
@@ -221,16 +221,16 @@ void addFetchModule()
});
entry.addCustomButton(Tr::tr("Always Allow"), [mod, pluginName, fetch]() {
mod->setAllowedToFetch(pluginName, Module::IsAllowed::Yes);
Core::ICore::infoBar()->removeInfo(Utils::Id::fromString("Fetch" + pluginName));
Core::ICore::infoBar()->removeInfo(Utils::Id("Fetch").withSuffix(pluginName));
fetch();
});
entry.addCustomButton(Tr::tr("Allow Once"), [pluginName, fetch]() {
Core::ICore::infoBar()->removeInfo(Utils::Id::fromString("Fetch" + pluginName));
Core::ICore::infoBar()->removeInfo(Utils::Id("Fetch").withSuffix(pluginName));
fetch();
});
entry.setCancelButtonInfo(Tr::tr("Deny"), [mod, notAllowed, pluginName]() {
Core::ICore::infoBar()->removeInfo(Utils::Id::fromString("Fetch" + pluginName));
Core::ICore::infoBar()->removeInfo(Utils::Id("Fetch").withSuffix(pluginName));
mod->setAllowedToFetch(pluginName, Module::IsAllowed::No);
notAllowed();
});

View File

@@ -351,8 +351,9 @@ void addInstallModule()
return;
}
const Utils::Id infoBarId = Utils::Id::fromString(
"Install" + pluginSpec->name + QString::number(qHash(installOptionsList)));
const Utils::Id infoBarId = Utils::Id("Install")
.withSuffix(pluginSpec->name)
.withSuffix(QString::number(qHash(installOptionsList)));
InfoBarEntry entry(infoBarId, msg, InfoBarEntry::GlobalSuppression::Enabled);

View File

@@ -159,7 +159,7 @@ static JsonWizardFactory::Generator parseGenerator(const QVariant &value, QStrin
*errorMessage = Tr::tr("Generator has no typeId set.");
return gen;
}
Id typeId = Id::fromString(QLatin1String(Constants::GENERATOR_ID_PREFIX) + strVal);
Id typeId = Id(Constants::GENERATOR_ID_PREFIX).withSuffix(strVal);
JsonWizardGeneratorFactory *factory
= findOr(generatorFactories(), nullptr, [typeId](JsonWizardGeneratorFactory *f) { return f->canCreate(typeId); });
if (!factory) {
@@ -326,7 +326,7 @@ std::pair<int, QStringList> JsonWizardFactory::screenSizeInfoFromPage(const QStr
* pages[i] is the page of type `pageType` and data[j] is the data item with name ScreenFactor
*/
const Utils::Id id = Utils::Id::fromString(Constants::PAGE_ID_PREFIX + pageType);
const Utils::Id id = Utils::Id(Constants::PAGE_ID_PREFIX).withSuffix(pageType);
const auto it = std::find_if(std::cbegin(m_pages), std::cend(m_pages), [&id](const Page &page) {
return page.typeId == id;
@@ -393,7 +393,7 @@ JsonWizardFactory::Page JsonWizardFactory::parsePage(const QVariant &value, QStr
*errorMessage = Tr::tr("Page has no typeId set.");
return p;
}
Id typeId = Id::fromString(QLatin1String(Constants::PAGE_ID_PREFIX) + strVal);
Id typeId = Id(Constants::PAGE_ID_PREFIX).withSuffix(strVal);
JsonWizardPageFactory *factory
= Utils::findOr(pageFactories(), nullptr, [typeId](JsonWizardPageFactory *f) { return f->canCreate(typeId); });

View File

@@ -259,13 +259,14 @@ bool JsonWizardGenerator::allDone(const JsonWizard *wizard, JsonWizard::Generato
void JsonWizardGeneratorFactory::setTypeIdsSuffixes(const QStringList &suffixes)
{
m_typeIds = Utils::transform(suffixes, [](QString suffix)
{ return Id::fromString(QString::fromLatin1(Constants::GENERATOR_ID_PREFIX) + suffix); });
m_typeIds = Utils::transform(suffixes, [](QString suffix) {
return Id(Constants::GENERATOR_ID_PREFIX).withSuffix(suffix);
});
}
void JsonWizardGeneratorFactory::setTypeIdsSuffix(const QString &suffix)
{
setTypeIdsSuffixes(QStringList() << suffix);
setTypeIdsSuffixes({suffix});
}
} // namespace ProjectExplorer

View File

@@ -9,19 +9,16 @@
namespace ProjectExplorer {
// --------------------------------------------------------------------
// JsonWizardPageFactory:
// --------------------------------------------------------------------
void JsonWizardPageFactory::setTypeIdsSuffixes(const QStringList &suffixes)
{
m_typeIds = Utils::transform(suffixes, [](const QString &suffix) {
return Utils::Id::fromString(QString::fromLatin1(Constants::PAGE_ID_PREFIX) + suffix);});
return Utils::Id(Constants::PAGE_ID_PREFIX).withSuffix(suffix);
});
}
void JsonWizardPageFactory::setTypeIdsSuffix(const QString &suffix)
{
setTypeIdsSuffixes(QStringList() << suffix);
setTypeIdsSuffixes({suffix});
}
} // namespace ProjectExplorer

View File

@@ -38,7 +38,7 @@ static Utils::Id fullId(Utils::Id id)
const QString idStr = id.toString();
QTC_ASSERT(!idStr.startsWith(prefix), return Utils::Id::fromString(idStr));
return Utils::Id::fromString(prefix + idStr);
return Utils::Id::fromString(prefix).withSuffix(idStr);
}
static bool hasOtherUsers(Utils::Id id, const QVariant &v, Kit *k)

View File

@@ -26,21 +26,21 @@
#include <QJsonDocument>
#include <QJsonObject>
const QLatin1StringView FOLDER_MIMETYPE{"inode/directory"};
const QLatin1StringView WORKSPACE_MIMETYPE{"text/x-workspace-project"};
const QLatin1StringView WORKSPACE_PROJECT_ID{"ProjectExplorer.WorkspaceProject"};
const QLatin1StringView WORKSPACE_PROJECT_RUNCONFIG_ID{"WorkspaceProject.RunConfiguration:"};
const QLatin1StringView PROJECT_NAME_KEY{"project.name"};
const QLatin1StringView FILES_EXCLUDE_KEY{"files.exclude"};
const QLatin1StringView EXCLUDE_ACTION_ID{"ProjectExplorer.ExcludeFromWorkspace"};
const QLatin1StringView RESCAN_ACTION_ID{"ProjectExplorer.RescanWorkspace"};
using namespace Utils;
using namespace Core;
namespace ProjectExplorer {
const QLatin1StringView FOLDER_MIMETYPE{"inode/directory"};
const QLatin1StringView WORKSPACE_MIMETYPE{"text/x-workspace-project"};
const char WORKSPACE_PROJECT_ID[] = "ProjectExplorer.WorkspaceProject";
const char WORKSPACE_PROJECT_RUNCONFIG_ID[] = "WorkspaceProject.RunConfiguration:";
const QLatin1StringView PROJECT_NAME_KEY{"project.name"};
const QLatin1StringView FILES_EXCLUDE_KEY{"files.exclude"};
const char EXCLUDE_ACTION_ID[] = "ProjectExplorer.ExcludeFromWorkspace";
const char RESCAN_ACTION_ID[] = "ProjectExplorer.RescanWorkspace";
const expected_str<QJsonObject> projectDefinition(const Project *project)
{
if (auto fileContents = project->projectFilePath().fileContents())
@@ -231,8 +231,8 @@ public:
WorkspaceProjectRunConfigurationFactory()
{
registerRunConfiguration<WorkspaceRunConfiguration>(
Id::fromString(WORKSPACE_PROJECT_RUNCONFIG_ID));
addSupportedProjectType(Id::fromString(WORKSPACE_PROJECT_ID));
Id(WORKSPACE_PROJECT_RUNCONFIG_ID));
addSupportedProjectType(WORKSPACE_PROJECT_ID);
}
};
@@ -243,7 +243,7 @@ public:
{
setProduct<SimpleTargetRunner>();
addSupportedRunMode(Constants::NORMAL_RUN_MODE);
addSupportedRunConfig(Id::fromString(WORKSPACE_PROJECT_RUNCONFIG_ID));
addSupportedRunConfig(WORKSPACE_PROJECT_RUNCONFIG_ID);
}
};
@@ -268,7 +268,7 @@ public:
registerBuildConfiguration<WorkspaceBuildConfiguration>
("WorkspaceProject.BuildConfiguration");
setSupportedProjectType(Id::fromString(WORKSPACE_PROJECT_ID));
setSupportedProjectType(WORKSPACE_PROJECT_ID);
setBuildGenerator([](const Kit *, const FilePath &projectPath, bool forSetup) {
BuildInfo info;
@@ -298,7 +298,7 @@ public:
projectFilePath().writeFileContents(QJsonDocument(projectJson).toJson());
}
setId(Id::fromString(WORKSPACE_PROJECT_ID));
setId(WORKSPACE_PROJECT_ID);
setDisplayName(projectDirectory().fileName());
setBuildSystemCreator<WorkspaceBuildSystem>();
}
@@ -347,8 +347,8 @@ void setupWorkspaceProject(QObject *guard)
ProjectManager::registerProjectType<WorkspaceProject>(WORKSPACE_MIMETYPE);
QAction *excludeAction = nullptr;
ActionBuilder(guard, Id::fromString(EXCLUDE_ACTION_ID))
.setContext(Id::fromString(WORKSPACE_PROJECT_ID))
ActionBuilder(guard, EXCLUDE_ACTION_ID)
.setContext(WORKSPACE_PROJECT_ID)
.setText(Tr::tr("Exclude from Project"))
.addToContainer(Constants::M_FOLDERCONTEXT, Constants::G_FOLDER_OTHER)
.addToContainer(Constants::M_FILECONTEXT, Constants::G_FILE_OTHER)
@@ -363,8 +363,8 @@ void setupWorkspaceProject(QObject *guard)
});
QAction *rescanAction = nullptr;
ActionBuilder(guard, Id::fromString(RESCAN_ACTION_ID))
.setContext(Id::fromString(WORKSPACE_PROJECT_ID))
ActionBuilder(guard, RESCAN_ACTION_ID)
.setContext(WORKSPACE_PROJECT_ID)
.setText(Tr::tr("Rescan Workspace"))
.addToContainer(Constants::M_PROJECTCONTEXT, Constants::G_PROJECT_REBUILD)
.bindContextAction(&rescanAction)

View File

@@ -347,7 +347,7 @@ void DesignModeWidget::setup()
// Create menu action
auto command = Core::ActionManager::registerAction(dockWidget->toggleViewAction(),
actionToggle.withSuffix(uniqueId + "Widget"),
actionToggle.withSuffix(uniqueId).withSuffix("Widget"),
designContext);
command->setAttribute(Core::Command::CA_Hide);
viewCommands.append(command);
@@ -368,8 +368,7 @@ void DesignModeWidget::setup()
// Create menu action
auto command = Core::ActionManager::registerAction(dockWidget->toggleViewAction(),
actionToggle.withSuffix(
widgetInfo.uniqueId + "Widget"),
actionToggle.withSuffix(widgetInfo.uniqueId).withSuffix("Widget"),
designContext);
command->setAttribute(Core::Command::CA_Hide);
viewCommands.append(command);

View File

@@ -225,7 +225,7 @@ static QSet<Id> versionedIds(const QByteArray &prefix, int major, int minor)
if (major < 0)
return result;
const QByteArray majorStr = QString::number(major).toLatin1();
const QByteArray majorStr = QByteArray::number(major);
const QByteArray featureMajor = prefix + majorStr;
const QByteArray featureDotMajor = prefix + '.' + majorStr;
@@ -233,9 +233,8 @@ static QSet<Id> versionedIds(const QByteArray &prefix, int major, int minor)
result.insert(Id::fromName(featureDotMajor));
for (int i = 0; i <= minor; ++i) {
const QByteArray minorStr = QString::number(i).toLatin1();
result.insert(Id::fromName(featureMajor + '.' + minorStr));
result.insert(Id::fromName(featureDotMajor + '.' + minorStr));
result.insert(Id::fromName(featureMajor).withSuffix('.').withSuffix(i));
result.insert(Id::fromName(featureDotMajor).withSuffix('.').withSuffix(i));
}
// FIXME: Terrible hack. Get rid of using version numbers as tags!