summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMichael Brasser <mbrasser@ford.com>2017-12-06 15:43:54 -0600
committerMichael Brasser <michael.brasser@live.com>2017-12-08 01:15:26 +0000
commit46d08d0b39fd4b6f5a5c560be1ca922462693fd9 (patch)
treef4f33f0f245bc60d619a691d1ec5760d618ae5e1 /tools
parenta31ecd3def385475a8dda8166fec454fb8092ae9 (diff)
Correctly handle class enum signal parameters
Fully qualify class enums when used as signal parameters. Change-Id: I5338b468b55cefd362d3c90e808969dfd1f3afd0 Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/repc/repcodegenerator.cpp35
1 files changed, 29 insertions, 6 deletions
diff --git a/tools/repc/repcodegenerator.cpp b/tools/repc/repcodegenerator.cpp
index f9cc9d5..7dba030 100644
--- a/tools/repc/repcodegenerator.cpp
+++ b/tools/repc/repcodegenerator.cpp
@@ -83,6 +83,21 @@ static QString fullyQualifiedTypeName(const ASTClass& classContext, const QStrin
return typeName;
}
+// for enums we need to transform signal/slot arguments to include the class scope
+static QVector<ASTFunction> transformEnumParams(const ASTClass& classContext, const QVector<ASTFunction> &methodList, const QString &typeName) {
+ QVector<ASTFunction> localList = methodList;
+ for (ASTFunction &astFunction : localList) {
+ for (ASTDeclaration &astParam : astFunction.params) {
+ for (const ASTEnum &astEnum : classContext.enums) {
+ if (astEnum.name == astParam.type) {
+ astParam.type = typeName + QStringLiteral("::") + astParam.type;
+ }
+ }
+ }
+ }
+ return localList;
+}
+
/*
Returns \c true if the type is a built-in type.
*/
@@ -771,7 +786,8 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
out << " void " << property.name << "Changed(" << fullyQualifiedTypeName(astClass, className, property.type) << " " << property.name << ");" << endl;
}
- Q_FOREACH (const ASTFunction &signal, astClass.signalsList)
+ QVector<ASTFunction> signalsList = transformEnumParams(astClass, astClass.signalsList, className);
+ Q_FOREACH (const ASTFunction &signal, signalsList)
out << " void " << signal.name << "(" << signal.paramsAsString() << ");" << endl;
}
bool hasWriteSlots = false;
@@ -930,11 +946,13 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
out << QString::fromLatin1(" m_signals[%1] = QtPrivate::qtro_signal_index<ObjectType>(&ObjectType::%2, "
"static_cast<void (QObject::*)()>(0),m_signalArgCount+%4,&m_signalArgTypes[%4]);")
.arg(i+1).arg(changeSignals.at(i)).arg(i) << endl;
+
+ QVector<ASTFunction> signalsList = transformEnumParams(astClass, astClass.signalsList, QStringLiteral("typename ObjectType"));
for (int i = 0; i < signalCount; ++i) {
- const ASTFunction &sig = astClass.signalsList.at(i);
+ const ASTFunction &sig = signalsList.at(i);
out << QString::fromLatin1(" m_signals[%1] = QtPrivate::qtro_signal_index<ObjectType>(&ObjectType::%2, "
"static_cast<void (QObject::*)(%3)>(0),m_signalArgCount+%4,&m_signalArgTypes[%4]);")
- .arg(QString::number(changedCount+i+1), sig.name, sig.paramsAsString(ASTFunction::Normalized), QString::number(i)) << endl;
+ .arg(QString::number(changedCount+i+1), sig.name, sig.paramsAsString(ASTFunction::Normalized), QString::number(changedCount+i)) << endl;
}
const int slotCount = astClass.slotsList.count();
QVector<ASTProperty> pushProps;
@@ -952,11 +970,16 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
"static_cast<void (QObject::*)(%3)>(0),\"push%2(%3)\",m_methodArgCount+%4,&m_methodArgTypes[%4]);")
.arg(QString::number(i+1), cap(prop.name), propTypeName, QString::number(i)) << endl;
}
+
+ QVector<ASTFunction> slotsList = transformEnumParams(astClass, astClass.slotsList, QStringLiteral("typename ObjectType"));
for (int i = 0; i < slotCount; ++i) {
- const ASTFunction &slot = astClass.slotsList.at(i);
+ const ASTFunction &slot = slotsList.at(i);
+ const QString params = slot.paramsAsString(ASTFunction::Normalized);
out << QString::fromLatin1(" m_methods[%1] = QtPrivate::qtro_method_index<ObjectType>(&ObjectType::%2, "
- "static_cast<void (QObject::*)(%3)>(0),\"%2(%3)\",m_methodArgCount+%4,&m_methodArgTypes[%4]);")
- .arg(QString::number(i+pushCount+1), slot.name, slot.paramsAsString(ASTFunction::Normalized), QString::number(i+pushCount)) << endl;
+ "static_cast<void (QObject::*)(%3)>(0),\"%2(%4)\",m_methodArgCount+%5,&m_methodArgTypes[%5]);")
+ .arg(QString::number(i+pushCount+1), slot.name, params,
+ QString(params).remove(QStringLiteral("typename ObjectType::")), // we don't want this in the string signature
+ QString::number(i+pushCount)) << endl;
}
const int modelCount = astClass.models.count();
out << QString::fromLatin1(" m_modelCount = %1;").arg(modelCount) << endl;