diff options
author | Brett Stottlemyer <bstottle@ford.com> | 2019-05-06 08:24:42 -0400 |
---|---|---|
committer | Brett Stottlemyer <bstottle@ford.com> | 2019-05-07 00:15:38 +0000 |
commit | c96a4193e5d4d46804e8a11fad3b0e95d02b037b (patch) | |
tree | 23eef377dd09e14c12262837645e1aca3a207662 /tools/repc/repcodegenerator.cpp | |
parent | d52f983698f0d6239938dd748e30d98394fd2946 (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.cpp | 50 |
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 |