ExtensionSystem: Introduce alias PluginSpecs

Change-Id: Ic7b87246cf91328c4291bbce5760a45dfa0b14e5
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Alessandro Portale
2024-05-10 15:48:32 +02:00
parent 465ad7b0fc
commit 6663f7c9bd
14 changed files with 47 additions and 45 deletions

View File

@@ -91,8 +91,6 @@ const char PLUGINPATH_OPTION[] = "-pluginpath";
const char LANGUAGE_OPTION[] = "-language"; const char LANGUAGE_OPTION[] = "-language";
const char USER_LIBRARY_PATH_OPTION[] = "-user-library-path"; // hidden option for qtcreator.sh const char USER_LIBRARY_PATH_OPTION[] = "-user-library-path"; // hidden option for qtcreator.sh
using PluginSpecSet = QVector<PluginSpec *>;
// Helpers for displaying messages. Note that there is no console on Windows. // Helpers for displaying messages. Note that there is no console on Windows.
// Format as <pre> HTML // Format as <pre> HTML
@@ -795,7 +793,7 @@ int main(int argc, char **argv)
settingspath}; settingspath};
PluginManager::setCreatorProcessData(processData); PluginManager::setCreatorProcessData(processData);
const PluginSpecSet plugins = PluginManager::plugins(); const PluginSpecs plugins = PluginManager::plugins();
PluginSpec *coreplugin = nullptr; PluginSpec *coreplugin = nullptr;
for (PluginSpec *spec : plugins) { for (PluginSpec *spec : plugins) {
if (spec->name() == QLatin1String(corePluginNameC)) { if (spec->name() == QLatin1String(corePluginNameC)) {

View File

@@ -50,6 +50,7 @@
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <type_traits>
Q_LOGGING_CATEGORY(pluginLog, "qtc.extensionsystem", QtWarningMsg) Q_LOGGING_CATEGORY(pluginLog, "qtc.extensionsystem", QtWarningMsg)
@@ -327,7 +328,7 @@ void PluginManager::loadPluginsAtRuntime(const QSet<PluginSpec *> &plugins)
d->loadPluginsAtRuntime(plugins); d->loadPluginsAtRuntime(plugins);
} }
void PluginManager::addPlugins(const QVector<PluginSpec *> &specs) void PluginManager::addPlugins(const PluginSpecs &specs)
{ {
d->addPlugins(specs); d->addPlugins(specs);
} }
@@ -556,12 +557,12 @@ QStringList PluginManager::argumentsForRestart()
\sa setPluginPaths() \sa setPluginPaths()
*/ */
const QVector<PluginSpec *> PluginManager::plugins() const PluginSpecs PluginManager::plugins()
{ {
return d->pluginSpecs; return d->pluginSpecs;
} }
QHash<QString, QVector<PluginSpec *>> PluginManager::pluginCollections() QHash<QString, PluginSpecs> PluginManager::pluginCollections()
{ {
return d->pluginCategories; return d->pluginCategories;
} }
@@ -903,8 +904,10 @@ PluginManager::ProcessData PluginManager::creatorProcessData()
/*! /*!
Returns a list of plugins in load order. Returns a list of plugins in load order.
*/ */
QVector<PluginSpec *> PluginManager::loadQueue() PluginSpecs PluginManager::loadQueue()
{ {
// Ensure order preservation
static_assert(std::is_same<PluginSpecs, QList<class PluginSpec *> >::value);
return d->loadQueue(); return d->loadQueue();
} }
@@ -1034,7 +1037,7 @@ void PluginManagerPrivate::stopAll()
m_isShuttingDown = true; m_isShuttingDown = true;
delayedInitializeTimer.stop(); delayedInitializeTimer.stop();
const QVector<PluginSpec *> queue = loadQueue(); const PluginSpecs queue = loadQueue();
for (PluginSpec *spec : queue) for (PluginSpec *spec : queue)
loadPlugin(spec, PluginSpec::Stopped); loadPlugin(spec, PluginSpec::Stopped);
} }
@@ -1371,7 +1374,7 @@ void PluginManagerPrivate::loadPlugins()
if (m_profilingVerbosity > 0) if (m_profilingVerbosity > 0)
qDebug("Profiling started"); qDebug("Profiling started");
const QVector<PluginSpec *> queue = loadQueue(); const PluginSpecs queue = loadQueue();
Utils::setMimeStartupPhase(MimeStartupPhase::PluginsLoading); Utils::setMimeStartupPhase(MimeStartupPhase::PluginsLoading);
{ {
NANOTRACE_SCOPE("ExtensionSystem", "Load"); NANOTRACE_SCOPE("ExtensionSystem", "Load");
@@ -1477,11 +1480,11 @@ void PluginManagerPrivate::shutdown()
/*! /*!
\internal \internal
*/ */
const QVector<PluginSpec *> PluginManagerPrivate::loadQueue() const PluginSpecs PluginManagerPrivate::loadQueue()
{ {
QVector<PluginSpec *> queue; PluginSpecs queue;
for (PluginSpec *spec : std::as_const(pluginSpecs)) { for (PluginSpec *spec : std::as_const(pluginSpecs)) {
QVector<PluginSpec *> circularityCheckQueue; PluginSpecs circularityCheckQueue;
loadQueue(spec, queue, circularityCheckQueue); loadQueue(spec, queue, circularityCheckQueue);
} }
return queue; return queue;
@@ -1491,8 +1494,8 @@ const QVector<PluginSpec *> PluginManagerPrivate::loadQueue()
\internal \internal
*/ */
bool PluginManagerPrivate::loadQueue(PluginSpec *spec, bool PluginManagerPrivate::loadQueue(PluginSpec *spec,
QVector<PluginSpec *> &queue, PluginSpecs &queue,
QVector<PluginSpec *> &circularityCheckQueue) PluginSpecs &circularityCheckQueue)
{ {
if (queue.contains(spec)) if (queue.contains(spec))
return true; return true;
@@ -1757,7 +1760,7 @@ static const FilePaths pluginFiles(const FilePaths &pluginPaths)
return pluginFiles; return pluginFiles;
} }
void PluginManagerPrivate::addPlugins(const QVector<PluginSpec *> &specs) void PluginManagerPrivate::addPlugins(const PluginSpecs &specs)
{ {
pluginSpecs += specs; pluginSpecs += specs;
@@ -1791,7 +1794,7 @@ void PluginManagerPrivate::addPlugins(const QVector<PluginSpec *> &specs)
*/ */
void PluginManagerPrivate::readPluginPaths() void PluginManagerPrivate::readPluginPaths()
{ {
QVector<PluginSpec *> newSpecs; PluginSpecs newSpecs;
// from the file system // from the file system
for (const FilePath &pluginFile : pluginFiles(pluginPaths)) { for (const FilePath &pluginFile : pluginFiles(pluginPaths)) {
@@ -1826,7 +1829,7 @@ void PluginManagerPrivate::enableDependenciesIndirectly()
for (PluginSpec *spec : std::as_const(pluginSpecs)) for (PluginSpec *spec : std::as_const(pluginSpecs))
spec->setEnabledIndirectly(false); spec->setEnabledIndirectly(false);
// cannot use reverse loadQueue here, because test dependencies can introduce circles // cannot use reverse loadQueue here, because test dependencies can introduce circles
QVector<PluginSpec *> queue = Utils::filtered(pluginSpecs, &PluginSpec::isEffectivelyEnabled); PluginSpecs queue = Utils::filtered(pluginSpecs, &PluginSpec::isEffectivelyEnabled);
while (!queue.isEmpty()) { while (!queue.isEmpty()) {
PluginSpec *spec = queue.takeFirst(); PluginSpec *spec = queue.takeFirst();
queue += spec->enableDependenciesIndirectly(containsTestSpec(spec)); queue += spec->enableDependenciesIndirectly(containsTestSpec(spec));
@@ -1900,7 +1903,7 @@ void PluginManagerPrivate::profilingReport(const char *what, const PluginSpec *s
QString PluginManagerPrivate::profilingSummary(qint64 *totalOut) const QString PluginManagerPrivate::profilingSummary(qint64 *totalOut) const
{ {
QString summary; QString summary;
const QVector<PluginSpec *> specs = Utils::sorted(pluginSpecs, const PluginSpecs specs = Utils::sorted(pluginSpecs,
[](PluginSpec *s1, PluginSpec *s2) { [](PluginSpec *s1, PluginSpec *s2) {
return s1->performanceData().total() return s1->performanceData().total()
< s2->performanceData().total(); < s2->performanceData().total();

View File

@@ -635,12 +635,12 @@ void PluginSpec::setForceEnabled(bool value)
} }
// returns the plugins that it actually indirectly enabled // returns the plugins that it actually indirectly enabled
QVector<PluginSpec *> PluginSpec::enableDependenciesIndirectly(bool enableTestDependencies) PluginSpecs PluginSpec::enableDependenciesIndirectly(bool enableTestDependencies)
{ {
if (!isEffectivelyEnabled()) // plugin not enabled, nothing to do if (!isEffectivelyEnabled()) // plugin not enabled, nothing to do
return {}; return {};
QVector<PluginSpec *> enabled; PluginSpecs enabled;
for (auto it = d->dependencySpecs.cbegin(), end = d->dependencySpecs.cend(); it != end; ++it) { for (auto it = d->dependencySpecs.cbegin(), end = d->dependencySpecs.cend(); it != end; ++it) {
if (it.key().type != PluginDependency::Required if (it.key().type != PluginDependency::Required
&& (!enableTestDependencies || it.key().type != PluginDependency::Test)) && (!enableTestDependencies || it.key().type != PluginDependency::Test))
@@ -1058,7 +1058,7 @@ int PluginSpec::versionCompare(const QString &version1, const QString &version2)
/*! /*!
\internal \internal
*/ */
bool PluginSpec::resolveDependencies(const QVector<PluginSpec *> &specs) bool PluginSpec::resolveDependencies(const PluginSpecs &specs)
{ {
if (hasError()) if (hasError())
return false; return false;

View File

@@ -78,6 +78,8 @@ struct EXTENSIONSYSTEM_EXPORT PerformanceData
} }
}; };
using PluginSpecs = QList<class PluginSpec *>;
class EXTENSIONSYSTEM_EXPORT PluginSpec class EXTENSIONSYSTEM_EXPORT PluginSpec
{ {
friend class ::tst_PluginSpec; friend class ::tst_PluginSpec;
@@ -130,8 +132,8 @@ public:
virtual bool provides(const QString &pluginName, const QString &pluginVersion) const; virtual bool provides(const QString &pluginName, const QString &pluginVersion) const;
virtual bool requiresAny(const QSet<PluginSpec *> &plugins) const; virtual bool requiresAny(const QSet<PluginSpec *> &plugins) const;
virtual QVector<PluginSpec *> enableDependenciesIndirectly(bool enableTestDependencies); virtual PluginSpecs enableDependenciesIndirectly(bool enableTestDependencies);
virtual bool resolveDependencies(const QVector<PluginSpec *> &pluginSpecs); virtual bool resolveDependencies(const PluginSpecs &pluginSpecs);
virtual IPlugin *plugin() const = 0; virtual IPlugin *plugin() const = 0;
virtual State state() const; virtual State state() const;

View File

@@ -198,7 +198,7 @@ public:
class CollectionItem : public TreeItem class CollectionItem : public TreeItem
{ {
public: public:
CollectionItem(const QString &name, const QVector<PluginSpec *> &plugins, PluginView *view) CollectionItem(const QString &name, const PluginSpecs &plugins, PluginView *view)
: m_name(name) : m_name(name)
, m_plugins(plugins) , m_plugins(plugins)
, m_view(view) , m_view(view)
@@ -238,7 +238,7 @@ public:
bool setData(int column, const QVariant &data, int role) override bool setData(int column, const QVariant &data, int role) override
{ {
if (column == LoadedColumn && role == Qt::CheckStateRole) { if (column == LoadedColumn && role == Qt::CheckStateRole) {
const QVector<PluginSpec *> affectedPlugins const PluginSpecs affectedPlugins
= Utils::filtered(m_plugins, [](PluginSpec *spec) { return !spec->isRequired(); }); = Utils::filtered(m_plugins, [](PluginSpec *spec) { return !spec->isRequired(); });
if (m_view->setPluginsEnabled(toSet(affectedPlugins), data.toBool())) { if (m_view->setPluginsEnabled(toSet(affectedPlugins), data.toBool())) {
update(); update();
@@ -258,7 +258,7 @@ public:
public: public:
QString m_name; QString m_name;
const QVector<PluginSpec *> m_plugins; const PluginSpecs m_plugins;
PluginView *m_view; // Not owned. PluginView *m_view; // Not owned.
}; };
@@ -346,7 +346,7 @@ void PluginView::updatePlugins()
// Model. // Model.
m_model->clear(); m_model->clear();
const QHash<QString, QVector<PluginSpec *>> pluginCollections const QHash<QString, PluginSpecs> pluginCollections
= PluginManager::pluginCollections(); = PluginManager::pluginCollections();
std::vector<CollectionItem *> collections; std::vector<CollectionItem *> collections;
const auto end = pluginCollections.cend(); const auto end = pluginCollections.cend();

View File

@@ -33,7 +33,7 @@ namespace ClangFormat {
static bool isBeautifierPluginActivated() static bool isBeautifierPluginActivated()
{ {
const QVector<ExtensionSystem::PluginSpec *> specs = ExtensionSystem::PluginManager::plugins(); const ExtensionSystem::PluginSpecs specs = ExtensionSystem::PluginManager::plugins();
return std::find_if(specs.begin(), return std::find_if(specs.begin(),
specs.end(), specs.end(),
[](ExtensionSystem::PluginSpec *spec) { [](ExtensionSystem::PluginSpec *spec) {

View File

@@ -401,7 +401,7 @@ QSet<Id> IWizardFactory::pluginFeatures()
{ {
if (s_plugins.isEmpty()) { if (s_plugins.isEmpty()) {
// Implicitly create a feature for each plugin loaded: // Implicitly create a feature for each plugin loaded:
const QVector<ExtensionSystem::PluginSpec *> pluginVector = ExtensionSystem::PluginManager::plugins(); const ExtensionSystem::PluginSpecs pluginVector = ExtensionSystem::PluginManager::plugins();
for (const ExtensionSystem::PluginSpec *s : pluginVector) { for (const ExtensionSystem::PluginSpec *s : pluginVector) {
if (s->state() == ExtensionSystem::PluginSpec::Running) if (s->state() == ExtensionSystem::PluginSpec::Running)
s_plugins.insert(Id::fromString(s->name())); s_plugins.insert(Id::fromString(s->name()));

View File

@@ -37,7 +37,6 @@ namespace ExtensionManager::Internal {
Q_LOGGING_CATEGORY(browserLog, "qtc.extensionmanager.browser", QtWarningMsg) Q_LOGGING_CATEGORY(browserLog, "qtc.extensionmanager.browser", QtWarningMsg)
using PluginSpecList = QList<const PluginSpec *>;
using Tags = QStringList; using Tags = QStringList;
constexpr QSize itemSize = {330, 86}; constexpr QSize itemSize = {330, 86};

View File

@@ -1722,7 +1722,7 @@ void editIn3dView(const SelectionContext &selectionContext)
bool isEffectComposerActivated() bool isEffectComposerActivated()
{ {
const QVector<ExtensionSystem::PluginSpec *> specs = ExtensionSystem::PluginManager::plugins(); const ExtensionSystem::PluginSpecs specs = ExtensionSystem::PluginManager::plugins();
return std::find_if(specs.begin(), specs.end(), return std::find_if(specs.begin(), specs.end(),
[](ExtensionSystem::PluginSpec *spec) { [](ExtensionSystem::PluginSpec *spec) {
return spec->name() == "EffectComposer" && spec->isEffectivelyEnabled(); return spec->name() == "EffectComposer" && spec->isEffectivelyEnabled();

View File

@@ -165,7 +165,7 @@ void QmlPreviewWidgetPlugin::setLanguageLocale(const QString &locale)
QObject *QmlPreviewWidgetPlugin::getPreviewPlugin() QObject *QmlPreviewWidgetPlugin::getPreviewPlugin()
{ {
const QVector<ExtensionSystem::PluginSpec *> &specs = ExtensionSystem::PluginManager::plugins(); const ExtensionSystem::PluginSpecs &specs = ExtensionSystem::PluginManager::plugins();
const auto pluginIt = std::find_if(specs.cbegin(), specs.cend(), const auto pluginIt = std::find_if(specs.cbegin(), specs.cend(),
[](const ExtensionSystem::PluginSpec *p) { [](const ExtensionSystem::PluginSpec *p) {
return p->name() == "QmlPreview"; return p->name() == "QmlPreview";

View File

@@ -29,7 +29,7 @@ private slots:
static ExtensionSystem::IPlugin *getPlugin() static ExtensionSystem::IPlugin *getPlugin()
{ {
const QVector<ExtensionSystem::PluginSpec *> plugins = ExtensionSystem::PluginManager::plugins(); const ExtensionSystem::PluginSpecs plugins = ExtensionSystem::PluginManager::plugins();
auto it = std::find_if(plugins.begin(), plugins.end(), [](ExtensionSystem::PluginSpec *spec) { auto it = std::find_if(plugins.begin(), plugins.end(), [](ExtensionSystem::PluginSpec *spec) {
return spec->name() == "QmlPreview"; return spec->name() == "QmlPreview";
}); });

View File

@@ -21,7 +21,7 @@ namespace QmlProjectManager {
static bool isMultilanguagePresent() static bool isMultilanguagePresent()
{ {
const QVector<ExtensionSystem::PluginSpec *> &specs = ExtensionSystem::PluginManager::plugins(); const ExtensionSystem::PluginSpecs &specs = ExtensionSystem::PluginManager::plugins();
return std::find_if(specs.cbegin(), specs.cend(), return std::find_if(specs.cbegin(), specs.cend(),
[](ExtensionSystem::PluginSpec *spec) { [](ExtensionSystem::PluginSpec *spec) {
return spec->name() == "MultiLanguage"; return spec->name() == "MultiLanguage";
@@ -41,7 +41,7 @@ static FilePath getMultilanguageDatabaseFilePath(ProjectExplorer::Target *target
static QObject *getPreviewPlugin() static QObject *getPreviewPlugin()
{ {
const QVector<ExtensionSystem::PluginSpec *> &specs = ExtensionSystem::PluginManager::plugins(); const ExtensionSystem::PluginSpecs &specs = ExtensionSystem::PluginManager::plugins();
const auto pluginIt = std::find_if(specs.cbegin(), specs.cend(), const auto pluginIt = std::find_if(specs.cbegin(), specs.cend(),
[](const ExtensionSystem::PluginSpec *p) { [](const ExtensionSystem::PluginSpec *p) {
return p->name() == "QmlPreview"; return p->name() == "QmlPreview";

View File

@@ -140,7 +140,7 @@ void tst_PluginManager::circularPlugins()
{ {
PluginManager::setPluginPaths({pluginFolder(QLatin1String("circularplugins"))}); PluginManager::setPluginPaths({pluginFolder(QLatin1String("circularplugins"))});
PluginManager::loadPlugins(); PluginManager::loadPlugins();
const QVector<PluginSpec *> plugins = PluginManager::plugins(); const PluginSpecs plugins = PluginManager::plugins();
QCOMPARE(plugins.count(), 3); QCOMPARE(plugins.count(), 3);
for (PluginSpec *spec : plugins) { for (PluginSpec *spec : plugins) {
if (spec->name() == "plugin1") { if (spec->name() == "plugin1") {
@@ -164,7 +164,7 @@ void tst_PluginManager::correctPlugins1()
PluginManager::loadPlugins(); PluginManager::loadPlugins();
bool specError = false; bool specError = false;
bool runError = false; bool runError = false;
const QVector<PluginSpec *> plugins = PluginManager::plugins(); const PluginSpecs plugins = PluginManager::plugins();
for (PluginSpec *spec : plugins) { for (PluginSpec *spec : plugins) {
if (spec->hasError()) { if (spec->hasError()) {
qDebug() << spec->filePath(); qDebug() << spec->filePath();

View File

@@ -232,7 +232,7 @@ void tst_PluginSpec::locationAndPath()
void tst_PluginSpec::resolveDependencies() void tst_PluginSpec::resolveDependencies()
{ {
QVector<PluginSpec *> specs; PluginSpecs specs;
PluginSpec *spec1 = new CppPluginSpec(); PluginSpec *spec1 = new CppPluginSpec();
specs.append(spec1); specs.append(spec1);
spec1->readMetaData(metaData("testdependencies/spec1.json")); spec1->readMetaData(metaData("testdependencies/spec1.json"));
@@ -276,7 +276,7 @@ void tst_PluginSpec::loadLibrary()
QVERIFY(ps); QVERIFY(ps);
CppPluginSpec *spec = static_cast<CppPluginSpec *>(ps.value()); CppPluginSpec *spec = static_cast<CppPluginSpec *>(ps.value());
QVERIFY(spec->resolveDependencies(QVector<PluginSpec *>())); QVERIFY(spec->resolveDependencies({}));
QVERIFY2(spec->loadLibrary(), qPrintable(spec->errorString())); QVERIFY2(spec->loadLibrary(), qPrintable(spec->errorString()));
QVERIFY(spec->plugin() != 0); QVERIFY(spec->plugin() != 0);
QVERIFY(QLatin1String(spec->plugin()->metaObject()->className()) QVERIFY(QLatin1String(spec->plugin()->metaObject()->className())
@@ -293,7 +293,7 @@ void tst_PluginSpec::initializePlugin()
PLUGIN_DIR_PATH / "testplugin" / libraryName(QLatin1String("test"))); PLUGIN_DIR_PATH / "testplugin" / libraryName(QLatin1String("test")));
QVERIFY(ps); QVERIFY(ps);
CppPluginSpec *spec = static_cast<CppPluginSpec *>(ps.value()); CppPluginSpec *spec = static_cast<CppPluginSpec *>(ps.value());
QVERIFY(spec->resolveDependencies(QVector<PluginSpec *>())); QVERIFY(spec->resolveDependencies({}));
QVERIFY2(spec->loadLibrary(), qPrintable(spec->errorString())); QVERIFY2(spec->loadLibrary(), qPrintable(spec->errorString()));
bool isInitialized; bool isInitialized;
QMetaObject::invokeMethod(spec->plugin(), QMetaObject::invokeMethod(spec->plugin(),
@@ -317,7 +317,7 @@ void tst_PluginSpec::initializeExtensions()
PLUGIN_DIR_PATH / "testplugin" / libraryName(QLatin1String("test"))); PLUGIN_DIR_PATH / "testplugin" / libraryName(QLatin1String("test")));
QVERIFY(ps); QVERIFY(ps);
CppPluginSpec *spec = static_cast<CppPluginSpec *>(ps.value()); CppPluginSpec *spec = static_cast<CppPluginSpec *>(ps.value());
QVERIFY(spec->resolveDependencies(QVector<PluginSpec *>())); QVERIFY(spec->resolveDependencies({}));
QVERIFY2(spec->loadLibrary(), qPrintable(spec->errorString())); QVERIFY2(spec->loadLibrary(), qPrintable(spec->errorString()));
bool isExtensionsInitialized; bool isExtensionsInitialized;
QVERIFY(spec->initializePlugin()); QVERIFY(spec->initializePlugin());