From cc883023090030eb341a11c4d6634ca027f02c65 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 8 Dec 2017 17:20:48 +0100 Subject: [PATCH] De-emphasize PluginManager::getObjects() ... by additionally keeping local (currently non-owning) pools per "interesting" type. Current situation: - The global object pool does not scale well for looking up objects, as iteration plus qobject_cast typically iterates over all pooled objects. - User code that can use typed results from the object pool need to have access to the full type definition anyway, i.e. depend on the plugin of the target class anyway. The patch here solves the scaling problem is to have local type-specific pools to which objects register in their constructors and deregister in their destructors. This patch here does *not* change the ownership model of the pooled objects, however, it opens the possibility to change the ownership model per type (e.g. by not putting things into the global pool at all anymore and make the local pool 'owning') and the intent is to handle that in later patchs. Even without the follow-up patches this here is a performance improvement for the cases that access the local pools instead the global one, i.e. "practically all". Change-Id: Ib11a42df2c4ecf5e1155534730083a520dd1995b Reviewed-by: Eike Ziller Reviewed-by: Christian Kandeler --- src/libs/extensionsystem/pluginmanager.h | 2 + src/libs/qmljs/qmljsinterpreter.cpp | 18 ++++++ src/libs/qmljs/qmljsinterpreter.h | 7 ++- src/libs/qmljs/qmljslink.cpp | 11 +--- src/plugins/android/androidmanager.cpp | 17 ++++-- src/plugins/android/androidqtsupport.h | 5 +- src/plugins/coreplugin/basefilewizard.cpp | 39 ++++++------- .../coreplugin/dialogs/ioptionspage.cpp | 27 ++++++++- src/plugins/coreplugin/dialogs/ioptionspage.h | 7 ++- .../coreplugin/dialogs/settingsdialog.cpp | 6 +- src/plugins/coreplugin/diffservice.cpp | 16 ++++- src/plugins/coreplugin/diffservice.h | 3 +- src/plugins/coreplugin/documentmanager.cpp | 24 ++++---- .../editormanager/editormanager.cpp | 26 ++++----- .../editormanager/ieditorfactory.cpp | 17 +++++- .../coreplugin/editormanager/ieditorfactory.h | 6 +- .../editormanager/iexternaleditor.cpp | 22 +++++++ .../editormanager/iexternaleditor.h | 5 +- src/plugins/coreplugin/find/findplugin.cpp | 3 +- src/plugins/coreplugin/find/findtoolbar.cpp | 6 +- src/plugins/coreplugin/find/ifindfilter.cpp | 17 ++++++ src/plugins/coreplugin/find/ifindfilter.h | 5 +- src/plugins/coreplugin/findplaceholder.cpp | 13 +++-- src/plugins/coreplugin/findplaceholder.h | 3 + src/plugins/coreplugin/idocumentfactory.cpp | 18 ++++++ src/plugins/coreplugin/idocumentfactory.h | 5 +- src/plugins/coreplugin/ifilewizardextension.h | 4 ++ .../coreplugin/inavigationwidgetfactory.cpp | 13 +++++ .../coreplugin/inavigationwidgetfactory.h | 3 + src/plugins/coreplugin/ioutputpane.h | 3 +- src/plugins/coreplugin/iwelcomepage.cpp | 9 +++ src/plugins/coreplugin/iwelcomepage.h | 2 + .../coreplugin/locator/ilocatorfilter.cpp | 13 +++++ .../coreplugin/locator/ilocatorfilter.h | 6 +- src/plugins/coreplugin/locator/locator.cpp | 2 +- src/plugins/coreplugin/mainwindow.cpp | 6 +- src/plugins/coreplugin/outputpanemanager.cpp | 20 ++++++- src/plugins/cppeditor/cppquickfix.h | 2 - .../cppeditor/cppquickfixassistant.cpp | 9 ++- .../cppeditor/fileandtokenactions_test.cpp | 41 ++++++------- .../cppcodestylepreferencesfactory.cpp | 5 +- .../cpptools/cppcodestylesettingspage.cpp | 6 +- .../nimcodestylepreferencesfactory.cpp | 11 ++-- .../projectexplorer/buildconfiguration.cpp | 58 +++++++++---------- .../projectexplorer/buildconfiguration.h | 3 +- src/plugins/projectexplorer/buildstep.cpp | 16 ++++- src/plugins/projectexplorer/buildstep.h | 3 + src/plugins/projectexplorer/buildsteplist.cpp | 4 +- .../projectexplorer/buildstepspage.cpp | 5 +- .../customwizard/customwizard.cpp | 15 ++++- .../customwizard/customwizard.h | 5 +- .../projectexplorer/deployconfiguration.cpp | 21 +++++-- .../projectexplorer/deployconfiguration.h | 3 + .../devicefactoryselectiondialog.cpp | 6 +- .../devicesupport/devicemanager.cpp | 4 +- .../devicesupport/devicesettingswidget.cpp | 8 +-- .../devicesupport/idevicefactory.cpp | 20 ++++++- .../devicesupport/idevicefactory.h | 2 + src/plugins/projectexplorer/ipotentialkit.h | 4 ++ src/plugins/projectexplorer/itaskhandler.h | 3 +- src/plugins/projectexplorer/kit.cpp | 4 +- .../projectexplorer/kitinformation.cpp | 5 +- .../kitinformationconfigwidget.cpp | 6 +- src/plugins/projectexplorer/kitmanager.cpp | 4 +- .../projectexplorer/projectimporter.cpp | 6 +- .../projectexplorer/runconfiguration.cpp | 21 +++++-- .../projectexplorer/runconfiguration.h | 3 + .../runsettingspropertiespage.cpp | 5 +- src/plugins/projectexplorer/target.cpp | 9 +-- .../projectexplorer/targetsetuppage.cpp | 20 +++++-- src/plugins/projectexplorer/taskwindow.cpp | 18 +++++- src/plugins/projectexplorer/toolchain.cpp | 17 ++++++ src/plugins/projectexplorer/toolchain.h | 5 ++ .../projectexplorer/toolchainmanager.cpp | 10 +--- .../projectexplorer/toolchainoptionspage.cpp | 2 +- .../qbsprojectmanager/propertyprovider.h | 3 + .../qbsprojectmanager/qbsprojectmanager.cpp | 18 +++++- .../qmakerunconfigurationfactory.cpp | 18 +++--- .../qmljseditor/qmljsquickfixassist.cpp | 9 ++- .../qmljstools/qmljsbundleprovider.cpp | 18 ++++++ src/plugins/qmljstools/qmljsbundleprovider.h | 7 ++- .../qmljscodestylepreferencesfactory.cpp | 6 +- .../qmljstools/qmljscodestylesettingspage.cpp | 7 +-- src/plugins/qmljstools/qmljsmodelmanager.cpp | 16 ++--- src/plugins/qtsupport/qtversionfactory.cpp | 11 +++- src/plugins/qtsupport/qtversionfactory.h | 2 + src/plugins/qtsupport/qtversionmanager.cpp | 6 +- src/plugins/texteditor/ioutlinewidget.h | 7 ++- src/plugins/texteditor/outlinefactory.cpp | 25 ++++---- src/plugins/texteditor/outlinefactory.h | 5 -- src/plugins/texteditor/quickfix.cpp | 9 +++ src/plugins/texteditor/quickfix.h | 2 + .../texteditor/snippets/snippetprovider.cpp | 25 ++++++++ .../texteditor/snippets/snippetprovider.h | 6 +- .../snippets/snippetscollection.cpp | 4 +- .../snippets/snippetssettingspage.cpp | 8 +-- src/plugins/texteditor/texteditorplugin.cpp | 2 - src/plugins/vcsbase/basevcseditorfactory.cpp | 11 ++-- src/plugins/welcome/welcomeplugin.cpp | 3 +- 99 files changed, 696 insertions(+), 330 deletions(-) diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 57a911ce7d..b2ff7378ee 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -82,6 +82,8 @@ public: } return results; } + + // This is useful for soft dependencies using pure interfaces. template static T *getObject() { QReadLocker lock(listLock()); diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index d78ada13f7..eaf27d433e 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -204,6 +204,24 @@ QString PropertyInfo::toString() const return list.join('|'); } +static QList g_customImportProviders; + +CustomImportsProvider::CustomImportsProvider(QObject *parent) + : QObject(parent) +{ + g_customImportProviders.append(this); +} + +CustomImportsProvider::~CustomImportsProvider() +{ + g_customImportProviders.removeOne(this); +} + +const QList CustomImportsProvider::allProviders() +{ + return g_customImportProviders; +} + } // namespace QmlJS CppComponentValue::CppComponentValue(FakeMetaObject::ConstPtr metaObject, const QString &className, diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 806b858f39..fd38b68aba 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -1127,8 +1127,11 @@ class QMLJS_EXPORT CustomImportsProvider : public QObject { Q_OBJECT public: - explicit CustomImportsProvider(QObject *parent = 0) : QObject(parent) {} - virtual ~CustomImportsProvider() {} + explicit CustomImportsProvider(QObject *parent = nullptr); + virtual ~CustomImportsProvider(); + + static const QList allProviders(); + virtual QList imports(ValueOwner *valueOwner, const Document *context) const = 0; }; diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index eeceb6a786..61cdcd15d2 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -33,8 +33,6 @@ #include "qmljsqrcparser.h" #include "qmljsconstants.h" -#include - #include using namespace LanguageUtils; @@ -212,12 +210,9 @@ Context::ImportsPerDocument LinkPrivate::linkImports() Imports *imports = new Imports(valueOwner); // Add custom imports for the opened document - if (ExtensionSystem::PluginManager::instance()) { - auto providers = ExtensionSystem::PluginManager::getObjects(); - foreach (const auto &provider, providers) - foreach (const auto &import, provider->imports(valueOwner, document.data())) - importCache.insert(ImportCacheKey(import.info), import); - } + for (const auto &provider : CustomImportsProvider::allProviders()) + foreach (const auto &import, provider->imports(valueOwner, document.data())) + importCache.insert(ImportCacheKey(import.info), import); populateImportedTypes(imports, document); importsPerDocument.insert(document.data(), QSharedPointer(imports)); diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 460c749eba..8b5afb0092 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -41,8 +41,6 @@ #include #include -#include - #include #include #include @@ -92,6 +90,18 @@ static bool openXmlFile(QDomDocument &doc, const Utils::FileName &fileName); static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc); static int parseMinSdk(const QDomElement &manifestElem); +static QList g_androidQtSupportProviders; + +AndroidQtSupport::AndroidQtSupport() +{ + g_androidQtSupportProviders.append(this); +} + +AndroidQtSupport::~AndroidQtSupport() +{ + g_androidQtSupportProviders.removeOne(this); +} + bool AndroidManager::supportsAndroid(const ProjectExplorer::Kit *kit) { QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(kit); @@ -457,8 +467,7 @@ bool AndroidManager::checkForQt51Files(Utils::FileName fileName) AndroidQtSupport *AndroidManager::androidQtSupport(ProjectExplorer::Target *target) { - QList providerList = ExtensionSystem::PluginManager::getObjects(); - foreach (AndroidQtSupport *provider, providerList) { + for (AndroidQtSupport *provider : g_androidQtSupportProviders) { if (provider->canHandle(target)) return provider; } diff --git a/src/plugins/android/androidqtsupport.h b/src/plugins/android/androidqtsupport.h index 021e5d7cff..df2db99551 100644 --- a/src/plugins/android/androidqtsupport.h +++ b/src/plugins/android/androidqtsupport.h @@ -45,6 +45,10 @@ class ANDROID_EXPORT AndroidQtSupport : public QObject { Q_OBJECT +protected: + AndroidQtSupport(); + ~AndroidQtSupport(); + public: enum BuildType { DebugBuild, @@ -52,7 +56,6 @@ public: ReleaseBuildSigned }; -public: virtual bool canHandle(const ProjectExplorer::Target *target) const = 0; virtual QStringList soLibSearchPath(const ProjectExplorer::Target *target) const = 0; virtual QStringList androidExtraLibs(const ProjectExplorer::Target *target) const = 0; diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index a9bf34e451..b252d0de2b 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -28,14 +28,24 @@ #include "basefilewizardfactory.h" #include "ifilewizardextension.h" -#include - #include using namespace Utils; namespace Core { +static QList g_fileWizardExtensions; + +IFileWizardExtension::IFileWizardExtension() +{ + g_fileWizardExtensions.append(this); +} + +IFileWizardExtension::~IFileWizardExtension() +{ + g_fileWizardExtensions.removeOne(this); +} + BaseFileWizard::BaseFileWizard(const BaseFileWizardFactory *factory, const QVariantMap &extraValues, QWidget *parent) : @@ -43,19 +53,8 @@ BaseFileWizard::BaseFileWizard(const BaseFileWizardFactory *factory, m_extraValues(extraValues), m_factory(factory) { - // Compile extension pages, purge out unused ones - QList extensionList - = ExtensionSystem::PluginManager::getObjects(); - - for (auto it = extensionList.begin(); it != extensionList.end(); ) { - const QList extensionPages = (*it)->extensionPages(factory); - if (extensionPages.empty()) { - it = extensionList.erase(it); - } else { - m_extensionPages += extensionPages; - ++it; - } - } + for (IFileWizardExtension *extension : g_fileWizardExtensions) + m_extensionPages += extension->extensionPages(factory); if (!m_extensionPages.empty()) m_firstExtensionPage = m_extensionPages.front(); @@ -67,9 +66,7 @@ void BaseFileWizard::initializePage(int id) if (page(id) == m_firstExtensionPage) { generateFileList(); - QList extensionList - = ExtensionSystem::PluginManager::getObjects(); - foreach (IFileWizardExtension *ex, extensionList) + for (IFileWizardExtension *ex : g_fileWizardExtensions) ex->firstExtensionPageShown(m_files, m_extraValues); } } @@ -99,9 +96,7 @@ void BaseFileWizard::accept() break; } - QList extensionList - = ExtensionSystem::PluginManager::getObjects(); - foreach (IFileWizardExtension *ex, extensionList) { + for (IFileWizardExtension *ex : g_fileWizardExtensions) { for (int i = 0; i < m_files.count(); i++) { ex->applyCodeStyle(&m_files[i]); } @@ -116,7 +111,7 @@ void BaseFileWizard::accept() bool removeOpenProjectAttribute = false; // Run the extensions - foreach (IFileWizardExtension *ex, extensionList) { + for (IFileWizardExtension *ex : g_fileWizardExtensions) { bool remove; if (!ex->processFiles(m_files, &remove, &errorMessage)) { if (!errorMessage.isEmpty()) diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp index 16ac6e9184..49d72dc1d9 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp +++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp @@ -135,6 +135,7 @@ QIcon Core::IOptionsPage::categoryIcon() const Sets \a categoryIcon as the category icon of the options page. */ +static QList g_optionsPages; /*! Constructs an options page with the given \a parent. @@ -143,7 +144,7 @@ Core::IOptionsPage::IOptionsPage(QObject *parent) : QObject(parent), m_keywordsInitialized(false) { - + g_optionsPages.append(this); } /*! @@ -151,6 +152,12 @@ Core::IOptionsPage::IOptionsPage(QObject *parent) */ Core::IOptionsPage::~IOptionsPage() { + g_optionsPages.removeOne(this); +} + +const QList Core::IOptionsPage::allOptionsPages() +{ + return g_optionsPages; } /*! @@ -183,6 +190,24 @@ bool Core::IOptionsPage::matches(const QString &searchKeyWord) const return false; } +static QList g_optionsPagesProviders; + +Core::IOptionsPageProvider::IOptionsPageProvider(QObject *parent) + : QObject(parent) +{ + g_optionsPagesProviders.append(this); +} + +Core::IOptionsPageProvider::~IOptionsPageProvider() +{ + g_optionsPagesProviders.removeOne(this); +} + +const QList Core::IOptionsPageProvider::allOptionsPagesProviders() +{ + return g_optionsPagesProviders; +} + QIcon Core::IOptionsPageProvider::categoryIcon() const { return QIcon(m_categoryIcon); diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.h b/src/plugins/coreplugin/dialogs/ioptionspage.h index b726755b7b..16e6d285c0 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.h +++ b/src/plugins/coreplugin/dialogs/ioptionspage.h @@ -47,6 +47,8 @@ public: IOptionsPage(QObject *parent = 0); virtual ~IOptionsPage(); + static const QList allOptionsPages(); + Id id() const { return m_id; } QString displayName() const { return m_displayName; } Id category() const { return m_category; } @@ -88,7 +90,10 @@ class CORE_EXPORT IOptionsPageProvider : public QObject Q_OBJECT public: - IOptionsPageProvider(QObject *parent = 0) : QObject(parent) {} + IOptionsPageProvider(QObject *parent = nullptr); + ~IOptionsPageProvider(); + + static const QList allOptionsPagesProviders(); Id category() const { return m_category; } QString displayCategory() const { return m_displayCategory; } diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index dca59526dd..4d1aea8fd9 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -27,7 +27,6 @@ #include -#include #include #include #include @@ -69,7 +68,7 @@ bool optionsPageLessThan(const IOptionsPage *p1, const IOptionsPage *p2) static inline QList sortedOptionsPages() { - QList rc = ExtensionSystem::PluginManager::getObjects(); + QList rc = IOptionsPage::allOptionsPages(); std::stable_sort(rc.begin(), rc.end(), optionsPageLessThan); return rc; } @@ -414,8 +413,7 @@ SettingsDialog::SettingsDialog(QWidget *parent) : else setWindowTitle(tr("Options")); - m_model->setPages(m_pages, - ExtensionSystem::PluginManager::getObjects()); + m_model->setPages(m_pages, IOptionsPageProvider::allOptionsPagesProviders()); m_proxyModel->setSourceModel(m_model); m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); diff --git a/src/plugins/coreplugin/diffservice.cpp b/src/plugins/coreplugin/diffservice.cpp index 312d08346b..7feb9aae02 100644 --- a/src/plugins/coreplugin/diffservice.cpp +++ b/src/plugins/coreplugin/diffservice.cpp @@ -25,13 +25,23 @@ #include "diffservice.h" -#include - namespace Core { +static DiffService *g_instance = nullptr; + +DiffService::DiffService() +{ + g_instance = this; +} + +DiffService::~DiffService() +{ + g_instance = nullptr; +} + DiffService *DiffService::instance() { - return ExtensionSystem::PluginManager::getObject(); + return g_instance; } } // Core diff --git a/src/plugins/coreplugin/diffservice.h b/src/plugins/coreplugin/diffservice.h index 72b9881d9f..1c241364dc 100644 --- a/src/plugins/coreplugin/diffservice.h +++ b/src/plugins/coreplugin/diffservice.h @@ -38,7 +38,8 @@ class CORE_EXPORT DiffService public: static DiffService *instance(); - virtual ~DiffService() {} + DiffService(); + virtual ~DiffService(); virtual void diffFiles(const QString &leftFileName, const QString &rightFileName) = 0; virtual void diffModifiedFiles(const QStringList &fileNames) = 0; diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp index 49cc96566a..0edf3a3966 100644 --- a/src/plugins/coreplugin/documentmanager.cpp +++ b/src/plugins/coreplugin/documentmanager.cpp @@ -711,24 +711,26 @@ bool DocumentManager::saveDocument(IDocument *document, const QString &fileName, return ret; } -template -QSet filterStrings() +QString DocumentManager::allDocumentFactoryFiltersString(QString *allFilesFilter = 0) { - QSet filters; - for (FactoryType *factory : ExtensionSystem::PluginManager::getObjects()) { + QSet uniqueFilters; + + for (IEditorFactory *factory : IEditorFactory::allEditorFactories()) { for (const QString &mt : factory->mimeTypes()) { const QString filter = mimeTypeForName(mt).filterString(); if (!filter.isEmpty()) - filters.insert(filter); + uniqueFilters.insert(filter); + } + } + + for (IDocumentFactory *factory : IDocumentFactory::allDocumentFactories()) { + for (const QString &mt : factory->mimeTypes()) { + const QString filter = mimeTypeForName(mt).filterString(); + if (!filter.isEmpty()) + uniqueFilters.insert(filter); } } - return filters; -} -QString DocumentManager::allDocumentFactoryFiltersString(QString *allFilesFilter = 0) -{ - const QSet uniqueFilters = filterStrings() - + filterStrings(); QStringList filters = uniqueFilters.toList(); filters.sort(); const QString allFiles = Utils::allFilesFilterString(); diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 45fc900f18..61d0854cdf 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -186,17 +186,6 @@ static void setFocusToEditorViewAndUnmaximizePanes(EditorView *view) } } -/* For something that has a 'QString id' (IEditorFactory - * or IExternalEditor), find the one matching a id. */ -template -EditorFactoryLike *findById(Id id) -{ - return ExtensionSystem::PluginManager::getObject( - [&id](EditorFactoryLike *efl) { - return id == efl->id(); - }); -} - EditorManagerPrivate::EditorManagerPrivate(QObject *parent) : QObject(parent), m_revertToSavedAction(new QAction(EditorManager::tr("Revert to Saved"), this)), @@ -606,7 +595,9 @@ IEditor *EditorManagerPrivate::openEditor(EditorView *view, const QString &fileN return 0; } if (editorId.isValid()) { - if (IEditorFactory *factory = findById(editorId)) { + IEditorFactory *factory = Utils::findOrDefault(IEditorFactory::allEditorFactories(), + Utils::equal(&IEditorFactory::id, editorId)); + if (factory) { factories.removeOne(factory); factories.push_front(factory); } @@ -1139,7 +1130,9 @@ EditorManager::EditorFactoryList EditorManagerPrivate::findFactories(Id editorId factories = EditorManager::editorFactories(mimeType, false); } else { // Find by editor id - if (IEditorFactory *factory = findById(editorId)) + IEditorFactory *factory = Utils::findOrDefault(IEditorFactory::allEditorFactories(), + Utils::equal(&IEditorFactory::id, editorId)); + if (factory) factories.push_back(factory); } if (factories.empty()) { @@ -2606,7 +2599,7 @@ EditorManager::EditorFactoryList EditorManager::editorFactories(const Utils::MimeType &mimeType, bool bestMatchOnly) { EditorFactoryList rc; - const EditorFactoryList allFactories = ExtensionSystem::PluginManager::getObjects(); + const EditorFactoryList allFactories = IEditorFactory::allEditorFactories(); mimeTypeFactoryLookup(mimeType, allFactories, bestMatchOnly, &rc); if (debugEditorManager) qDebug() << Q_FUNC_INFO << mimeType.name() << " returns " << rc; @@ -2617,7 +2610,7 @@ EditorManager::ExternalEditorList EditorManager::externalEditors(const Utils::MimeType &mimeType, bool bestMatchOnly) { ExternalEditorList rc; - const ExternalEditorList allEditors = ExtensionSystem::PluginManager::getObjects(); + const ExternalEditorList allEditors = IExternalEditor::allExternalEditors(); mimeTypeFactoryLookup(mimeType, allEditors, bestMatchOnly, &rc); if (debugEditorManager) qDebug() << Q_FUNC_INFO << mimeType.name() << " returns " << rc; @@ -2692,7 +2685,8 @@ bool EditorManager::isAutoSaveFile(const QString &fileName) bool EditorManager::openExternalEditor(const QString &fileName, Id editorId) { - IExternalEditor *ee = findById(editorId); + IExternalEditor *ee = Utils::findOrDefault(IExternalEditor::allExternalEditors(), + Utils::equal(&IExternalEditor::id, editorId)); if (!ee) return false; QString errorMessage; diff --git a/src/plugins/coreplugin/editormanager/ieditorfactory.cpp b/src/plugins/coreplugin/editormanager/ieditorfactory.cpp index c3abc40b8a..b32b6036bc 100644 --- a/src/plugins/coreplugin/editormanager/ieditorfactory.cpp +++ b/src/plugins/coreplugin/editormanager/ieditorfactory.cpp @@ -27,9 +27,24 @@ #include -Core::IEditorFactory::IEditorFactory(QObject *parent) +namespace Core { + +static QList g_editorFactories; + +IEditorFactory::IEditorFactory(QObject *parent) : QObject(parent) { + g_editorFactories.append(this); +} +IEditorFactory::~IEditorFactory() +{ + g_editorFactories.removeOne(this); +} + +const QList IEditorFactory::allEditorFactories() +{ + return g_editorFactories; } +} // Core diff --git a/src/plugins/coreplugin/editormanager/ieditorfactory.h b/src/plugins/coreplugin/editormanager/ieditorfactory.h index 583001951c..5ed1a83eda 100644 --- a/src/plugins/coreplugin/editormanager/ieditorfactory.h +++ b/src/plugins/coreplugin/editormanager/ieditorfactory.h @@ -40,7 +40,11 @@ class CORE_EXPORT IEditorFactory : public QObject Q_OBJECT public: - IEditorFactory(QObject *parent = 0); + IEditorFactory(QObject *parent = nullptr); + ~IEditorFactory(); + + static const QList allEditorFactories(); + QString displayName() const { return m_displayName; } void setDisplayName(const QString &displayName) { m_displayName = displayName; } diff --git a/src/plugins/coreplugin/editormanager/iexternaleditor.cpp b/src/plugins/coreplugin/editormanager/iexternaleditor.cpp index 7da7f48444..246003162f 100644 --- a/src/plugins/coreplugin/editormanager/iexternaleditor.cpp +++ b/src/plugins/coreplugin/editormanager/iexternaleditor.cpp @@ -25,6 +25,8 @@ #include "iexternaleditor.h" +namespace Core { + /*! \class Core::IExternalEditor \mainclass @@ -50,3 +52,23 @@ Opens the editor with \a fileName. Returns \c true on success or \c false on failure along with the error in \a errorMessage. */ + +static QList g_externalEditors; + +IExternalEditor::IExternalEditor(QObject *parent) + : QObject(parent) +{ + g_externalEditors.append(this); +} + +IExternalEditor::~IExternalEditor() +{ + g_externalEditors.removeOne(this); +} + +const QList IExternalEditor::allExternalEditors() +{ + return g_externalEditors; +} + +} // Core diff --git a/src/plugins/coreplugin/editormanager/iexternaleditor.h b/src/plugins/coreplugin/editormanager/iexternaleditor.h index 24784b1e4a..84d99bcef0 100644 --- a/src/plugins/coreplugin/editormanager/iexternaleditor.h +++ b/src/plugins/coreplugin/editormanager/iexternaleditor.h @@ -38,7 +38,10 @@ class CORE_EXPORT IExternalEditor : public QObject Q_OBJECT public: - explicit IExternalEditor(QObject *parent = 0) : QObject(parent) {} + explicit IExternalEditor(QObject *parent = nullptr); + ~IExternalEditor(); + + static const QList allExternalEditors(); virtual QStringList mimeTypes() const = 0; virtual Id id() const = 0; diff --git a/src/plugins/coreplugin/find/findplugin.cpp b/src/plugins/coreplugin/find/findplugin.cpp index 3ae5ce0e50..c90ba0ba36 100644 --- a/src/plugins/coreplugin/find/findplugin.cpp +++ b/src/plugins/coreplugin/find/findplugin.cpp @@ -202,13 +202,12 @@ static QString filterActionName(const IFindFilter *filter) void FindPrivate::setupFilterMenuItems() { - QList findInterfaces = ExtensionSystem::PluginManager::getObjects(); Command *cmd; ActionContainer *mfindadvanced = ActionManager::actionContainer(Constants::M_FIND_ADVANCED); bool haveEnabledFilters = false; const Id base("FindFilter."); - QList sortedFilters = findInterfaces; + QList sortedFilters = IFindFilter::allFindFilters(); Utils::sort(sortedFilters, &IFindFilter::displayName); foreach (IFindFilter *filter, sortedFilters) { QAction *action = new QAction(filterActionName(filter), this); diff --git a/src/plugins/coreplugin/find/findtoolbar.cpp b/src/plugins/coreplugin/find/findtoolbar.cpp index ba619cfa30..a4699dc7b3 100644 --- a/src/plugins/coreplugin/find/findtoolbar.cpp +++ b/src/plugins/coreplugin/find/findtoolbar.cpp @@ -36,8 +36,6 @@ #include #include -#include - #include #include #include @@ -727,10 +725,10 @@ void FindToolBar::hideAndResetFocus() FindToolBarPlaceHolder *FindToolBar::findToolBarPlaceHolder() const { - QList placeholders = ExtensionSystem::PluginManager::getObjects(); + const QList placeholders = FindToolBarPlaceHolder::allFindToolbarPlaceHolders(); QWidget *candidate = QApplication::focusWidget(); while (candidate) { - foreach (FindToolBarPlaceHolder *ph, placeholders) { + for (FindToolBarPlaceHolder *ph : placeholders) { if (ph->owner() == candidate) return ph; } diff --git a/src/plugins/coreplugin/find/ifindfilter.cpp b/src/plugins/coreplugin/find/ifindfilter.cpp index d57a16370e..c861d1e0df 100644 --- a/src/plugins/coreplugin/find/ifindfilter.cpp +++ b/src/plugins/coreplugin/find/ifindfilter.cpp @@ -227,6 +227,23 @@ namespace Core { +static QList g_findFilters; + +IFindFilter::IFindFilter() +{ + g_findFilters.append(this); +} + +IFindFilter::~IFindFilter() +{ + g_findFilters.removeOne(this); +} + +const QList IFindFilter::allFindFilters() +{ + return g_findFilters; +} + QKeySequence IFindFilter::defaultShortcut() const { return QKeySequence(); diff --git a/src/plugins/coreplugin/find/ifindfilter.h b/src/plugins/coreplugin/find/ifindfilter.h index 9c67c29fc2..efedbf44f9 100644 --- a/src/plugins/coreplugin/find/ifindfilter.h +++ b/src/plugins/coreplugin/find/ifindfilter.h @@ -39,9 +39,12 @@ namespace Core { class CORE_EXPORT IFindFilter : public QObject { Q_OBJECT + public: + IFindFilter(); + virtual ~IFindFilter(); - virtual ~IFindFilter() {} + static const QList allFindFilters(); virtual QString id() const = 0; virtual QString displayName() const = 0; diff --git a/src/plugins/coreplugin/findplaceholder.cpp b/src/plugins/coreplugin/findplaceholder.cpp index a1b32359e2..90ade039d5 100644 --- a/src/plugins/coreplugin/findplaceholder.cpp +++ b/src/plugins/coreplugin/findplaceholder.cpp @@ -26,26 +26,26 @@ #include "findplaceholder.h" #include "find/findtoolbar.h" -#include - #include using namespace Core; FindToolBarPlaceHolder *FindToolBarPlaceHolder::m_current = 0; +static QList g_findToolBarPlaceHolders; + FindToolBarPlaceHolder::FindToolBarPlaceHolder(QWidget *owner, QWidget *parent) : QWidget(parent), m_owner(owner), m_subWidget(0), m_lightColored(false) { + g_findToolBarPlaceHolders.append(this); setLayout(new QVBoxLayout); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); layout()->setMargin(0); - ExtensionSystem::PluginManager::addObject(this); } FindToolBarPlaceHolder::~FindToolBarPlaceHolder() { - ExtensionSystem::PluginManager::removeObject(this); + g_findToolBarPlaceHolders.removeOne(this); if (m_subWidget) { m_subWidget->setVisible(false); m_subWidget->setParent(0); @@ -54,6 +54,11 @@ FindToolBarPlaceHolder::~FindToolBarPlaceHolder() m_current = 0; } +const QList FindToolBarPlaceHolder::allFindToolbarPlaceHolders() +{ + return g_findToolBarPlaceHolders; +} + QWidget *FindToolBarPlaceHolder::owner() const { return m_owner; diff --git a/src/plugins/coreplugin/findplaceholder.h b/src/plugins/coreplugin/findplaceholder.h index 4073354dc1..4029d3e3ab 100644 --- a/src/plugins/coreplugin/findplaceholder.h +++ b/src/plugins/coreplugin/findplaceholder.h @@ -39,6 +39,9 @@ class CORE_EXPORT FindToolBarPlaceHolder : public QWidget public: explicit FindToolBarPlaceHolder(QWidget *owner, QWidget *parent = 0); ~FindToolBarPlaceHolder(); + + static const QList allFindToolbarPlaceHolders(); + QWidget *owner() const; bool isUsedByWidget(QWidget *widget); diff --git a/src/plugins/coreplugin/idocumentfactory.cpp b/src/plugins/coreplugin/idocumentfactory.cpp index 4aba09b97a..016d562d8b 100644 --- a/src/plugins/coreplugin/idocumentfactory.cpp +++ b/src/plugins/coreplugin/idocumentfactory.cpp @@ -29,6 +29,24 @@ namespace Core { +static QList g_documentFactories; + +IDocumentFactory::IDocumentFactory(QObject *parent) + : QObject(parent) +{ + g_documentFactories.append(this); +} + +IDocumentFactory::~IDocumentFactory() +{ + g_documentFactories.removeOne(this); +} + +const QList IDocumentFactory::allDocumentFactories() +{ + return g_documentFactories; +} + IDocument *IDocumentFactory::open(const QString &filename) { QTC_ASSERT(m_opener, return 0); diff --git a/src/plugins/coreplugin/idocumentfactory.h b/src/plugins/coreplugin/idocumentfactory.h index 518cb23f1f..461f8aeb4b 100644 --- a/src/plugins/coreplugin/idocumentfactory.h +++ b/src/plugins/coreplugin/idocumentfactory.h @@ -41,7 +41,10 @@ class CORE_EXPORT IDocumentFactory : public QObject Q_OBJECT public: - IDocumentFactory(QObject *parent = 0) : QObject(parent) {} + IDocumentFactory(QObject *parent = nullptr); + ~IDocumentFactory(); + + static const QList allDocumentFactories(); typedef std::function Opener; IDocument *open(const QString &filename); diff --git a/src/plugins/coreplugin/ifilewizardextension.h b/src/plugins/coreplugin/ifilewizardextension.h index 2e788eb8c7..494680a87a 100644 --- a/src/plugins/coreplugin/ifilewizardextension.h +++ b/src/plugins/coreplugin/ifilewizardextension.h @@ -48,6 +48,10 @@ class CORE_EXPORT IFileWizardExtension : public QObject { Q_OBJECT public: + IFileWizardExtension(); + ~IFileWizardExtension(); + static QList allFileWizardExtensions(); + /* Return a list of pages to be added to the Wizard (empty list if not * applicable). */ virtual QList extensionPages(const IWizardFactory *wizard) = 0; diff --git a/src/plugins/coreplugin/inavigationwidgetfactory.cpp b/src/plugins/coreplugin/inavigationwidgetfactory.cpp index 06dfdb43bc..eb7c78993d 100644 --- a/src/plugins/coreplugin/inavigationwidgetfactory.cpp +++ b/src/plugins/coreplugin/inavigationwidgetfactory.cpp @@ -85,12 +85,25 @@ using namespace Core; +static QList g_navigationWidgetFactories; + /*! Creates a \l{Core::NavigationViewFactory}. */ INavigationWidgetFactory::INavigationWidgetFactory() : m_priority(0) { + g_navigationWidgetFactories.append(this); +} + +INavigationWidgetFactory::~INavigationWidgetFactory() +{ + g_navigationWidgetFactories.removeOne(this); +} + +const QList INavigationWidgetFactory::allNavigationFactories() +{ + return g_navigationWidgetFactories; } /*! diff --git a/src/plugins/coreplugin/inavigationwidgetfactory.h b/src/plugins/coreplugin/inavigationwidgetfactory.h index 2205212232..e569b4b366 100644 --- a/src/plugins/coreplugin/inavigationwidgetfactory.h +++ b/src/plugins/coreplugin/inavigationwidgetfactory.h @@ -53,6 +53,9 @@ class CORE_EXPORT INavigationWidgetFactory : public QObject public: INavigationWidgetFactory(); + ~INavigationWidgetFactory(); + + static const QList allNavigationFactories(); void setDisplayName(const QString &displayName); void setPriority(int priority); diff --git a/src/plugins/coreplugin/ioutputpane.h b/src/plugins/coreplugin/ioutputpane.h index 55d266b406..d4cd8cc4a9 100644 --- a/src/plugins/coreplugin/ioutputpane.h +++ b/src/plugins/coreplugin/ioutputpane.h @@ -42,7 +42,8 @@ class CORE_EXPORT IOutputPane : public QObject Q_OBJECT public: - IOutputPane(QObject *parent = 0) : QObject(parent) {} + IOutputPane(QObject *parent = nullptr); + ~IOutputPane(); virtual QWidget *outputWidget(QWidget *parent) = 0; virtual QList toolBarWidgets() const = 0; diff --git a/src/plugins/coreplugin/iwelcomepage.cpp b/src/plugins/coreplugin/iwelcomepage.cpp index a99a309ea7..0f93bb1f3b 100644 --- a/src/plugins/coreplugin/iwelcomepage.cpp +++ b/src/plugins/coreplugin/iwelcomepage.cpp @@ -41,12 +41,21 @@ using namespace Utils; namespace Core { +static QList g_welcomePages; + +const QList IWelcomePage::allWelcomePages() +{ + return g_welcomePages; +} + IWelcomePage::IWelcomePage() { + g_welcomePages.append(this); } IWelcomePage::~IWelcomePage() { + g_welcomePages.removeOne(this); } static QPalette buttonPalette(bool isActive, bool isCursorInside, bool forText) diff --git a/src/plugins/coreplugin/iwelcomepage.h b/src/plugins/coreplugin/iwelcomepage.h index 4732a2893c..7fa43653eb 100644 --- a/src/plugins/coreplugin/iwelcomepage.h +++ b/src/plugins/coreplugin/iwelcomepage.h @@ -55,6 +55,8 @@ public: virtual int priority() const { return 0; } virtual Core::Id id() const = 0; virtual QWidget *createWidget() const = 0; + + static const QList allWelcomePages(); }; class WelcomePageButtonPrivate; diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.cpp b/src/plugins/coreplugin/locator/ilocatorfilter.cpp index 1e74741c7e..5ba268b5e3 100644 --- a/src/plugins/coreplugin/locator/ilocatorfilter.cpp +++ b/src/plugins/coreplugin/locator/ilocatorfilter.cpp @@ -48,12 +48,25 @@ using namespace Core; The filter is added to \uicontrol Tools > \uicontrol Locate. */ +static QList g_locatorFilters; + /*! Constructs a locator filter with \a parent. Call from subclasses. */ ILocatorFilter::ILocatorFilter(QObject *parent): QObject(parent) { + g_locatorFilters.append(this); +} + +ILocatorFilter::~ILocatorFilter() +{ + g_locatorFilters.removeOne(this); +} + +const QList ILocatorFilter::allLocatorFilters() +{ + return g_locatorFilters; } /*! diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.h b/src/plugins/coreplugin/locator/ilocatorfilter.h index 828f21fb59..c6adae975e 100644 --- a/src/plugins/coreplugin/locator/ilocatorfilter.h +++ b/src/plugins/coreplugin/locator/ilocatorfilter.h @@ -107,8 +107,10 @@ class CORE_EXPORT ILocatorFilter : public QObject public: enum Priority {Highest = 0, High = 1, Medium = 2, Low = 3}; - ILocatorFilter(QObject *parent = 0); - virtual ~ILocatorFilter() {} + ILocatorFilter(QObject *parent = nullptr); + virtual ~ILocatorFilter(); + + static const QList allLocatorFilters(); Id id() const; Id actionId() const; diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index a3e9df5e45..a4261d571c 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -139,7 +139,7 @@ void Locator::initialize(CorePlugin *corePlugin, const QStringList &, QString *) void Locator::extensionsInitialized() { - m_filters = ExtensionSystem::PluginManager::getObjects(); + m_filters = ILocatorFilter::allLocatorFilters(); Utils::sort(m_filters, [](const ILocatorFilter *first, const ILocatorFilter *second) -> bool { if (first->priority() != second->priority()) return first->priority() < second->priority(); diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 13d7036d8f..2b97701575 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -341,8 +341,8 @@ void MainWindow::extensionsInitialized() m_statusBarManager->extensionsInitalized(); OutputPaneManager::instance()->init(); m_vcsManager->extensionsInitialized(); - m_leftNavigationWidget->setFactories(PluginManager::getObjects()); - m_rightNavigationWidget->setFactories(PluginManager::getObjects()); + m_leftNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories()); + m_rightNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories()); readSettings(); updateContext(); @@ -808,7 +808,7 @@ IDocument *MainWindow::openFiles(const QStringList &fileNames, ICore::OpenFilesFlags flags, const QString &workingDirectory) { - QList documentFactories = PluginManager::getObjects(); + const QList documentFactories = IDocumentFactory::allDocumentFactories(); IDocument *res = nullptr; foreach (const QString &fileName, fileNames) { diff --git a/src/plugins/coreplugin/outputpanemanager.cpp b/src/plugins/coreplugin/outputpanemanager.cpp index 034271a750..be6938af65 100644 --- a/src/plugins/coreplugin/outputpanemanager.cpp +++ b/src/plugins/coreplugin/outputpanemanager.cpp @@ -37,8 +37,6 @@ #include #include -#include - #include #include #include @@ -66,6 +64,22 @@ using namespace Utils; namespace Core { + +// OutputPane + +static QList g_outputPanes; + +IOutputPane::IOutputPane(QObject *parent) + : QObject(parent) +{ + g_outputPanes.append(this); +} + +IOutputPane::~IOutputPane() +{ + g_outputPanes.removeOne(this); +} + namespace Internal { static char outputPaneSettingsKeyC[] = "OutputPaneVisibility"; @@ -256,7 +270,7 @@ void OutputPaneManager::init() QFontMetrics titleFm = m_titleLabel->fontMetrics(); int minTitleWidth = 0; - m_panes = ExtensionSystem::PluginManager::getObjects(); + m_panes = g_outputPanes; Utils::sort(m_panes, [](IOutputPane *p1, IOutputPane *p2) { return p1->priorityInStatusBar() > p2->priorityInStatusBar(); }); diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h index 02c63534c7..fba4b733aa 100644 --- a/src/plugins/cppeditor/cppquickfix.h +++ b/src/plugins/cppeditor/cppquickfix.h @@ -49,8 +49,6 @@ class CPPEDITOR_EXPORT CppQuickFixFactory: public TextEditor::QuickFixFactory Q_OBJECT public: - CppQuickFixFactory() {} - void matchingOperations(const TextEditor::QuickFixInterface &interface, TextEditor::QuickFixOperations &result); diff --git a/src/plugins/cppeditor/cppquickfixassistant.cpp b/src/plugins/cppeditor/cppquickfixassistant.cpp index 8ded187d88..349c7111d4 100644 --- a/src/plugins/cppeditor/cppquickfixassistant.cpp +++ b/src/plugins/cppeditor/cppquickfixassistant.cpp @@ -34,7 +34,7 @@ #include -#include +#include #include using namespace TextEditor; @@ -59,10 +59,9 @@ IAssistProcessor *CppQuickFixAssistProvider::createProcessor() const QList CppQuickFixAssistProvider::quickFixFactories() const { - QList results; - foreach (CppQuickFixFactory *f, ExtensionSystem::PluginManager::getObjects()) - results.append(f); - return results; + return Utils::filtered(QuickFixFactory::allQuickFixFactories(), [](QuickFixFactory *f) { + return qobject_cast(f) != nullptr; + }); } // -------------------------- diff --git a/src/plugins/cppeditor/fileandtokenactions_test.cpp b/src/plugins/cppeditor/fileandtokenactions_test.cpp index 463172d45b..21b11c7524 100644 --- a/src/plugins/cppeditor/fileandtokenactions_test.cpp +++ b/src/plugins/cppeditor/fileandtokenactions_test.cpp @@ -41,7 +41,6 @@ #include #include -#include #include #include #include @@ -448,33 +447,31 @@ void RunAllQuickFixesTokenAction::run(CppEditorWidget *editorWidget) // Calling editorWidget->invokeAssist(QuickFix) would be not enough // since we also want to execute the ones that match. - const QList quickFixFactories - = ExtensionSystem::PluginManager::getObjects(); - QVERIFY(!quickFixFactories.isEmpty()); - CppQuickFixInterface qfi(editorWidget, ExplicitlyInvoked); // This guard is important since the Quick Fixes expect to get a non-empty path(). if (qfi.path().isEmpty()) return; - foreach (CppQuickFixFactory *quickFixFactory, quickFixFactories) { - QuickFixOperations operations; - // Some Quick Fixes pop up a dialog and are therefore inappropriate for this test. - // Where possible, use a guiless version of the factory. - if (qobject_cast(quickFixFactory)) { - QScopedPointer factoryProducingGuiLessOperations; - factoryProducingGuiLessOperations.reset(InsertVirtualMethods::createTestFactory()); - factoryProducingGuiLessOperations->match(qfi, operations); - } else { - quickFixFactory->match(qfi, operations); - } + for (QuickFixFactory *quickFixFactory : QuickFixFactory::allQuickFixFactories()) { + if (auto cppQuickFixFactory = qobject_cast(quickFixFactory)) { + QuickFixOperations operations; + // Some Quick Fixes pop up a dialog and are therefore inappropriate for this test. + // Where possible, use a guiless version of the factory. + if (qobject_cast(cppQuickFixFactory)) { + QScopedPointer factoryProducingGuiLessOperations; + factoryProducingGuiLessOperations.reset(InsertVirtualMethods::createTestFactory()); + factoryProducingGuiLessOperations->match(qfi, operations); + } else { + cppQuickFixFactory->match(qfi, operations); + } - foreach (QuickFixOperation::Ptr operation, operations) { - qDebug() << " -- Performing Quick Fix" << operation->description(); - operation->perform(); - TestActionsTestCase::escape(); - TestActionsTestCase::undoChangesInAllEditorWidgets(); - QApplication::processEvents(); + foreach (QuickFixOperation::Ptr operation, operations) { + qDebug() << " -- Performing Quick Fix" << operation->description(); + operation->perform(); + TestActionsTestCase::escape(); + TestActionsTestCase::undoChangesInAllEditorWidgets(); + QApplication::processEvents(); + } } } } diff --git a/src/plugins/cpptools/cppcodestylepreferencesfactory.cpp b/src/plugins/cpptools/cppcodestylepreferencesfactory.cpp index 633668aabf..599849a302 100644 --- a/src/plugins/cpptools/cppcodestylepreferencesfactory.cpp +++ b/src/plugins/cpptools/cppcodestylepreferencesfactory.cpp @@ -123,10 +123,7 @@ TextEditor::Indenter *CppCodeStylePreferencesFactory::createIndenter() const TextEditor::SnippetProvider *CppCodeStylePreferencesFactory::snippetProvider() const { - return ExtensionSystem::PluginManager::getObject( - [](TextEditor::SnippetProvider *provider) { - return provider->groupId() == QLatin1String(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID); - }); + return TextEditor::SnippetProvider::snippetProviderForGroupId(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID); } QString CppCodeStylePreferencesFactory::previewText() const diff --git a/src/plugins/cpptools/cppcodestylesettingspage.cpp b/src/plugins/cpptools/cppcodestylesettingspage.cpp index 21eadbea4f..5986d7a504 100644 --- a/src/plugins/cpptools/cppcodestylesettingspage.cpp +++ b/src/plugins/cpptools/cppcodestylesettingspage.cpp @@ -493,10 +493,8 @@ void CppCodeStylePreferencesWidget::updatePreview() void CppCodeStylePreferencesWidget::decorateEditors(const FontSettings &fontSettings) { - const SnippetProvider *provider = ExtensionSystem::PluginManager::getObject( - [](SnippetProvider *current) { - return current->groupId() == QLatin1String(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID); - }); + const SnippetProvider *provider = + SnippetProvider::snippetProviderForGroupId(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID); foreach (SnippetEditorWidget *editor, m_previews) { editor->textDocument()->setFontSettings(fontSettings); diff --git a/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp b/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp index 809d546732..6d35cdd78f 100644 --- a/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp +++ b/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp @@ -30,13 +30,15 @@ #include "../editor/nimindenter.h" #include + #include #include -#include #include #include +using namespace TextEditor; + namespace Nim { NimCodeStylePreferencesFactory::NimCodeStylePreferencesFactory() @@ -71,12 +73,9 @@ TextEditor::Indenter *NimCodeStylePreferencesFactory::createIndenter() const return new NimIndenter(); } -TextEditor::SnippetProvider *NimCodeStylePreferencesFactory::snippetProvider() const +SnippetProvider *NimCodeStylePreferencesFactory::snippetProvider() const { - return ExtensionSystem::PluginManager::getObject( - [](TextEditor::SnippetProvider *provider) { - return provider->groupId() == Nim::Constants::C_NIMSNIPPETSGROUP_ID; - }); + return SnippetProvider::snippetProviderForGroupId(Nim::Constants::C_NIMSNIPPETSGROUP_ID); } QString NimCodeStylePreferencesFactory::previewText() const diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 50866d63a4..d0856ad398 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -38,7 +38,7 @@ #include #include #include -#include + #include #include @@ -318,6 +318,18 @@ void BuildConfiguration::prependCompilerPathToEnvironment(Kit *k, Utils::Environ // IBuildConfigurationFactory /// +static QList g_buildConfigurationFactories; + +IBuildConfigurationFactory::IBuildConfigurationFactory() +{ + g_buildConfigurationFactories.append(this); +} + +IBuildConfigurationFactory::~IBuildConfigurationFactory() +{ + g_buildConfigurationFactories.removeOne(this); +} + int IBuildConfigurationFactory::priority(const Target *parent) const { return canHandle(parent) ? 0 : -1; @@ -334,19 +346,15 @@ int IBuildConfigurationFactory::priority(const Kit *k, const QString &projectPat // restore IBuildConfigurationFactory *IBuildConfigurationFactory::find(Target *parent, const QVariantMap &map) { - QList factories - = ExtensionSystem::PluginManager::getObjects( - [&parent, map](IBuildConfigurationFactory *factory) { - return factory->canRestore(parent, map); - }); - IBuildConfigurationFactory *factory = 0; int priority = -1; - foreach (IBuildConfigurationFactory *i, factories) { - int iPriority = i->priority(parent); - if (iPriority > priority) { - factory = i; - priority = iPriority; + for (IBuildConfigurationFactory *i : g_buildConfigurationFactories) { + if (i->canRestore(parent, map)) { + int iPriority = i->priority(parent); + if (iPriority > priority) { + factory = i; + priority = iPriority; + } } } return factory; @@ -355,11 +363,9 @@ IBuildConfigurationFactory *IBuildConfigurationFactory::find(Target *parent, con // setup IBuildConfigurationFactory *IBuildConfigurationFactory::find(const Kit *k, const QString &projectPath) { - QList factories - = ExtensionSystem::PluginManager::instance()->getObjects(); IBuildConfigurationFactory *factory = 0; int priority = -1; - foreach (IBuildConfigurationFactory *i, factories) { + for (IBuildConfigurationFactory *i : g_buildConfigurationFactories) { int iPriority = i->priority(k, projectPath); if (iPriority > priority) { factory = i; @@ -372,11 +378,9 @@ IBuildConfigurationFactory *IBuildConfigurationFactory::find(const Kit *k, const // create IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent) { - QList factories - = ExtensionSystem::PluginManager::instance()->getObjects(); IBuildConfigurationFactory *factory = 0; int priority = -1; - foreach (IBuildConfigurationFactory *i, factories) { + for (IBuildConfigurationFactory *i : g_buildConfigurationFactories) { int iPriority = i->priority(parent); if (iPriority > priority) { factory = i; @@ -389,19 +393,15 @@ IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent) // clone IBuildConfigurationFactory *IBuildConfigurationFactory::find(Target *parent, BuildConfiguration *bc) { - QList factories - = ExtensionSystem::PluginManager::getObjects( - [&parent, &bc](IBuildConfigurationFactory *factory) { - return factory->canClone(parent, bc); - }); - IBuildConfigurationFactory *factory = 0; int priority = -1; - foreach (IBuildConfigurationFactory *i, factories) { - int iPriority = i->priority(parent); - if (iPriority > priority) { - factory = i; - priority = iPriority; + for (IBuildConfigurationFactory *i : g_buildConfigurationFactories) { + if (i->canClone(parent, bc)) { + int iPriority = i->priority(parent); + if (iPriority > priority) { + factory = i; + priority = iPriority; + } } } return factory; diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 3bc718fd51..c9584e1d9b 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -121,7 +121,8 @@ class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory : public QObject Q_OBJECT protected: - IBuildConfigurationFactory() = default; + IBuildConfigurationFactory(); + ~IBuildConfigurationFactory(); public: // The priority is negative if this factory can not create anything for the target. diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index ff2bf2bf3f..265a718f14 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -114,6 +114,8 @@ static const char buildStepEnabledKey[] = "ProjectExplorer.BuildStep.Enabled"; namespace ProjectExplorer { +static QList g_buildStepFactories; + BuildStep::BuildStep(BuildStepList *bsl, Core::Id id) : ProjectConfiguration(bsl, id) { @@ -213,7 +215,19 @@ bool BuildStep::enabled() const } BuildStepFactory::BuildStepFactory() -{ } +{ + g_buildStepFactories.append(this); +} + +BuildStepFactory::~BuildStepFactory() +{ + g_buildStepFactories.removeOne(this); +} + +const QList BuildStepFactory::allBuildStepFactories() +{ + return g_buildStepFactories; +} bool BuildStepFactory::canHandle(BuildStepList *bsl) const { diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h index adc9192060..7a0f6db92a 100644 --- a/src/plugins/projectexplorer/buildstep.h +++ b/src/plugins/projectexplorer/buildstep.h @@ -124,6 +124,9 @@ class PROJECTEXPLORER_EXPORT BuildStepFactory : public QObject public: BuildStepFactory(); + ~BuildStepFactory(); + + static const QList allBuildStepFactories(); BuildStepInfo stepInfo() const; Core::Id stepId() const; diff --git a/src/plugins/projectexplorer/buildsteplist.cpp b/src/plugins/projectexplorer/buildsteplist.cpp index 1d1ffab0d6..d5979a97a6 100644 --- a/src/plugins/projectexplorer/buildsteplist.cpp +++ b/src/plugins/projectexplorer/buildsteplist.cpp @@ -32,7 +32,6 @@ #include "projectexplorer.h" #include "target.h" -#include #include using namespace ProjectExplorer; @@ -108,8 +107,7 @@ bool BuildStepList::fromMap(const QVariantMap &map) if (!ProjectConfiguration::fromMap(map)) return false; - const QList factories - = ExtensionSystem::PluginManager::getObjects(); + const QList factories = BuildStepFactory::allBuildStepFactories(); int maxSteps = map.value(QString::fromLatin1(STEPS_COUNT_KEY), 0).toInt(); for (int i = 0; i < maxSteps; ++i) { diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp index d835b3f609..3e05c09b31 100644 --- a/src/plugins/projectexplorer/buildstepspage.cpp +++ b/src/plugins/projectexplorer/buildstepspage.cpp @@ -32,7 +32,7 @@ #include #include -#include + #include #include #include @@ -288,8 +288,7 @@ void BuildStepListWidget::updateAddBuildStepMenu() { QMap > map; //Build up a list of possible steps and save map the display names to the (internal) name and factories. - QList factories = ExtensionSystem::PluginManager::getObjects(); - foreach (BuildStepFactory *factory, factories) { + for (BuildStepFactory *factory : BuildStepFactory::allBuildStepFactories()) { if (factory->canHandle(m_buildStepList)) { const BuildStepInfo &info = factory->stepInfo(); if (info.flags & BuildStepInfo::Uncreatable) diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp index 057b49840d..c9a84889d1 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp @@ -65,6 +65,19 @@ bool enableLoadTemplateFiles() namespace ProjectExplorer { +static QList g_customWizardMetaFactories; + +ICustomWizardMetaFactory::ICustomWizardMetaFactory(const QString &klass, Core::IWizardFactory::WizardKind kind) : + m_klass(klass), m_kind(kind) +{ + g_customWizardMetaFactories.append(this); +} + +ICustomWizardMetaFactory::~ICustomWizardMetaFactory() +{ + g_customWizardMetaFactories.removeOne(this); +} + namespace Internal { /*! \class ProjectExplorer::ICustomWizardFactory @@ -338,7 +351,7 @@ CustomWizard::CustomWizardContextPtr CustomWizard::context() const CustomWizard *CustomWizard::createWizard(const CustomProjectWizard::CustomWizardParametersPtr &p) { - ICustomWizardMetaFactory *factory = ExtensionSystem::PluginManager::getObject( + ICustomWizardMetaFactory *factory = Utils::findOrDefault(g_customWizardMetaFactories, [&p](ICustomWizardMetaFactory *factory) { return p->klass.isEmpty() ? (p->kind == factory->kind()) : (p->klass == factory->klass()); }); diff --git a/src/plugins/projectexplorer/customwizard/customwizard.h b/src/plugins/projectexplorer/customwizard/customwizard.h index 619b8470c6..d9fec08044 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.h +++ b/src/plugins/projectexplorer/customwizard/customwizard.h @@ -55,9 +55,8 @@ class PROJECTEXPLORER_EXPORT ICustomWizardMetaFactory : public QObject Q_OBJECT public: - ICustomWizardMetaFactory(const QString &klass, Core::IWizardFactory::WizardKind kind) : - m_klass(klass), m_kind(kind) - { } + ICustomWizardMetaFactory(const QString &klass, Core::IWizardFactory::WizardKind kind); + ~ICustomWizardMetaFactory(); virtual CustomWizard *create() const = 0; QString klass() const { return m_klass; } diff --git a/src/plugins/projectexplorer/deployconfiguration.cpp b/src/plugins/projectexplorer/deployconfiguration.cpp index 1c3967442d..3c4e8ab8f4 100644 --- a/src/plugins/projectexplorer/deployconfiguration.cpp +++ b/src/plugins/projectexplorer/deployconfiguration.cpp @@ -32,8 +32,6 @@ #include "projectexplorer.h" #include "target.h" -#include - #include namespace ProjectExplorer { @@ -142,9 +140,22 @@ bool DeployConfiguration::isActive() const // DeployConfigurationFactory /// +static QList g_deployConfigurationFactories; + DeployConfigurationFactory::DeployConfigurationFactory() { setObjectName("DeployConfigurationFactory"); + g_deployConfigurationFactories.append(this); +} + +DeployConfigurationFactory::~DeployConfigurationFactory() +{ + g_deployConfigurationFactories.removeOne(this); +} + +QList DeployConfigurationFactory::allDeployConfigurationFactories() +{ + return g_deployConfigurationFactories; } QList DeployConfigurationFactory::availableCreationIds(Target *parent) const @@ -256,7 +267,7 @@ bool DeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &m DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, const QVariantMap &map) { - return ExtensionSystem::PluginManager::getObject( + return Utils::findOrDefault(g_deployConfigurationFactories, [&parent, &map](DeployConfigurationFactory *factory) { return factory->canRestore(parent, map); }); @@ -264,7 +275,7 @@ DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, con QList DeployConfigurationFactory::find(Target *parent) { - return ExtensionSystem::PluginManager::getObjects( + return Utils::filtered(g_deployConfigurationFactories, [&parent](DeployConfigurationFactory *factory) { return !factory->availableCreationIds(parent).isEmpty(); }); @@ -272,7 +283,7 @@ QList DeployConfigurationFactory::find(Target *par DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, DeployConfiguration *dc) { - return ExtensionSystem::PluginManager::getObject( + return Utils::findOrDefault(g_deployConfigurationFactories, [&parent, &dc](DeployConfigurationFactory *factory) { return factory->canClone(parent, dc); }); diff --git a/src/plugins/projectexplorer/deployconfiguration.h b/src/plugins/projectexplorer/deployconfiguration.h index 4e42e5e00f..56a06ae585 100644 --- a/src/plugins/projectexplorer/deployconfiguration.h +++ b/src/plugins/projectexplorer/deployconfiguration.h @@ -78,6 +78,9 @@ class PROJECTEXPLORER_EXPORT DeployConfigurationFactory : public QObject public: DeployConfigurationFactory(); + ~DeployConfigurationFactory(); + + static QList allDeployConfigurationFactories(); // used to show the list of possible additons to a target, returns a list of types QList availableCreationIds(Target *parent) const; diff --git a/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp b/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp index 5275df08af..86afd635de 100644 --- a/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp @@ -31,8 +31,6 @@ #include -#include - #include namespace ProjectExplorer { @@ -44,9 +42,7 @@ DeviceFactorySelectionDialog::DeviceFactorySelectionDialog(QWidget *parent) : ui->setupUi(this); ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Start Wizard")); - const QList &factories - = ExtensionSystem::PluginManager::getObjects(); - foreach (const IDeviceFactory * const factory, factories) { + for (const IDeviceFactory * const factory : IDeviceFactory::allDeviceFactories()) { if (!factory->canCreate()) continue; foreach (Core::Id id, factory->availableCreationIds()) { diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 2d1e161d2c..900f6d283a 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -29,7 +29,7 @@ #include #include -#include + #include #include #include @@ -338,7 +338,7 @@ void DeviceManager::setDefaultDevice(Core::Id id) const IDeviceFactory *DeviceManager::restoreFactory(const QVariantMap &map) { - IDeviceFactory *factory = ExtensionSystem::PluginManager::getObject( + IDeviceFactory *factory = Utils::findOrDefault(IDeviceFactory::allDeviceFactories(), [&map](IDeviceFactory *factory) { return factory->canRestore(map); }); diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index 7be659e450..98a841122e 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -38,7 +38,7 @@ #include #include -#include + #include #include @@ -111,10 +111,8 @@ void DeviceSettingsWidget::initGui() m_ui->configurationComboBox->setModel(m_deviceManagerModel); m_ui->nameLineEdit->setValidator(m_nameValidator); - const QList &factories - = ExtensionSystem::PluginManager::getObjects(); - - bool hasDeviceFactories = Utils::anyOf(factories, &IDeviceFactory::canCreate); + bool hasDeviceFactories = Utils::anyOf(IDeviceFactory::allDeviceFactories(), + &IDeviceFactory::canCreate); m_ui->addConfigButton->setEnabled(hasDeviceFactories); diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp index f9cb444c8d..8b02da344e 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp @@ -25,7 +25,7 @@ #include "idevicefactory.h" -#include +#include namespace ProjectExplorer { @@ -83,15 +83,29 @@ bool IDeviceFactory::canCreate() const return !availableCreationIds().isEmpty(); } +static QList g_deviceFactories; + IDeviceFactory *IDeviceFactory::find(Core::Id type) { - return ExtensionSystem::PluginManager::getObject( + return Utils::findOrDefault(g_deviceFactories, [&type](IDeviceFactory *factory) { return factory->availableCreationIds().contains(type); }); } IDeviceFactory::IDeviceFactory(QObject *parent) : QObject(parent) -{ } +{ + g_deviceFactories.append(this); +} + +IDeviceFactory::~IDeviceFactory() +{ + g_deviceFactories.removeOne(this); +} + +const QList IDeviceFactory::allDeviceFactories() +{ + return g_deviceFactories; +} } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.h b/src/plugins/projectexplorer/devicesupport/idevicefactory.h index 7010b190c7..42929ff2d7 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.h +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.h @@ -44,6 +44,8 @@ class PROJECTEXPLORER_EXPORT IDeviceFactory : public QObject Q_OBJECT public: + ~IDeviceFactory(); + static const QList allDeviceFactories(); virtual QString displayNameForId(Core::Id type) const = 0; diff --git a/src/plugins/projectexplorer/ipotentialkit.h b/src/plugins/projectexplorer/ipotentialkit.h index 40237682ae..1d25f7ad47 100644 --- a/src/plugins/projectexplorer/ipotentialkit.h +++ b/src/plugins/projectexplorer/ipotentialkit.h @@ -34,7 +34,11 @@ namespace ProjectExplorer { class PROJECTEXPLORER_EXPORT IPotentialKit : public QObject { Q_OBJECT + public: + IPotentialKit(); + ~IPotentialKit() override; + virtual QString displayName() const = 0; virtual void executeFromMenu() = 0; virtual QWidget *createWidget(QWidget *parent) const = 0; diff --git a/src/plugins/projectexplorer/itaskhandler.h b/src/plugins/projectexplorer/itaskhandler.h index 9f8692bbf4..89f8eda738 100644 --- a/src/plugins/projectexplorer/itaskhandler.h +++ b/src/plugins/projectexplorer/itaskhandler.h @@ -44,7 +44,8 @@ class PROJECTEXPLORER_EXPORT ITaskHandler : public QObject Q_OBJECT public: - virtual ~ITaskHandler() { } + ITaskHandler(); + ~ITaskHandler() override; virtual bool isDefaultHandler() const { return false; } virtual bool canHandle(const Task &) const = 0; diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index a4d7b608f6..c0cebbd0c8 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -32,8 +32,6 @@ #include "osparser.h" #include "projectexplorerconstants.h" -#include - #include #include #include @@ -369,7 +367,7 @@ Id Kit::id() const static QIcon iconForDeviceType(Core::Id deviceType) { - const IDeviceFactory *factory = ExtensionSystem::PluginManager::getObject( + const IDeviceFactory *factory = Utils::findOrDefault(IDeviceFactory::allDeviceFactories(), [&deviceType](const IDeviceFactory *factory) { return factory->availableCreationIds().contains(deviceType); }); diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 6a46f957f9..e1c1bf091d 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -25,6 +25,7 @@ #include "kitinformation.h" +#include "abi.h" #include "devicesupport/desktopdevice.h" #include "devicesupport/devicemanager.h" #include "projectexplorerconstants.h" @@ -33,8 +34,6 @@ #include "toolchain.h" #include "toolchainmanager.h" -#include -#include #include #include @@ -566,7 +565,7 @@ KitInformation::ItemList DeviceTypeKitInformation::toUserOutput(const Kit *k) co Core::Id type = deviceTypeId(k); QString typeDisplayName = tr("Unknown device type"); if (type.isValid()) { - IDeviceFactory *factory = ExtensionSystem::PluginManager::getObject( + IDeviceFactory *factory = Utils::findOrDefault(IDeviceFactory::allDeviceFactories(), [&type](IDeviceFactory *factory) { return factory->availableCreationIds().contains(type); }); diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp index d4eae3df13..0ec65f95db 100644 --- a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp @@ -37,7 +37,7 @@ #include #include -#include + #include #include #include @@ -261,9 +261,7 @@ int ToolChainInformationConfigWidget::indexOf(QComboBox *cb, const ToolChain *tc DeviceTypeInformationConfigWidget::DeviceTypeInformationConfigWidget(Kit *workingCopy, const KitInformation *ki) : KitConfigWidget(workingCopy, ki), m_comboBox(new QComboBox) { - QList factories - = ExtensionSystem::PluginManager::getObjects(); - foreach (IDeviceFactory *factory, factories) { + for (IDeviceFactory *factory : IDeviceFactory::allDeviceFactories()) { foreach (Id id, factory->availableCreationIds()) m_comboBox->addItem(factory->displayNameForId(id), id.toSetting()); } diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index d48c9a389e..91b2529e8d 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -34,8 +34,6 @@ #include -#include - #include #include #include @@ -560,7 +558,7 @@ QSet KitFeatureProvider::availablePlatforms() const QString KitFeatureProvider::displayNameForPlatform(Id id) const { - foreach (IDeviceFactory *f, ExtensionSystem::PluginManager::getObjects()) { + for (IDeviceFactory *f : IDeviceFactory::allDeviceFactories()) { if (f->availableCreationIds().contains(id)) { const QString dn = f->displayNameForId(id); QTC_ASSERT(!dn.isEmpty(), continue); diff --git a/src/plugins/projectexplorer/projectimporter.cpp b/src/plugins/projectexplorer/projectimporter.cpp index 67655decb3..25565015d8 100644 --- a/src/plugins/projectexplorer/projectimporter.cpp +++ b/src/plugins/projectexplorer/projectimporter.cpp @@ -37,8 +37,6 @@ #include -#include - #include #include @@ -374,11 +372,9 @@ bool ProjectImporter::hasKitWithTemporaryData(Core::Id id, const QVariant &data) static ProjectImporter::ToolChainData createToolChains(const Utils::FileName &toolChainPath, const Core::Id &language) { - const QList factories - = ExtensionSystem::PluginManager::getObjects(); ProjectImporter::ToolChainData data; - for (ToolChainFactory *factory : factories) { + for (ToolChainFactory *factory : ToolChainFactory::allToolChainFactories()) { data.tcs = factory->autoDetect(toolChainPath, language); if (data.tcs.isEmpty()) continue; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 83cbdd0249..9e08c4bb53 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -36,8 +36,6 @@ #include "session.h" #include "kitinformation.h" -#include - #include #include #include @@ -432,9 +430,22 @@ Utils::OutputFormatter *RunConfiguration::createOutputFormatter() const Translates the types to names to display to the user. */ +static QList g_runConfigurationFactories; + IRunConfigurationFactory::IRunConfigurationFactory(QObject *parent) : QObject(parent) { + g_runConfigurationFactories.append(this); +} + +IRunConfigurationFactory::~IRunConfigurationFactory() +{ + g_runConfigurationFactories.removeOne(this); +} + +const QList IRunConfigurationFactory::allRunConfigurationFactories() +{ + return g_runConfigurationFactories; } QList @@ -556,7 +567,7 @@ RunConfiguration *IRunConfigurationFactory::clone(Target *parent, RunConfigurati IRunConfigurationFactory *IRunConfigurationFactory::find(Target *parent, const QVariantMap &map) { - return ExtensionSystem::PluginManager::getObject( + return Utils::findOrDefault(g_runConfigurationFactories, [&parent, &map](IRunConfigurationFactory *factory) { return factory->canRestore(parent, map); }); @@ -564,7 +575,7 @@ IRunConfigurationFactory *IRunConfigurationFactory::find(Target *parent, const Q IRunConfigurationFactory *IRunConfigurationFactory::find(Target *parent, RunConfiguration *rc) { - return ExtensionSystem::PluginManager::getObject( + return Utils::findOrDefault(g_runConfigurationFactories, [&parent, rc](IRunConfigurationFactory *factory) { return factory->canClone(parent, rc); }); @@ -572,7 +583,7 @@ IRunConfigurationFactory *IRunConfigurationFactory::find(Target *parent, RunConf QList IRunConfigurationFactory::find(Target *parent) { - return ExtensionSystem::PluginManager::getObjects( + return Utils::filtered(g_runConfigurationFactories, [&parent](IRunConfigurationFactory *factory) { return !factory->availableCreators(parent).isEmpty(); }); diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index cf66ef36a6..68e9aab7bd 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -295,6 +295,9 @@ class PROJECTEXPLORER_EXPORT IRunConfigurationFactory : public QObject public: explicit IRunConfigurationFactory(QObject *parent = nullptr); + ~IRunConfigurationFactory(); + + static const QList allRunConfigurationFactories(); enum CreationMode {UserCreate, AutoCreate}; diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 5687534756..781f5872be 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -237,11 +237,8 @@ void RunSettingsWidget::aboutToShowAddMenu() connect(cloneAction, &QAction::triggered, this, &RunSettingsWidget::cloneRunConfiguration); } - const QList factories = - ExtensionSystem::PluginManager::getObjects(); - QList menuActions; - for (IRunConfigurationFactory *factory : factories) { + for (IRunConfigurationFactory *factory : IRunConfigurationFactory::allRunConfigurationFactories()) { const QList items = factory->availableCreators(m_target); for (const RunConfigurationCreationInfo &item : items) { auto action = new QAction(item.displayName, m_addRunMenu); diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 33bd4d83f0..ec7a43e39c 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -87,8 +87,6 @@ class TargetPrivate public: TargetPrivate(Kit *k); - QList deployFactories() const; - bool m_isEnabled = true; QIcon m_overlayIcon; @@ -109,11 +107,6 @@ TargetPrivate::TargetPrivate(Kit *k) : m_kit(k) { } -QList TargetPrivate::deployFactories() const -{ - return ExtensionSystem::PluginManager::getObjects(); -} - Target::Target(Project *project, Kit *k) : ProjectConfiguration(project, k->id()), d(new TargetPrivate(k)) @@ -269,7 +262,7 @@ void Target::addDeployConfiguration(DeployConfiguration *dc) QTC_ASSERT(dc && !d->m_deployConfigurations.contains(dc), return); Q_ASSERT(dc->target() == this); - if (d->deployFactories().isEmpty()) + if (DeployConfigurationFactory::allDeployConfigurationFactories().isEmpty()) return; // Check that we don't have a configuration with the same displayName diff --git a/src/plugins/projectexplorer/targetsetuppage.cpp b/src/plugins/projectexplorer/targetsetuppage.cpp index 0336d83377..f39582e7f1 100644 --- a/src/plugins/projectexplorer/targetsetuppage.cpp +++ b/src/plugins/projectexplorer/targetsetuppage.cpp @@ -36,8 +36,9 @@ #include "targetsetupwidget.h" #include -#include + #include + #include #include #include @@ -52,6 +53,19 @@ #include namespace ProjectExplorer { + +static QList g_potentialKits; + +IPotentialKit::IPotentialKit() +{ + g_potentialKits.append(this); +} + +IPotentialKit::~IPotentialKit() +{ + g_potentialKits.removeOne(this); +} + namespace Internal { static Utils::FileName importDirectory(const QString &projectPath) { @@ -183,9 +197,7 @@ TargetSetupPage::TargetSetupPage(QWidget *parent) : setTitle(tr("Kit Selection")); - QList potentialKits = - ExtensionSystem::PluginManager::instance()->getObjects(); - foreach (IPotentialKit *pk, potentialKits) + for (IPotentialKit *pk : g_potentialKits) if (pk->isEnabled()) m_potentialWidgets.append(pk->createWidget(this)); diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index d8337cf6ff..75ba8e6391 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -36,7 +36,7 @@ #include #include #include -#include + #include #include #include @@ -56,6 +56,19 @@ const char SESSION_FILTER_WARNINGS[] = "TaskWindow.IncludeWarnings"; } namespace ProjectExplorer { + +static QList g_taskHandlers; + +ITaskHandler::ITaskHandler() +{ + g_taskHandlers.append(this); +} + +ITaskHandler::~ITaskHandler() +{ + g_taskHandlers.removeOne(this); +} + namespace Internal { class TaskView : public Utils::ListView @@ -321,8 +334,7 @@ void TaskWindow::delayedInitialization() alreadyDone = true; - QList handlers = ExtensionSystem::PluginManager::getObjects(); - foreach (ITaskHandler *h, handlers) { + for (ITaskHandler *h : g_taskHandlers) { if (h->isDefaultHandler() && !d->m_defaultHandler) d->m_defaultHandler = h; diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 53e03e16ad..4cc3ee120d 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -322,6 +322,23 @@ QList ToolChain::validateKit(const Kit *) const Used by the tool chain manager to restore user-generated tool chains. */ +static QList g_toolChainFactories; + +ToolChainFactory::ToolChainFactory() +{ + g_toolChainFactories.append(this); +} + +ToolChainFactory::~ToolChainFactory() +{ + g_toolChainFactories.removeOne(this); +} + +const QList ToolChainFactory::allToolChainFactories() +{ + return g_toolChainFactories; +} + QList ToolChainFactory::autoDetect(const QList &alreadyKnown) { Q_UNUSED(alreadyKnown); diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 018c99fd7e..10c86c9e92 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -177,6 +177,11 @@ class PROJECTEXPLORER_EXPORT ToolChainFactory : public QObject Q_OBJECT public: + ToolChainFactory(); + ~ToolChainFactory(); + + static const QList allToolChainFactories(); + QString displayName() const { return m_displayName; } virtual QList autoDetect(const QList &alreadyKnown); diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index b6c79b8773..87ad2f2b30 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -31,8 +31,6 @@ #include -#include - #include #include #include @@ -139,7 +137,7 @@ static QList restoreFromFile(const FileName &fileName) if (version < 1) return result; - QList factories = ExtensionSystem::PluginManager::getObjects(); + const QList factories = ToolChainFactory::allToolChainFactories(); int count = data.value(QLatin1String(TOOLCHAIN_COUNT_KEY), 0).toInt(); for (int i = 0; i < count; ++i) { @@ -150,7 +148,7 @@ static QList restoreFromFile(const FileName &fileName) const QVariantMap tcMap = data.value(key).toMap(); bool restored = false; - foreach (ToolChainFactory *f, factories) { + for (ToolChainFactory *f : factories) { if (f->canRestore(tcMap)) { if (ToolChain *tc = f->restore(tcMap)) { result.append(tc); @@ -172,9 +170,7 @@ static QList restoreFromFile(const FileName &fileName) static QList autoDetectToolChains(const QList alreadyKnownTcs) { QList result; - const QList factories - = ExtensionSystem::PluginManager::getObjects(); - foreach (ToolChainFactory *f, factories) + for (ToolChainFactory *f : ToolChainFactory::allToolChainFactories()) result.append(f->autoDetect(alreadyKnownTcs)); // Remove invalid toolchains that might have sneaked in. diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 2e76c7f3c4..8cfd23655e 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -110,7 +110,7 @@ class ToolChainOptionsWidget : public QWidget public: ToolChainOptionsWidget() { - m_factories = ExtensionSystem::PluginManager::getObjects( + m_factories = Utils::filtered(ToolChainFactory::allToolChainFactories(), [](ToolChainFactory *factory) { return factory->canCreate();}); m_model.setHeader({ToolChainOptionsPage::tr("Name"), ToolChainOptionsPage::tr("Type")}); diff --git a/src/plugins/qbsprojectmanager/propertyprovider.h b/src/plugins/qbsprojectmanager/propertyprovider.h index 1d99c1aea5..7d6e94f897 100644 --- a/src/plugins/qbsprojectmanager/propertyprovider.h +++ b/src/plugins/qbsprojectmanager/propertyprovider.h @@ -39,6 +39,9 @@ class QBSPROJECTMANAGER_EXPORT PropertyProvider : public QObject Q_OBJECT public: + PropertyProvider(); + ~PropertyProvider(); + virtual bool canHandle(const ProjectExplorer::Kit *k) const = 0; virtual QVariantMap properties(const ProjectExplorer::Kit *k, const QVariantMap &defaultData) const = 0; }; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp index ba4775f2c2..ad99c81bf1 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp @@ -34,7 +34,7 @@ #include #include -#include + #include #include #include @@ -54,6 +54,19 @@ static QString qtcProfileGroup() { return QLatin1String("preferences.qtcreator.k static QString qtcProfilePrefix() { return qtcProfileGroup() + sep; } namespace QbsProjectManager { + +static QList g_propertyProviders; + +PropertyProvider::PropertyProvider() +{ + g_propertyProviders.append(this); +} + +PropertyProvider::~PropertyProvider() +{ + g_propertyProviders.removeOne(this); +} + namespace Internal { qbs::Settings *QbsManager::m_settings = nullptr; @@ -200,8 +213,7 @@ void QbsManager::addProfileFromKit(const ProjectExplorer::Kit *k) // set up properties: QVariantMap data = m_defaultPropertyProvider->properties(k, QVariantMap()); - QList providerList = ExtensionSystem::PluginManager::getObjects(); - foreach (PropertyProvider *provider, providerList) { + for (PropertyProvider *provider : g_propertyProviders) { if (provider->canHandle(k)) data = provider->properties(k, data); } diff --git a/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp b/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp index 3acc165550..12b3e9a13b 100644 --- a/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp +++ b/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp @@ -25,7 +25,7 @@ #include "qmakerunconfigurationfactory.h" -#include +using namespace ProjectExplorer; namespace QmakeProjectManager { @@ -35,13 +35,15 @@ QmakeRunConfigurationFactory::QmakeRunConfigurationFactory(QObject *parent) : QmakeRunConfigurationFactory *QmakeRunConfigurationFactory::find(ProjectExplorer::Target *t) { - if (!t) - return nullptr; - - return ExtensionSystem::PluginManager::getObject( - [&t](QmakeRunConfigurationFactory *factory) { - return factory->canHandle(t); - }); + if (t) { + for (auto factory : IRunConfigurationFactory::allRunConfigurationFactories()) { + if (auto qmakeFactory = qobject_cast(factory)) { + if (qmakeFactory->canHandle(t)) + return qmakeFactory; + } + } + } + return nullptr; } } // namespace QmakeProjectManager diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.cpp b/src/plugins/qmljseditor/qmljsquickfixassist.cpp index 1138a1341e..7f7160d6ea 100644 --- a/src/plugins/qmljseditor/qmljsquickfixassist.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixassist.cpp @@ -30,7 +30,7 @@ //temp #include "qmljsquickfix.h" -#include +#include using namespace QmlJSTools; using namespace TextEditor; @@ -85,10 +85,9 @@ IAssistProcessor *QmlJSQuickFixAssistProvider::createProcessor() const QList QmlJSQuickFixAssistProvider::quickFixFactories() const { - QList results; - foreach (QmlJSQuickFixFactory *f, ExtensionSystem::PluginManager::getObjects()) - results.append(f); - return results; + return Utils::filtered(QuickFixFactory::allQuickFixFactories(), [](QuickFixFactory *f) { + return qobject_cast(f) != nullptr; + }); } } // namespace QmlJSEditor diff --git a/src/plugins/qmljstools/qmljsbundleprovider.cpp b/src/plugins/qmljstools/qmljsbundleprovider.cpp index 10f81a9db3..8fa30ae870 100644 --- a/src/plugins/qmljstools/qmljsbundleprovider.cpp +++ b/src/plugins/qmljstools/qmljsbundleprovider.cpp @@ -176,4 +176,22 @@ void BasicBundleProvider::mergeBundlesForKit(ProjectExplorer::Kit *kit } } +static QList g_bundleProviders; + +IBundleProvider::IBundleProvider(QObject *parent) + : QObject(parent) +{ + g_bundleProviders.append(this); +} + +IBundleProvider::~IBundleProvider() +{ + g_bundleProviders.removeOne(this); +} + +const QList IBundleProvider::allBundleProviders() +{ + return g_bundleProviders; +} + } // end namespace QmlJSTools diff --git a/src/plugins/qmljstools/qmljsbundleprovider.h b/src/plugins/qmljstools/qmljsbundleprovider.h index d3b01bbb22..8fc2258c69 100644 --- a/src/plugins/qmljstools/qmljsbundleprovider.h +++ b/src/plugins/qmljstools/qmljsbundleprovider.h @@ -47,9 +47,10 @@ class QMLJSTOOLS_EXPORT IBundleProvider : public QObject { Q_OBJECT public: - explicit IBundleProvider(QObject *parent = 0) - : QObject(parent) - { } + explicit IBundleProvider(QObject *parent = 0); + ~IBundleProvider(); + + static const QList allBundleProviders(); virtual void mergeBundlesForKit(ProjectExplorer::Kit *kit, QmlJS::QmlLanguageBundles &bundles , const QHash &replacements) = 0; diff --git a/src/plugins/qmljstools/qmljscodestylepreferencesfactory.cpp b/src/plugins/qmljstools/qmljscodestylepreferencesfactory.cpp index 60c1cad38f..42a42d4d1f 100644 --- a/src/plugins/qmljstools/qmljscodestylepreferencesfactory.cpp +++ b/src/plugins/qmljstools/qmljscodestylepreferencesfactory.cpp @@ -88,10 +88,8 @@ TextEditor::Indenter *QmlJSCodeStylePreferencesFactory::createIndenter() const TextEditor::SnippetProvider *QmlJSCodeStylePreferencesFactory::snippetProvider() const { - return ExtensionSystem::PluginManager::getObject( - [](TextEditor::SnippetProvider *provider) { - return provider->groupId() == QLatin1String(QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID); - }); + return TextEditor::SnippetProvider::snippetProviderForGroupId + (QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID); } QString QmlJSCodeStylePreferencesFactory::previewText() const diff --git a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp index 9067f1cac8..04bbb007e5 100644 --- a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp +++ b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp @@ -80,13 +80,10 @@ void QmlJSCodeStylePreferencesWidget::setPreferences(ICodeStylePreferences *pref updatePreview(); } - void QmlJSCodeStylePreferencesWidget::decorateEditor(const FontSettings &fontSettings) { - const SnippetProvider *provider = ExtensionSystem::PluginManager::getObject( - [](SnippetProvider *current) { - return current->groupId() == QLatin1String(QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID); - }); + const SnippetProvider *provider = + SnippetProvider::snippetProviderForGroupId(QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID); m_ui->previewTextEdit->textDocument()->setFontSettings(fontSettings); if (provider) diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index 4da912cc90..a493ca2e94 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -33,8 +33,9 @@ #include #include #include + #include -#include + #include #include #include @@ -152,13 +153,9 @@ void setupProjectInfoQmlBundles(ModelManagerInterface::ProjectInfo &projectInfo) replacements.insert(QLatin1String("$(QT_INSTALL_IMPORTS)"), projectInfo.qtImportsPath); replacements.insert(QLatin1String("$(QT_INSTALL_QML)"), projectInfo.qtQmlPath); - QList bundleProviders = - ExtensionSystem::PluginManager::getObjects(); + for (IBundleProvider *bp : IBundleProvider::allBundleProviders()) + bp->mergeBundlesForKit(activeKit, projectInfo.activeBundle, replacements); - foreach (IBundleProvider *bp, bundleProviders) { - if (bp) - bp->mergeBundlesForKit(activeKit, projectInfo.activeBundle, replacements); - } projectInfo.extendedBundle = projectInfo.activeBundle; if (projectInfo.project) { @@ -167,9 +164,8 @@ void setupProjectInfoQmlBundles(ModelManagerInterface::ProjectInfo &projectInfo) currentKits.insert(t->kit()); currentKits.remove(activeKit); foreach (Kit *kit, currentKits) { - foreach (IBundleProvider *bp, bundleProviders) - if (bp) - bp->mergeBundlesForKit(kit, projectInfo.extendedBundle, replacements); + for (IBundleProvider *bp : IBundleProvider::allBundleProviders()) + bp->mergeBundlesForKit(kit, projectInfo.extendedBundle, replacements); } } } diff --git a/src/plugins/qtsupport/qtversionfactory.cpp b/src/plugins/qtsupport/qtversionfactory.cpp index dc23ea981f..ebc8ae36ee 100644 --- a/src/plugins/qtsupport/qtversionfactory.cpp +++ b/src/plugins/qtsupport/qtversionfactory.cpp @@ -36,13 +36,22 @@ using namespace QtSupport; using namespace QtSupport::Internal; +static QList g_qtVersionFactories; + QtVersionFactory::QtVersionFactory(QObject *parent) : QObject(parent) { + g_qtVersionFactories.append(this); } QtVersionFactory::~QtVersionFactory() { + g_qtVersionFactories.removeOne(this); +} + +const QList QtVersionFactory::allQtVersionFactories() +{ + return g_qtVersionFactories; } BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileName &qmakePath, bool isAutoDetected, const QString &autoDetectionSource, QString *error) @@ -62,7 +71,7 @@ BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileN ProFileEvaluator evaluator(&globals, &parser, &vfs, &msgHandler); evaluator.loadNamedSpec(mkspec.toString(), false); - QList factories = ExtensionSystem::PluginManager::getObjects(); + QList factories = g_qtVersionFactories; Utils::sort(factories, [](const QtVersionFactory *l, const QtVersionFactory *r) { return l->priority() > r->priority(); }); diff --git a/src/plugins/qtsupport/qtversionfactory.h b/src/plugins/qtsupport/qtversionfactory.h index d789717408..c54b2c3745 100644 --- a/src/plugins/qtsupport/qtversionfactory.h +++ b/src/plugins/qtsupport/qtversionfactory.h @@ -49,6 +49,8 @@ public: explicit QtVersionFactory(QObject *parent = 0); ~QtVersionFactory(); + static const QList allQtVersionFactories(); + virtual bool canRestore(const QString &type) = 0; virtual BaseQtVersion *restore(const QString &type, const QVariantMap &data) = 0; diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 321fd5895d..621cfa6878 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -179,7 +179,7 @@ static bool restoreQtVersions() m_writer = new PersistentSettingsWriter(settingsFileName(QLatin1String(QTVERSION_FILENAME)), QLatin1String("QtCreatorQtVersions")); - QList factories = ExtensionSystem::PluginManager::getObjects(); + const QList factories = QtVersionFactory::allQtVersionFactories(); PersistentSettingsReader reader; FileName filename = settingsFileName(QLatin1String(QTVERSION_FILENAME)); @@ -208,7 +208,7 @@ static bool restoreQtVersions() const QString type = qtversionMap.value(QLatin1String(QTVERSION_TYPE_KEY)).toString(); bool restored = false; - foreach (QtVersionFactory *f, factories) { + for (QtVersionFactory *f : factories) { if (f->canRestore(type)) { if (BaseQtVersion *qtv = f->restore(type, qtversionMap)) { if (m_versions.contains(qtv->uniqueId())) { @@ -249,7 +249,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal) QList removed; QList changed; - QList factories = ExtensionSystem::PluginManager::getObjects(); + const QList factories = QtVersionFactory::allQtVersionFactories(); PersistentSettingsReader reader; QVariantMap data; if (reader.load(path)) diff --git a/src/plugins/texteditor/ioutlinewidget.h b/src/plugins/texteditor/ioutlinewidget.h index d6aa32fa03..7ea654441f 100644 --- a/src/plugins/texteditor/ioutlinewidget.h +++ b/src/plugins/texteditor/ioutlinewidget.h @@ -46,9 +46,14 @@ public: virtual QVariantMap settings() const { return QVariantMap(); } }; -class TEXTEDITOR_EXPORT IOutlineWidgetFactory : public QObject { +class TEXTEDITOR_EXPORT IOutlineWidgetFactory : public QObject +{ Q_OBJECT + public: + IOutlineWidgetFactory(); + ~IOutlineWidgetFactory() override; + virtual bool supportsEditor(Core::IEditor *editor) const = 0; virtual IOutlineWidget *createWidget(Core::IEditor *editor) = 0; }; diff --git a/src/plugins/texteditor/outlinefactory.cpp b/src/plugins/texteditor/outlinefactory.cpp index 0b04789099..76dd86717e 100644 --- a/src/plugins/texteditor/outlinefactory.cpp +++ b/src/plugins/texteditor/outlinefactory.cpp @@ -38,6 +38,19 @@ #include namespace TextEditor { + +static QList g_outlineWidgetFactories; + +IOutlineWidgetFactory::IOutlineWidgetFactory() +{ + g_outlineWidgetFactories.append(this); +} + +IOutlineWidgetFactory::~IOutlineWidgetFactory() +{ + g_outlineWidgetFactories.removeOne(this); +} + namespace Internal { OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) : @@ -153,7 +166,7 @@ void OutlineWidgetStack::updateCurrentEditor(Core::IEditor *editor) IOutlineWidget *newWidget = 0; if (editor) { - foreach (IOutlineWidgetFactory *widgetFactory, m_factory->widgetFactories()) { + for (IOutlineWidgetFactory *widgetFactory : g_outlineWidgetFactories) { if (widgetFactory->supportsEditor(editor)) { newWidget = widgetFactory->createWidget(editor); break; @@ -189,16 +202,6 @@ OutlineFactory::OutlineFactory() setPriority(600); } -QList OutlineFactory::widgetFactories() const -{ - return m_factories; -} - -void OutlineFactory::setWidgetFactories(QList factories) -{ - m_factories = factories; -} - Core::NavigationView OutlineFactory::createWidget() { Core::NavigationView n; diff --git a/src/plugins/texteditor/outlinefactory.h b/src/plugins/texteditor/outlinefactory.h index 11a1f4d0a9..940aab969e 100644 --- a/src/plugins/texteditor/outlinefactory.h +++ b/src/plugins/texteditor/outlinefactory.h @@ -72,15 +72,10 @@ class OutlineFactory : public Core::INavigationWidgetFactory public: OutlineFactory(); - QList widgetFactories() const; - void setWidgetFactories(QList factories); - // from INavigationWidgetFactory virtual Core::NavigationView createWidget(); virtual void saveSettings(QSettings *settings, int position, QWidget *widget); virtual void restoreSettings(QSettings *settings, int position, QWidget *widget); -private: - QList m_factories; }; } // namespace Internal diff --git a/src/plugins/texteditor/quickfix.cpp b/src/plugins/texteditor/quickfix.cpp index 1fff0b3d6f..8f6012829b 100644 --- a/src/plugins/texteditor/quickfix.cpp +++ b/src/plugins/texteditor/quickfix.cpp @@ -56,11 +56,20 @@ void QuickFixOperation::setDescription(const QString &description) _description = description; } +static QList g_quickFixFactories; + QuickFixFactory::QuickFixFactory(QObject *parent) : QObject(parent) { + g_quickFixFactories.append(this); } QuickFixFactory::~QuickFixFactory() { + g_quickFixFactories.removeOne(this); +} + +const QList QuickFixFactory::allQuickFixFactories() +{ + return g_quickFixFactories; } diff --git a/src/plugins/texteditor/quickfix.h b/src/plugins/texteditor/quickfix.h index 715d9e09b7..c9ee1f6f0b 100644 --- a/src/plugins/texteditor/quickfix.h +++ b/src/plugins/texteditor/quickfix.h @@ -114,6 +114,8 @@ public: QuickFixFactory(QObject *parent = 0); ~QuickFixFactory(); + static const QList allQuickFixFactories(); + virtual void matchingOperations(const QuickFixInterface &interface, QuickFixOperations &result) = 0; }; diff --git a/src/plugins/texteditor/snippets/snippetprovider.cpp b/src/plugins/texteditor/snippets/snippetprovider.cpp index 3791996d12..13e9515232 100644 --- a/src/plugins/texteditor/snippets/snippetprovider.cpp +++ b/src/plugins/texteditor/snippets/snippetprovider.cpp @@ -27,8 +27,33 @@ #include "texteditorplugin.h" +#include + using namespace TextEditor; +static QList g_snippetProviders; + +const QList SnippetProvider::snippetProviders() +{ + return g_snippetProviders; +} + +SnippetProvider *SnippetProvider::snippetProviderForGroupId(const QString &groupId) +{ + return Utils::findOrDefault(g_snippetProviders, + Utils::equal(&SnippetProvider::groupId, groupId)); +} + +SnippetProvider::SnippetProvider() +{ + g_snippetProviders.append(this); +} + +SnippetProvider::~SnippetProvider() +{ + g_snippetProviders.removeOne(this); +} + /*! \group Snippets \title Snippets for Editors diff --git a/src/plugins/texteditor/snippets/snippetprovider.h b/src/plugins/texteditor/snippets/snippetprovider.h index 0bb0b0682c..5c343df182 100644 --- a/src/plugins/texteditor/snippets/snippetprovider.h +++ b/src/plugins/texteditor/snippets/snippetprovider.h @@ -41,6 +41,9 @@ class TEXTEDITOR_EXPORT SnippetProvider : public QObject public: using EditorDecorator = std::function; + static const QList snippetProviders(); + static SnippetProvider *snippetProviderForGroupId(const QString &groupId); + static void registerGroup(const QString &groupId, const QString &displayName, EditorDecorator editorDecorator = EditorDecorator()); @@ -51,7 +54,8 @@ public: void decorateEditor(TextEditorWidget *editor) const; private: - SnippetProvider() = default; + SnippetProvider(); + ~SnippetProvider() override; QString m_groupId; QString m_displayName; diff --git a/src/plugins/texteditor/snippets/snippetscollection.cpp b/src/plugins/texteditor/snippets/snippetscollection.cpp index 4aabbf2fd2..20c9615d5a 100644 --- a/src/plugins/texteditor/snippets/snippetscollection.cpp +++ b/src/plugins/texteditor/snippets/snippetscollection.cpp @@ -409,9 +409,7 @@ int SnippetsCollection::groupIndex(const QString &groupId) const void SnippetsCollection::identifyGroups() { - const QList &providers = - ExtensionSystem::PluginManager::getObjects(); - foreach (SnippetProvider *provider, providers) { + for (SnippetProvider *provider : SnippetProvider::snippetProviders()) { const int groupIndex = m_groupIndexById.size(); m_groupIndexById.insert(provider->groupId(), groupIndex); m_snippets.resize(groupIndex + 1); diff --git a/src/plugins/texteditor/snippets/snippetssettingspage.cpp b/src/plugins/texteditor/snippets/snippetssettingspage.cpp index 85b88d4eb4..96a81d27f0 100644 --- a/src/plugins/texteditor/snippets/snippetssettingspage.cpp +++ b/src/plugins/texteditor/snippets/snippetssettingspage.cpp @@ -328,9 +328,8 @@ void SnippetsSettingsPagePrivate::configureUi(QWidget *w) { m_ui.setupUi(w); - const QList &providers = - ExtensionSystem::PluginManager::getObjects(); - foreach (SnippetProvider *provider, providers) { + const QList &providers = SnippetProvider::snippetProviders(); + for (SnippetProvider *provider : providers) { m_ui.groupCombo->addItem(provider->displayName(), provider->groupId()); SnippetEditorWidget *snippetEditor = new SnippetEditorWidget(w); provider->decorateEditor(snippetEditor); @@ -537,8 +536,7 @@ void SnippetsSettingsPagePrivate::setSnippetContent() void SnippetsSettingsPagePrivate::decorateEditors(const TextEditor::FontSettings &fontSettings) { - const QList &providers = - ExtensionSystem::PluginManager::getObjects(); + const QList &providers = SnippetProvider::snippetProviders(); for (int i = 0; i < m_ui.groupCombo->count(); ++i) { SnippetEditorWidget *snippetEditor = editorAt(i); snippetEditor->textDocument()->setFontSettings(fontSettings); diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp index 80f95ba22c..37b7aed27f 100644 --- a/src/plugins/texteditor/texteditorplugin.cpp +++ b/src/plugins/texteditor/texteditorplugin.cpp @@ -147,8 +147,6 @@ bool TextEditorPlugin::initialize(const QStringList &arguments, QString *errorMe void TextEditorPlugin::extensionsInitialized() { - m_outlineFactory->setWidgetFactories(ExtensionSystem::PluginManager::getObjects()); - connect(m_settings, &TextEditorSettings::fontSettingsChanged, this, &TextEditorPlugin::updateSearchResultsFont); diff --git a/src/plugins/vcsbase/basevcseditorfactory.cpp b/src/plugins/vcsbase/basevcseditorfactory.cpp index 2e26d4026e..84edc57092 100644 --- a/src/plugins/vcsbase/basevcseditorfactory.cpp +++ b/src/plugins/vcsbase/basevcseditorfactory.cpp @@ -83,10 +83,13 @@ VcsEditorFactory::VcsEditorFactory(const VcsBaseEditorParameters *parameters, VcsBaseEditor *VcsEditorFactory::createEditorById(const char *id) { - auto factory = ExtensionSystem::PluginManager::getObject( - [id](QObject *ob) { return ob->property("VcsEditorFactoryName").toByteArray() == id; }); - QTC_ASSERT(factory, return 0); - return qobject_cast(factory->createEditor()); + for (IEditorFactory *factory : allEditorFactories()) { + if (auto vcsFactory = qobject_cast(factory)) { + if (vcsFactory->property("VcsEditorFactoryName").toByteArray() == id) + return qobject_cast(factory->createEditor()); + } + } + return nullptr; } } // namespace VcsBase diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 195dac2d14..0c9f62cb37 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -343,8 +343,7 @@ void WelcomeMode::initPlugins() QSettings *settings = ICore::settings(); m_activePage = Id::fromSetting(settings->value(currentPageSettingsKeyC)); - const QList availablePages = PluginManager::getObjects(); - for (IWelcomePage *page : availablePages) + for (IWelcomePage *page : IWelcomePage::allWelcomePages()) addPage(page); // make sure later added pages are made available too: -- GitLab