summaryrefslogtreecommitdiffstats
path: root/tools/repc/repcodegenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/repc/repcodegenerator.cpp')
-rw-r--r--tools/repc/repcodegenerator.cpp29
1 files changed, 26 insertions, 3 deletions
diff --git a/tools/repc/repcodegenerator.cpp b/tools/repc/repcodegenerator.cpp
index fdb27d7..001103c 100644
--- a/tools/repc/repcodegenerator.cpp
+++ b/tools/repc/repcodegenerator.cpp
@@ -205,6 +205,7 @@ void RepCodeGenerator::generate(const AST &ast, Mode mode, QString fileName)
for (const ASTClass &astClass : ast.classes) {
QSet<QString> classMetaTypes;
+ QSet<QString> pendingMetaTypes;
for (const ASTProperty &property : astClass.properties) {
if (property.isPointer)
continue;
@@ -212,6 +213,7 @@ void RepCodeGenerator::generate(const AST &ast, Mode mode, QString fileName)
}
const auto extractClassMetaTypes = [&](const ASTFunction &function) {
classMetaTypes << function.returnType;
+ pendingMetaTypes << function.returnType;
for (const ASTDeclaration &decl : function.params) {
classMetaTypes << decl.type;
}
@@ -220,15 +222,19 @@ void RepCodeGenerator::generate(const AST &ast, Mode mode, QString fileName)
extractClassMetaTypes(function);
for (const ASTFunction &function : astClass.slotsList)
extractClassMetaTypes(function);
- QString classMetaTypeRegistrationCode = metaTypeRegistrationCode + generateMetaTypeRegistration(classMetaTypes);
+
+ const QString classMetaTypeRegistrationCode = metaTypeRegistrationCode
+ + generateMetaTypeRegistration(classMetaTypes);
+ const QString replicaMetaTypeRegistrationCode = classMetaTypeRegistrationCode
+ + generateMetaTypeRegistrationForPending(pendingMetaTypes);
if (mode == MERGED) {
- generateClass(REPLICA, stream, astClass, classMetaTypeRegistrationCode);
+ generateClass(REPLICA, stream, astClass, replicaMetaTypeRegistrationCode);
generateClass(SOURCE, stream, astClass, classMetaTypeRegistrationCode);
generateClass(SIMPLE_SOURCE, stream, astClass, classMetaTypeRegistrationCode);
generateSourceAPI(stream, astClass);
} else {
- generateClass(mode, stream, astClass, classMetaTypeRegistrationCode);
+ generateClass(mode, stream, astClass, mode == REPLICA ? replicaMetaTypeRegistrationCode : classMetaTypeRegistrationCode);
if (mode == SOURCE) {
generateClass(SIMPLE_SOURCE, stream, astClass, classMetaTypeRegistrationCode);
generateSourceAPI(stream, astClass);
@@ -564,6 +570,23 @@ QString RepCodeGenerator::generateMetaTypeRegistration(const QSet<QString> &meta
return out;
}
+QString RepCodeGenerator::generateMetaTypeRegistrationForPending(const QSet<QString> &metaTypes)
+{
+ QString out;
+ if (!metaTypes.isEmpty())
+ out += QLatin1String(" qRegisterMetaType<QRemoteObjectPendingCall>();\n");
+ const QString qRegisterMetaType = QStringLiteral(" qRegisterMetaType<QRemoteObjectPendingReply<%1>>();\n");
+ const QString qRegisterConverterConditional = QStringLiteral(" if (!QMetaType::hasRegisteredConverterFunction<QRemoteObjectPendingReply<%1>, QRemoteObjectPendingCall>())\n");
+ const QString qRegisterConverter = QStringLiteral(" QMetaType::registerConverter<QRemoteObjectPendingReply<%1>, QRemoteObjectPendingCall>();\n");
+ for (const QString &metaType : metaTypes) {
+ out += qRegisterMetaType.arg(metaType);
+ out += qRegisterConverterConditional.arg(metaType);
+ out += qRegisterConverter.arg(metaType);
+ }
+ return out;
+}
+
+
QString RepCodeGenerator::generateMetaTypeRegistrationForEnums(const QVector<QString> &enumUses)
{
QString out;