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.cpp318
1 files changed, 129 insertions, 189 deletions
diff --git a/tools/repc/repcodegenerator.cpp b/tools/repc/repcodegenerator.cpp
index 00cc481..8f8cfb3 100644
--- a/tools/repc/repcodegenerator.cpp
+++ b/tools/repc/repcodegenerator.cpp
@@ -201,8 +201,11 @@ void RepCodeGenerator::generate(const AST &ast, Mode mode, QString fileName)
metaTypes << attribute.type;
}
Q_FOREACH (const ASTClass &astClass, ast.classes) {
- Q_FOREACH (const ASTProperty &property, astClass.properties)
+ Q_FOREACH (const ASTProperty &property, astClass.properties) {
+ if (property.isPointer)
+ continue;
metaTypes << property.type;
+ }
Q_FOREACH (const ASTFunction &function, astClass.signalsList + astClass.slotsList) {
metaTypes << function.returnType;
Q_FOREACH (const ASTDeclaration &decl, function.params) {
@@ -248,7 +251,7 @@ void RepCodeGenerator::generateHeader(Mode mode, QTextStream &out, const AST &as
bool hasModel = false;
for (auto c : ast.classes)
{
- if (c.models.count() > 0)
+ if (c.modelMetadata.count() > 0)
{
hasModel = true;
break;
@@ -362,6 +365,25 @@ QString RepCodeGenerator::formatMarshallingOperators(const POD &pod)
;
}
+QString RepCodeGenerator::typeForMode(const ASTProperty &property, RepCodeGenerator::Mode mode)
+{
+ if (!property.isPointer)
+ return property.type;
+
+ if (property.type.startsWith(QStringLiteral("QAbstractItemModel")))
+ return mode == REPLICA ? property.type + QStringLiteral("Replica*") : property.type + QStringLiteral("*");
+
+ switch (mode) {
+ case REPLICA: return property.type + QStringLiteral("Replica*");
+ case SIMPLE_SOURCE:
+ Q_FALLTHROUGH();
+ case SOURCE: return property.type + QStringLiteral("Source*");
+ default: qCritical("Invalid mode");
+ }
+
+ return QStringLiteral("InvalidPropertyName");
+}
+
void RepCodeGenerator::generateSimpleSetter(QTextStream &out, const ASTProperty &property, bool generateOverride)
{
out << " virtual void set" << cap(property.name) << "(" << property.type << " " << property.name << ")";
@@ -594,20 +616,21 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
if (mode != SIMPLE_SOURCE) {
out << " Q_CLASSINFO(QCLASSINFO_REMOTEOBJECT_TYPE, \"" << astClass.name << "\")" << endl;
out << " Q_CLASSINFO(QCLASSINFO_REMOTEOBJECT_SIGNATURE, \"" << QLatin1String(classSignature(astClass)) << "\")" << endl;
- for (int i = 0; i < astClass.models.count(); i++) {
- const auto model = astClass.models.at(i);
+ for (int i = 0; i < astClass.modelMetadata.count(); i++) {
+ const auto model = astClass.modelMetadata.at(i);
+ const auto modelName = astClass.properties.at(model.propertyIndex).name;
if (!model.roles.isEmpty()) {
QStringList list;
for (auto role : model.roles)
list << role.name;
- out << QString::fromLatin1(" Q_CLASSINFO(\"%1_ROLES\", \"%2\")").arg(model.name.toUpper(), list.join(QChar::fromLatin1('|'))) << endl;
+ out << QString::fromLatin1(" Q_CLASSINFO(\"%1_ROLES\", \"%2\")").arg(modelName.toUpper(), list.join(QChar::fromLatin1('|'))) << endl;
}
}
//First output properties
Q_FOREACH (const ASTProperty &property, astClass.properties) {
- out << " Q_PROPERTY(" << property.type << " " << property.name << " READ " << property.name;
+ out << " Q_PROPERTY(" << typeForMode(property, mode) << " " << property.name << " READ " << property.name;
if (property.modifier == ASTProperty::Constant)
out << " CONSTANT";
else if (property.modifier == ASTProperty::ReadOnly)
@@ -622,18 +645,6 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
}
out << ")" << endl;
}
- for (auto model : astClass.models) {
- if (mode == REPLICA)
- out << QString::fromLatin1(" Q_PROPERTY(QAbstractItemModelReplica *%1 READ %1 NOTIFY %1Changed)").arg(model.name) << endl;
- else
- out << QString::fromLatin1(" Q_PROPERTY(QAbstractItemModel *%1 READ %1 CONSTANT)").arg(model.name) << endl;
- }
- for (auto child : astClass.children) {
- if (mode == REPLICA)
- out << QString::fromLatin1(" Q_PROPERTY(%1Replica *%2 READ %2 NOTIFY %2Changed)").arg(child.type, child.name) << endl;
- else
- out << QString::fromLatin1(" Q_PROPERTY(%1Source *%2 READ %2 CONSTANT)").arg(child.type, child.name) << endl;
- }
if (!astClass.enums.isEmpty()) {
out << "" << endl;
@@ -659,47 +670,42 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
out << " }" << endl;
- if (!astClass.models.isEmpty() || !astClass.children.isEmpty())
+ if (astClass.hasPointerObjects())
{
out << " void setNode(QRemoteObjectNode *node) override" << endl;
out << " {" << endl;
- for (auto model : astClass.models) {
- out << QString::fromLatin1(" m_%1.reset(node->acquireModel(\"Model::%1\"));")
- .arg(model.name) << endl;
- out << " emit " << model.name << "Changed();" << endl;
- }
- for (auto child : astClass.children) {
- out << QString::fromLatin1(" m_%1.reset(node->acquire<%2Replica>(\"Class::%1\"));")
- .arg(child.name, child.type) << endl;
- out << " emit " << child.name << "Changed();" << endl;
- }
- if (!astClass.children.isEmpty()) {
- out << " // This relies on finalize being called before any other slots connected to initialized to ensure" << endl;
- out << " // any child replicas that don't have sources are null instead of the replica defaults." << endl;
- out << " connect(this, &" << className << "::initialized, [this]() { finalize(); });" << endl;
- }
out << " QRemoteObjectReplica::setNode(node);" << endl;
+ for (int index = 0; index < astClass.properties.count(); ++index) {
+ const ASTProperty &property = astClass.properties.at(index);
+ if (!property.isPointer)
+ continue;
+ if (astClass.subClassPropertyIndices.contains(index))
+ out << QString::fromLatin1(" setChild(%1, QVariant::fromValue(node->acquire<%2Replica>(\"Class::%3\")));")
+ .arg(QString::number(index), property.type, property.name) << endl;
+ else
+ out << QString::fromLatin1(" setChild(%1, QVariant::fromValue(node->acquireModel(\"Model::%2\")));")
+ .arg(QString::number(index), property.name) << endl;
+ }
out << " }" << endl;
}
out << "" << endl;
out << "private:" << endl;
out << " " << className << "(QRemoteObjectNode *node, const QString &name = QString())" << endl;
out << " : QRemoteObjectReplica(ConstructWithNode)" << endl;
- for (auto model : astClass.models)
- out << QString::fromLatin1(" , m_%1(node->acquireModel(\"Model::%1\"))")
- .arg(model.name) << endl;
- for (auto child : astClass.children)
- out << QString::fromLatin1(" , m_%1(node->acquire<%2Replica>(\"Class::%1\"))")
- .arg(child.name, child.type) << endl;
- if (astClass.children.count()) {
- out << " {" << endl;
- out << " // This relies on finalize being called before any other slots connected to initialized to ensure" << endl;
- out << " // any child replicas that don't have sources are null instead of the replica defaults." << endl;
- out << " connect(this, &" << className << "::initialized, [this]() { finalize(); });" << endl;
- out << " initializeNode(node, name);" << endl;
- out << " }" << endl;
- } else
- out << " { initializeNode(node, name); }" << endl;
+ out << " {" << endl;
+ out << " initializeNode(node, name);" << endl;
+ for (int index = 0; index < astClass.properties.count(); ++index) {
+ const ASTProperty &property = astClass.properties.at(index);
+ if (!property.isPointer)
+ continue;
+ if (astClass.subClassPropertyIndices.contains(index))
+ out << QString::fromLatin1(" setChild(%1, QVariant::fromValue(node->acquire<%2Replica>(\"Class::%3\")));")
+ .arg(QString::number(index), property.type, property.name) << endl;
+ else
+ out << QString::fromLatin1(" setChild(%1, QVariant::fromValue(node->acquireModel(\"Model::%2\")));")
+ .arg(QString::number(index), property.name) << endl;
+ }
+ out << " }" << endl;
out << "" << endl;
@@ -709,7 +715,10 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
out << " QVariantList properties;" << endl;
out << " properties.reserve(" << astClass.properties.size() << ");" << endl;
Q_FOREACH (const ASTProperty &property, astClass.properties) {
- out << " properties << QVariant::fromValue(" << property.type << "(" << property.defaultValue << "));" << endl;
+ if (property.isPointer)
+ out << " properties << QVariant::fromValue((" << typeForMode(property, mode) << ")" << property.defaultValue << ");" << endl;
+ else
+ out << " properties << QVariant::fromValue(" << typeForMode(property, mode) << "(" << property.defaultValue << "));" << endl;
}
int nPersisted = 0;
if (astClass.hasPersisted) {
@@ -725,46 +734,37 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
}
out << " setProperties(properties);" << endl;
out << " }" << endl;
+ } else if (mode == SOURCE) {
+ out << " explicit " << className << "(QObject *parent = nullptr) : QObject(parent)" << endl;
+ out << " {" << endl;
+ if (!metaTypeRegistrationCode.isEmpty())
+ out << metaTypeRegistrationCode << endl;
+ out << " }" << endl;
} else {
- if ( (astClass.models.isEmpty() && astClass.children.isEmpty()) || mode == SOURCE) {
- if (mode == SOURCE)
- out << " explicit " << className << "(QObject *parent = nullptr) : QObject(parent)" << endl;
- else
- out << " explicit " << className << "(QObject *parent = nullptr) : " << astClass.name << "Source(parent)" << endl;
+ QVector<int> constIndices;
+ for (int index = 0; index < astClass.properties.count(); ++index) {
+ const ASTProperty &property = astClass.properties.at(index);
+ if (property.modifier == ASTProperty::Constant)
+ constIndices.append(index);
+ }
+ if (constIndices.isEmpty()) {
+ out << " explicit " << className << "(QObject *parent = nullptr) : " << astClass.name << "Source(parent)" << endl;
} else {
- int childIndex = 0;
- if (astClass.models.count())
- out << " explicit " << className << "(QAbstractItemModel *model0";
- else {
- out << " explicit " << className << "(" << astClass.children.at(0).type << "Source *sub0";
- childIndex = 1;
- }
- for (int i = 1; i < astClass.models.count(); i++)
- out << QString::fromLatin1(", QAbstractItemModel *model%1").arg(QString::number(i));
- for (int i = childIndex; i < astClass.children.count(); i++)
- out << QString::fromLatin1(", %1Source *sub%2").arg(astClass.children.at(childIndex).type, QString::number(i));
- out << ", QObject *parent = nullptr) : " << astClass.name << "Source(parent)" << endl;
- for (int i = 0; i < astClass.models.count(); i++)
- {
- out << " , m_" << astClass.models[i].name
- << QString::fromLatin1("(model%1)").arg(QString::number(i)) << endl;
- }
- for (int i = 0; i < astClass.children.count(); i++)
- {
- out << " , m_" << astClass.children[i].name
- << QString::fromLatin1("(sub%1)").arg(QString::number(i)) << endl;
+ QStringList parameters;
+ for (int index : constIndices) {
+ const ASTProperty &property = astClass.properties.at(index);
+ parameters.append(QString::fromLatin1("%1 %2 = %3").arg(typeForMode(property, SOURCE), property.name, property.defaultValue));
}
+ parameters.append(QStringLiteral("QObject *parent = nullptr"));
+ out << " explicit " << className << "(" << parameters.join(QStringLiteral(", ")) << ") : " << astClass.name << "Source(parent)" << endl;
}
-
- if (mode == SIMPLE_SOURCE) {
- Q_FOREACH (const ASTProperty &property, astClass.properties) {
+ Q_FOREACH (const ASTProperty &property, astClass.properties) {
+ if (property.modifier == ASTProperty::Constant)
+ out << " , m_" << property.name << "(" << property.name << ")" << endl;
+ else
out << " , m_" << property.name << "(" << property.defaultValue << ")" << endl;
- }
}
-
out << " {" << endl;
- if (mode != SIMPLE_SOURCE && !metaTypeRegistrationCode.isEmpty())
- out << metaTypeRegistrationCode << endl;
out << " }" << endl;
}
@@ -793,13 +793,14 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
if (mode == REPLICA) {
int i = 0;
Q_FOREACH (const ASTProperty &property, astClass.properties) {
- out << " " << property.type << " " << property.name << "() const" << endl;
+ auto type = typeForMode(property, mode);
+ out << " " << type << " " << property.name << "() const" << endl;
out << " {" << endl;
out << " const QVariant variant = propAsVariant(" << i << ");" << endl;
- out << " if (!variant.canConvert<" << property.type << ">()) {" << endl;
- out << " qWarning() << \"QtRO cannot convert the property " << property.name << " to type " << property.type << "\";" << endl;
+ out << " if (!variant.canConvert<" << type << ">()) {" << endl;
+ out << " qWarning() << \"QtRO cannot convert the property " << property.name << " to type " << type << "\";" << endl;
out << " }" << endl;
- out << " return variant.value<" << property.type << " >();" << endl;
+ out << " return variant.value<" << type << " >();" << endl;
out << " }" << endl;
i++;
if (property.modifier == ASTProperty::ReadWrite) {
@@ -816,16 +817,16 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
}
} else if (mode == SOURCE) {
Q_FOREACH (const ASTProperty &property, astClass.properties)
- out << " virtual " << property.type << " " << property.name << "() const = 0;" << endl;
+ out << " virtual " << typeForMode(property, mode) << " " << property.name << "() const = 0;" << endl;
Q_FOREACH (const ASTProperty &property, astClass.properties) {
if (property.modifier == ASTProperty::ReadWrite ||
property.modifier == ASTProperty::ReadPush)
out << " virtual void set" << cap(property.name) << "(" << property.type << " " << property.name << ") = 0;" << endl;
}
} else {
- Q_FOREACH (const ASTProperty &property, astClass.properties) {
- out << " virtual " << property.type << " " << property.name << "() const override { return m_" << property.name << "; }" << endl;
- }
+ Q_FOREACH (const ASTProperty &property, astClass.properties)
+ out << " " << typeForMode(property, mode) << " " << property.name << "() const override { return m_"
+ << property.name << "; }" << endl;
Q_FOREACH (const ASTProperty &property, astClass.properties) {
if (property.modifier == ASTProperty::ReadWrite ||
property.modifier == ASTProperty::ReadPush) {
@@ -834,42 +835,6 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
}
}
- if (!astClass.models.isEmpty()) {
- Q_FOREACH (const ASTModel &model, astClass.models) {
- if (mode != SOURCE) {
- if (mode == REPLICA)
- out << " QAbstractItemModelReplica *" << model.name << "()" << endl;
- else
- out << " QAbstractItemModel *" << model.name << "() override" << endl;
- out << " {" << endl;
- out << " return m_" << model.name << ".data();" << endl;
- out << " }" << endl;
- } else {
- out << " virtual QAbstractItemModel *" << model.name << "() = 0;" << endl;
- }
- }
- }
-
- if (!astClass.children.isEmpty()) {
- Q_FOREACH (const ASTChildRep &child, astClass.children) {
- if (mode != SOURCE) {
- if (mode == REPLICA) {
- out << " " << child.type << "Replica *" << child.name << "()" << endl;
- out << " {" << endl;
- out << " return m_" << child.name << ".data();" << endl;
- out << " }" << endl;
- } else {
- out << " " << child.type << "Source *" << child.name << "() override" << endl;
- out << " {" << endl;
- out << " return m_" << child.name << ";" << endl;
- out << " }" << endl;
- }
- } else {
- out << " virtual " << child.type << "Source *" << child.name << "() = 0;" << endl;
- }
- }
- }
-
if (mode != SIMPLE_SOURCE) {
//Next output property signals
if (!astClass.properties.isEmpty() || !astClass.signalsList.isEmpty()) {
@@ -877,23 +842,12 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
out << "Q_SIGNALS:" << endl;
Q_FOREACH (const ASTProperty &property, astClass.properties) {
if (property.modifier != ASTProperty::Constant)
- out << " void " << property.name << "Changed(" << fullyQualifiedTypeName(astClass, className, property.type) << " " << property.name << ");" << endl;
+ out << " void " << property.name << "Changed(" << fullyQualifiedTypeName(astClass, className, typeForMode(property, mode)) << " " << property.name << ");" << endl;
}
QVector<ASTFunction> signalsList = transformEnumParams(astClass, astClass.signalsList, className);
Q_FOREACH (const ASTFunction &signal, signalsList)
out << " void " << signal.name << "(" << signal.paramsAsString() << ");" << endl;
- for (auto model : astClass.models)
- out << " void " << model.name << "Changed();" << endl;
- for (auto child : astClass.children)
- out << " void " << child.name << "Changed();" << endl;
- } else if (!astClass.models.isEmpty() || !astClass.children.isEmpty()) {
- out << "" << endl;
- out << "Q_SIGNALS:" << endl;
- for (auto model : astClass.models)
- out << " void " << model.name << "Changed();" << endl;
- for (auto child : astClass.children)
- out << " void " << child.name << "Changed();" << endl;
}
bool hasWriteSlots = false;
Q_FOREACH (const ASTProperty &property, astClass.properties) {
@@ -972,32 +926,8 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
//Next output data members
if (mode == SIMPLE_SOURCE) {
- Q_FOREACH (const ASTModel &model, astClass.models)
- out << " QScopedPointer<QAbstractItemModel> m_" << model.name << ";" << endl;
- Q_FOREACH (const ASTChildRep &child, astClass.children)
- out << " " << child.type << "Source *m_" << child.name << ";" << endl;
-
- if (!astClass.properties.isEmpty()) {
- Q_FOREACH (const ASTProperty &property, astClass.properties) {
- out << " " << property.type << " " << "m_" << property.name << ";" << endl;
- }
- }
- } else if (mode == REPLICA) {
- if (astClass.children.count()) {
- out << " void finalize()" << endl;
- out << " {" << endl;
- Q_FOREACH (const ASTChildRep &child, astClass.children) {
- out << " if (!m_" << child.name << "->isInitialized()) {" << endl;
- out << " m_" << child.name << ".reset(nullptr);" << endl;
- out << " emit " << child.name << "Changed();" << endl;
- out << " }" << endl;
- }
- out << " }" << endl << endl;
- }
- Q_FOREACH (const ASTModel &model, astClass.models)
- out << " QScopedPointer<QAbstractItemModelReplica> m_" << model.name << ";" << endl;
- Q_FOREACH (const ASTChildRep &child, astClass.children)
- out << " QScopedPointer<" << child.type << "Replica> m_" << child.name << ";" << endl;
+ Q_FOREACH (const ASTProperty &property, astClass.properties)
+ out << " " << typeForMode(property, SOURCE) << " " << "m_" << property.name << ";" << endl;
}
if (mode != SIMPLE_SOURCE)
@@ -1029,13 +959,18 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
// Include enum definition in SourceAPI
generateDeclarationsForEnums(out, astClass.enums, false);
}
- out << QString::fromLatin1(" %1(ObjectType *object)").arg(className) << endl;
- out << QStringLiteral(" : SourceApiMap()") << endl;
+ out << QString::fromLatin1(" %1(ObjectType *object, const QString &name = QStringLiteral(\"%2\"))").arg(className, astClass.name) << endl;
+ out << QStringLiteral(" : SourceApiMap(), m_name(name)") << endl;
out << QStringLiteral(" {") << endl;
- if (astClass.models.isEmpty() && astClass.children.isEmpty())
+ if (!astClass.hasPointerObjects())
out << QStringLiteral(" Q_UNUSED(object);") << endl;
const int enumCount = astClass.enums.count();
+ for (int i : astClass.subClassPropertyIndices) {
+ const ASTProperty &child = astClass.properties.at(i);
+ out << QString::fromLatin1(" using %1_type_t = typename std::remove_pointer<decltype(object->%1())>::type;")
+ .arg(child.name) << endl;
+ }
out << QString::fromLatin1(" m_enums[0] = %1;").arg(enumCount) << endl;
for (int i = 0; i < enumCount; ++i) {
const auto enumerator = astClass.enums.at(i);
@@ -1044,11 +979,11 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
}
const int propCount = astClass.properties.count();
out << QString::fromLatin1(" m_properties[0] = %1;").arg(propCount) << endl;
- QStringList changeSignals;
+ QList<ASTProperty> onChangeProperties;
QList<int> propertyChangeIndex;
for (int i = 0; i < propCount; ++i) {
const ASTProperty &prop = astClass.properties.at(i);
- const QString propTypeName = fullyQualifiedTypeName(astClass, QStringLiteral("typename ObjectType"), prop.type);
+ const QString propTypeName = fullyQualifiedTypeName(astClass, QStringLiteral("typename ObjectType"), typeForMode(prop, SOURCE));
out << QString::fromLatin1(" m_properties[%1] = QtPrivate::qtro_property_index<ObjectType>(&ObjectType::%2, "
"static_cast<%3 (QObject::*)()>(0),\"%2\");")
.arg(QString::number(i+1), prop.name, propTypeName) << endl;
@@ -1058,17 +993,19 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
if (prop.modifier != prop.Constant) { //Make sure we have an onChange signal
out << QStringLiteral(" QtPrivate::qtro_method_test<ObjectType>(&ObjectType::%1Changed, static_cast<void (QObject::*)()>(0));")
.arg(prop.name) << endl;
- changeSignals << QString::fromLatin1("%1Changed").arg(prop.name);
+ onChangeProperties << prop;
propertyChangeIndex << i + 1; //m_properties[0] is the count, so index is one higher
}
}
const int signalCount = astClass.signalsList.count();
- const int changedCount = changeSignals.size();
- out << QString::fromLatin1(" m_signals[0] = %1;").arg(signalCount+changeSignals.size()) << endl;
+ const int changedCount = onChangeProperties.size();
+ out << QString::fromLatin1(" m_signals[0] = %1;").arg(signalCount+onChangeProperties.size()) << endl;
for (int i = 0; i < changedCount; ++i)
- 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;
+ out << QString::fromLatin1(" m_signals[%1] = QtPrivate::qtro_signal_index<ObjectType>(&ObjectType::%2Changed, "
+ "static_cast<void (QObject::*)(%3)>(0),m_signalArgCount+%4,&m_signalArgTypes[%4]);")
+ .arg(QString::number(i+1), onChangeProperties.at(i).name,
+ fullyQualifiedTypeName(astClass, QStringLiteral("typename ObjectType"), onChangeProperties.at(i).type),
+ QString::number(i)) << endl;
QVector<ASTFunction> signalsList = transformEnumParams(astClass, astClass.signalsList, QStringLiteral("typename ObjectType"));
for (int i = 0; i < signalCount; ++i) {
@@ -1090,8 +1027,10 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
const ASTProperty &prop = pushProps.at(i);
const QString propTypeName = fullyQualifiedTypeName(astClass, QStringLiteral("typename ObjectType"), prop.type);
out << QString::fromLatin1(" m_methods[%1] = QtPrivate::qtro_method_index<ObjectType>(&ObjectType::push%2, "
- "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;
+ "static_cast<void (QObject::*)(%3)>(0),\"push%2(%4)\",m_methodArgCount+%5,&m_methodArgTypes[%5]);")
+ .arg(QString::number(i+1), cap(prop.name), propTypeName,
+ QString(propTypeName).remove(QStringLiteral("typename ObjectType::")), // we don't want this in the string signature
+ QString::number(i)) << endl;
}
QVector<ASTFunction> slotsList = transformEnumParams(astClass, astClass.slotsList, QStringLiteral("typename ObjectType"));
@@ -1104,11 +1043,10 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
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();
- for (int i = 0; i < modelCount; ++i) {
- const ASTModel &model = astClass.models.at(i);
- out << QString::fromLatin1(" m_models << ModelInfo({object->%1(),").arg(model.name) << endl;
- out << QString::fromLatin1(" QStringLiteral(\"%1\"),").arg(model.name) << endl;
+ for (const auto &model : astClass.modelMetadata) {
+ const ASTProperty &property = astClass.properties.at(model.propertyIndex);
+ out << QString::fromLatin1(" m_models << ModelInfo({object->%1(),").arg(property.name) << endl;
+ out << QString::fromLatin1(" QStringLiteral(\"%1\"),").arg(property.name) << endl;
QStringList list;
if (!model.roles.isEmpty()) {
for (auto role : model.roles)
@@ -1116,14 +1054,14 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
}
out << QString::fromLatin1(" QByteArrayLiteral(\"%1\")});").arg(list.join(QChar::fromLatin1('|'))) << endl;
}
- const int subclassCount = astClass.children.count();
- for (int i = 0; i < subclassCount; ++i) {
- const ASTChildRep &child = astClass.children.at(i);
- out << QString::fromLatin1(" m_subclasses << SubclassInfo({object->%1(), QStringLiteral(\"%1\")});").arg(child.name) << endl;
+ for (int i : astClass.subClassPropertyIndices) {
+ const ASTProperty &child = astClass.properties.at(i);
+ out << QString::fromLatin1(" m_subclasses << SubclassInfo{object->%1(), QStringLiteral(\"%1\"), new %2SourceAPI<%1_type_t>(object->%1(), QStringLiteral(\"%1\"))};")
+ .arg(child.name, child.type) << endl;
}
out << QStringLiteral(" }") << endl;
out << QStringLiteral("") << endl;
- out << QString::fromLatin1(" QString name() const override { return QStringLiteral(\"%1\"); }").arg(astClass.name) << endl;
+ out << QString::fromLatin1(" QString name() const override { return m_name; }") << endl;
out << QString::fromLatin1(" QString typeName() const override { return QStringLiteral(\"%1\"); }").arg(astClass.name) << endl;
out << QStringLiteral(" int enumCount() const override { return m_enums[0]; }") << endl;
out << QStringLiteral(" int propertyCount() const override { return m_properties[0]; }") << endl;
@@ -1220,7 +1158,8 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
if (signalCount+changedCount > 0) {
out << QStringLiteral(" switch (index) {") << endl;
for (int i = 0; i < changedCount; ++i)
- out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2()\");").arg(i).arg(changeSignals.at(i)) << endl;
+ out << QString::fromLatin1(" case %1: return QByteArrayLiteral(\"%2Changed(%3)\");")
+ .arg(QString::number(i), onChangeProperties.at(i).name, onChangeProperties.at(i).type) << endl;
for (int i = 0; i < signalCount; ++i)
{
const ASTFunction &sig = astClass.signalsList.at(i);
@@ -1310,6 +1249,7 @@ void RepCodeGenerator::generateSourceAPI(QTextStream &out, const ASTClass &astCl
out << QString::fromLatin1(" int m_properties[%1];").arg(propCount+1) << endl;
out << QString::fromLatin1(" int m_signals[%1];").arg(signalCount+changedCount+1) << endl;
out << QString::fromLatin1(" int m_methods[%1];").arg(methodCount+1) << endl;
+ out << QString::fromLatin1(" const QString m_name;") << endl;
if (signalCount+changedCount > 0) {
out << QString::fromLatin1(" int m_signalArgCount[%1];").arg(signalCount+changedCount) << endl;
out << QString::fromLatin1(" const int* m_signalArgTypes[%1];").arg(signalCount+changedCount) << endl;