diff options
Diffstat (limited to 'src/libs/extensionsystem/iplugin.cpp')
-rw-r--r-- | src/libs/extensionsystem/iplugin.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/libs/extensionsystem/iplugin.cpp b/src/libs/extensionsystem/iplugin.cpp index 9f7ca221e5..6661a46f61 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,6 +240,14 @@ bool IPlugin::initialize(const QStringList &arguments, QString *errorString) } /*! + \internal +*/ +void IPlugin::tryCreateObjects() +{ + d->tryCreateObjects(); +} + +/*! Registers a function object that creates a test object. The created objects are meant to be passed on to \l QTest::qExec(). |