summaryrefslogtreecommitdiff
path: root/src/libs/extensionsystem/iplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/extensionsystem/iplugin.cpp')
-rw-r--r--src/libs/extensionsystem/iplugin.cpp53
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().