diff options
Diffstat (limited to 'src/libs/extensionsystem/iplugin.cpp')
-rw-r--r-- | src/libs/extensionsystem/iplugin.cpp | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/src/libs/extensionsystem/iplugin.cpp b/src/libs/extensionsystem/iplugin.cpp index 9f7ca221e5..2af4925573 100644 --- a/src/libs/extensionsystem/iplugin.cpp +++ b/src/libs/extensionsystem/iplugin.cpp @@ -161,12 +161,47 @@ namespace ExtensionSystem { namespace Internal { +class ObjectInitializer +{ +public: + ObjectCreator creator; + ObjectDestructor destructor; + ObjectCreationPolicy policy; +}; + class IPluginPrivate { public: + void tryCreateObjects(); + QList<TestCreator> testCreators; + + QList<ObjectInitializer> objectInitializers; + QList<std::function<void()>> objectDestructors; + + // For debugging purposes: + QList<void *> createdObjects; // Not owned. }; +void IPluginPrivate::tryCreateObjects() +{ + QList<ObjectInitializer> unhandledObjectInitializers; + + for (const ObjectInitializer &initializer : std::as_const(objectInitializers)) { + if (!initializer.policy.dependsOn.isEmpty()) { + qWarning("Initialization dependencies are not supported yet"); + unhandledObjectInitializers.append(initializer); + continue; + } + + void *object = initializer.creator(); + createdObjects.append(object); + objectDestructors.append([initializer, object] { initializer.destructor(object); }); + } + + objectInitializers = unhandledObjectInitializers; +} + } // Internal /*! @@ -182,10 +217,20 @@ IPlugin::IPlugin() */ IPlugin::~IPlugin() { + for (const std::function<void()> &dtor : std::as_const(d->objectDestructors)) + dtor(); + delete d; d = nullptr; } +void IPlugin::addManagedHelper(const ObjectCreator &creator, + const ObjectDestructor &destructor, + const ObjectCreationPolicy &policy) +{ + d->objectInitializers.append({creator, destructor, policy}); +} + bool IPlugin::initialize(const QStringList &arguments, QString *errorString) { Q_UNUSED(arguments) @@ -195,7 +240,16 @@ bool IPlugin::initialize(const QStringList &arguments, QString *errorString) } /*! - Registers a function object that creates a test object. + \internal +*/ +void IPlugin::tryCreateObjects() +{ + d->tryCreateObjects(); +} + +/*! + Registers a function object that creates a test object with the owner + \a creator. The created objects are meant to be passed on to \l QTest::qExec(). @@ -211,9 +265,7 @@ void IPlugin::addTestCreator(const TestCreator &creator) } /*! - \deprecated [10.0] Use addTest() instead - - \sa addTest() + \deprecated [10.0] Use \c addTest() instead. */ QVector<QObject *> IPlugin::createTestObjects() const { |