summaryrefslogtreecommitdiffstats
path: root/tools/repc/repcodegenerator.cpp
diff options
context:
space:
mode:
authorBrett Stottlemyer <bstottle@ford.com>2019-05-06 08:24:42 -0400
committerBrett Stottlemyer <bstottle@ford.com>2019-05-07 00:15:38 +0000
commitc96a4193e5d4d46804e8a11fad3b0e95d02b037b (patch)
tree23eef377dd09e14c12262837645e1aca3a207662 /tools/repc/repcodegenerator.cpp
parentd52f983698f0d6239938dd748e30d98394fd2946 (diff)
Fix dynamic enums in Props and Signals
These worked with repc generated types, but can fail when going to dynamic types (such as going through a proxy). This also makes two changes to help with this change: It adds a #define to dump what is sent for dynamic type info for initialization (for debugging the protocol itself) and changes the repc regexes so that a single character enum name can be used (previously the parsing would fail if the unless the name was at least two characters). Change-Id: Ied7219c60a901ef0cb00e06ef44001c6d077af89 Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'tools/repc/repcodegenerator.cpp')
-rw-r--r--tools/repc/repcodegenerator.cpp50
1 files changed, 41 insertions, 9 deletions
diff --git a/tools/repc/repcodegenerator.cpp b/tools/repc/repcodegenerator.cpp
index 3d55fa9..870033c 100644
--- a/tools/repc/repcodegenerator.cpp
+++ b/tools/repc/repcodegenerator.cpp
@@ -1179,14 +1179,31 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
out << QStringLiteral(" {") << endl;
if (signalCount+changedCount > 0) {
out << QStringLiteral(" switch (index) {") << endl;
- for (int i = 0; i < changedCount; ++i)
- out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2Changed(%3)\");")
- .arg(QString::number(i), onChangeProperties.at(i).name, typeForMode(onChangeProperties.at(i), SOURCE)) << endl;
+ for (int i = 0; i < changedCount; ++i) {
+ const ASTProperty &prop = onChangeProperties.at(i);
+ if (isClassEnum(astClass, prop.type))
+ out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2Changed($1)\").replace(\"$1\", QtPrivate::qtro_enum_signature<ObjectType>(\"%3\"));")
+ .arg(QString::number(i), prop.name, prop.type) << endl;
+ else
+ out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2Changed(%3)\");")
+ .arg(QString::number(i), prop.name, typeForMode(prop, SOURCE)) << endl;
+ }
for (int i = 0; i < signalCount; ++i)
{
const ASTFunction &sig = astClass.signalsList.at(i);
- out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2(%3)\");")
- .arg(QString::number(i+changedCount), sig.name, sig.paramsAsString(ASTFunction::Normalized)) << endl;
+ auto paramsAsString = sig.paramsAsString(ASTFunction::Normalized);
+ const auto paramsAsList = paramsAsString.split(QLatin1String(","));
+ int enumCount = 0;
+ QString enumString;
+ for (int j = 0; j < paramsAsList.count(); j++) {
+ auto const p = paramsAsList.at(j);
+ if (isClassEnum(astClass, p)) {
+ paramsAsString.replace(paramsAsString.indexOf(p), p.size(), QStringLiteral("$%1").arg(enumCount));
+ enumString.append(QString::fromLatin1(".replace(\"$%1\", QtPrivate::qtro_enum_signature<ObjectType>(\"%2\"))").arg(enumCount++).arg(paramsAsList.at(j)));
+ }
+ }
+ out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2(%3)\")%4;")
+ .arg(QString::number(i+changedCount), sig.name, paramsAsString, enumString) << endl;
}
out << QStringLiteral(" }") << endl;
} else
@@ -1210,14 +1227,29 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
for (int i = 0; i < pushCount; ++i)
{
const ASTProperty &prop = pushProps.at(i);
- out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"push%2(%3)\");")
- .arg(QString::number(i), cap(prop.name), prop.type) << endl;
+ if (isClassEnum(astClass, prop.type))
+ out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"push%2($1)\").replace(\"$1\", QtPrivate::qtro_enum_signature<ObjectType>(\"%3\"));")
+ .arg(QString::number(i), prop.name, prop.type) << endl;
+ else
+ out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"push%2(%3)\");")
+ .arg(QString::number(i), cap(prop.name), prop.type) << endl;
}
for (int i = 0; i < slotCount; ++i)
{
const ASTFunction &slot = astClass.slotsList.at(i);
- out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2(%3)\");")
- .arg(QString::number(i+pushCount), slot.name, slot.paramsAsString(ASTFunction::Normalized)) << endl;
+ auto paramsAsString = slot.paramsAsString(ASTFunction::Normalized);
+ const auto paramsAsList = paramsAsString.split(QLatin1String(","));
+ int enumCount = 0;
+ QString enumString;
+ for (int j = 0; j < paramsAsList.count(); j++) {
+ auto const p = paramsAsList.at(j);
+ if (isClassEnum(astClass, p)) {
+ paramsAsString.replace(paramsAsString.indexOf(p), p.size(), QStringLiteral("$%1").arg(enumCount));
+ enumString.append(QString::fromLatin1(".replace(\"$%1\", QtPrivate::qtro_enum_signature<ObjectType>(\"%2\"))").arg(enumCount++).arg(paramsAsList.at(j)));
+ }
+ }
+ out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2(%3)\")%4;")
+ .arg(QString::number(i+pushCount), slot.name, paramsAsString, enumString) << endl;
}
out << QStringLiteral(" }") << endl;
} else