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 | 19 +++++- .../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 | 7 ++- 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, 698 insertions(+), 332 deletions(-) diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 57a911ce7de..b2ff7378eef 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 d78ada13f77..eaf27d433e7 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 806b858f398..fd38b68aba3 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 eeceb6a7866..61cdcd15d22 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 460c749ebad..8b5afb00920 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 021e5d7cff9..df2db99551c 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 a9bf34e451a..b252d0de2be 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 16ac6e91844..49d72dc1d93 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 b726755b7b5..16e6d285c04 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 dca59526ddb..4d1aea8fd92 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 312d08346ba..7feb9aae022 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 72b9881d9fc..1c241364dc4 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 49cc96566a4..0edf3a39669 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 45fc900f183..61d0854cdf2 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 c3abc40b8a7..b32b6036bc8 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 583001951cb..5ed1a83edad 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 7da7f484442..246003162f8 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 24784b1e4ad..84d99bcef08 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 3ae5ce0e500..c90ba0ba363 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 ba619cfa309..a4699dc7b3f 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 d57a16370e1..c861d1e0df9 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 9c67c29fc2e..efedbf44f9d 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: - virtual ~IFindFilter() {} +public: + 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 a1b32359e29..90ade039d57 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 4073354dc1d..4029d3e3abe 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 4aba09b97ac..016d562d8bd 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 518cb23f1f0..461f8aeb4b4 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 2e788eb8c75..494680a87ad 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 06dfdb43bc4..eb7c78993d9 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 22052122322..e569b4b366d 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 55d266b406a..d4cd8cc4a9d 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 a99a309ea76..0f93bb1f3b6 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 4732a2893c1..7fa43653eb0 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 1e74741c7ed..5ba268b5e3a 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 828f21fb590..c6adae975e5 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 a3e9df5e45c..a4261d571c7 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 13d7036d8fb..2b977015754 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 034271a750b..be6938af650 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 02c63534c7b..fba4b733aa1 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 8ded187d889..349c7111d4a 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 463172d45bd..21b11c7524b 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 633668aabfc..599849a302d 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 21eadbea4fb..5986d7a5040 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 809d546732b..6d35cdd78fa 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 50866d63a42..d0856ad398e 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 3bc718fd514..c9584e1d9ba 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 ff2bf2bf3f4..265a718f143 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 adc91920603..7a0f6db92aa 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 1d1ffab0d66..d5979a97a6e 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 d835b3f6092..3e05c09b310 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 057b49840d1..c9a84889d16 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 619b8470c69..d9fec08044d 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 1c3967442d0..3c4e8ab8f4c 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 4e42e5e00f0..56a06ae5854 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 5275df08af3..86afd635ded 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 2d1e161d2cc..900f6d283ac 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 7be659e4502..98a841122e5 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 f9cb444c8d7..8b02da344e1 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 7010b190c78..42929ff2d73 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 40237682aee..1d25f7ad47a 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 9f8692bbf48..89f8eda7382 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 a4d7b608f66..c0cebbd0c80 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 6a46f957f9f..e1c1bf091d8 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 d4eae3df133..0ec65f95dbf 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 d48c9a389e6..91b2529e8dc 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 67655decb3f..25565015d89 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 83cbdd0249b..9e08c4bb535 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 cf66ef36a61..68e9aab7bde 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 56875347562..781f5872bea 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 33bd4d83f07..ec7a43e39c3 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 0336d83377d..f39582e7f1a 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 d8337cf6ff7..75ba8e63916 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 53e03e16ad8..4cc3ee120d5 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 018c99fd7eb..10c86c9e920 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 b6c79b8773c..87ad2f2b30d 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 2e76c7f3c40..8cfd23655e8 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 1d99c1aea5c..7d6e94f8973 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 ba4775f2c27..ad99c81bf1f 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 3acc1655506..12b3e9a13bb 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 1138a1341e8..7f7160d6ea7 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 10f81a9db31..8fa30ae8701 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 d3b01bbb225..8fc2258c69d 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 60c1cad38f6..42a42d4d1f1 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 9067f1cac80..04bbb007e58 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 4da912cc90c..a493ca2e94b 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 dc23ea981f6..ebc8ae36eed 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 d789717408b..c54b2c37456 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 321fd5895d0..621cfa6878d 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 d6aa32fa039..7ea654441fb 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 0b047890992..76dd86717e4 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 11a1f4d0a93..940aab969e8 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 1fff0b3d6f1..8f6012829b8 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 715d9e09b79..c9ee1f6f0b3 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 3791996d12f..13e95152323 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 0bb0b0682cd..5c343df1823 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 4aabbf2fd20..20c9615d5a6 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 85b88d4eb4a..96a81d27f0e 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 80f95ba22c7..37b7aed27fc 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 2e26d4026e4..84edc570926 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 195dac2d147..0c9f62cb37f 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: