diff options
Diffstat (limited to 'src/tools/moc')
-rw-r--r-- | src/tools/moc/generator.cpp | 33 | ||||
-rw-r--r-- | src/tools/moc/generator.h | 1 | ||||
-rw-r--r-- | src/tools/moc/main.cpp | 4 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 10 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 3 | ||||
-rw-r--r-- | src/tools/moc/moc.pro | 1 |
6 files changed, 43 insertions, 9 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 7e1ec3522f..139f7328af 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -218,6 +218,7 @@ void Generator::generateCode() registerFunctionStrings(cdef->slotList); registerFunctionStrings(cdef->methodList); registerFunctionStrings(cdef->constructorList); + registerByteArrayVector(cdef->nonClassSignalList); registerPropertyStrings(); registerEnumStrings(); @@ -602,6 +603,19 @@ void Generator::generateCode() // Generate plugin meta data // generatePluginMetaData(); + +// +// Generate function to make sure the non-class signals exist in the parent classes +// + if (!cdef->nonClassSignalList.isEmpty()) { + fprintf(out, "// If you get a compile error in this function it can be because either\n"); + fprintf(out, "// a) You are using a NOTIFY signal that does not exist. Fix it.\n"); + fprintf(out, "// b) You are using a NOTIFY signal that does exist (in a parent class) but has a non-empty parameter list. This is a moc limitation.\n"); + fprintf(out, "Q_DECL_UNUSED static void checkNotifySignalValidity_%s(%s *t) {\n", qualifiedClassNameIdentifier.constData(), cdef->qualified.constData()); + for (const QByteArray &nonClassSignal : cdef->nonClassSignalList) + fprintf(out, " t->%s();\n", nonClassSignal.constData()); + fprintf(out, "}\n"); + } } @@ -647,6 +661,12 @@ void Generator::registerFunctionStrings(const QVector<FunctionDef>& list) } } +void Generator::registerByteArrayVector(const QVector<QByteArray> &list) +{ + for (const QByteArray &ba : list) + strreg(ba); +} + void Generator::generateFunctions(const QVector<FunctionDef>& list, const char *functype, int type, int ¶msIndex) { if (list.isEmpty()) @@ -840,12 +860,17 @@ void Generator::generateProperties() fprintf(out, "\n // properties: notify_signal_id\n"); for (int i = 0; i < cdef->propertyList.count(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); - if(p.notifyId == -1) + if (p.notifyId == -1) { fprintf(out, " %4d,\n", 0); - else + } else if (p.notifyId > -1) { fprintf(out, " %4d,\n", p.notifyId); + } else { + const int indexInStrings = strings.indexOf(p.notify); + fprintf(out, " %4d,\n", + indexInStrings | IsUnresolvedSignal); + } } } if (cdef->revisionedProperties) { @@ -1399,13 +1424,15 @@ void Generator::generateStaticMetacall() prefix.constData(), p.member.constData(), p.type.constData()); fprintf(out, " %s%s = *reinterpret_cast< %s*>(_v);\n", prefix.constData(), p.member.constData(), p.type.constData()); - if (!p.notify.isEmpty() && p.notifyId != -1) { + if (!p.notify.isEmpty() && p.notifyId > -1) { const FunctionDef &f = cdef->signalList.at(p.notifyId); if (f.arguments.size() == 0) fprintf(out, " Q_EMIT _t->%s();\n", p.notify.constData()); else if (f.arguments.size() == 1 && f.arguments.at(0).normalizedType == p.type) fprintf(out, " Q_EMIT _t->%s(%s%s);\n", p.notify.constData(), prefix.constData(), p.member.constData()); + } else if (!p.notify.isEmpty() && p.notifyId < -1) { + fprintf(out, " Q_EMIT _t->%s();\n", p.notify.constData()); } fprintf(out, " }\n"); fprintf(out, " break;\n"); diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h index 3833148fb3..8b80138302 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -46,6 +46,7 @@ private: void registerClassInfoStrings(); void generateClassInfos(); void registerFunctionStrings(const QVector<FunctionDef> &list); + void registerByteArrayVector(const QVector<QByteArray> &list); void generateFunctions(const QVector<FunctionDef> &list, const char *functype, int type, int ¶msIndex); void generateFunctionRevisions(const QVector<FunctionDef> &list, const char *functype); void generateFunctionParameters(const QVector<FunctionDef> &list, const char *functype); diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp index b30de66258..18945f1ce5 100644 --- a/src/tools/moc/main.cpp +++ b/src/tools/moc/main.cpp @@ -395,9 +395,9 @@ int runMoc(int argc, char **argv) pp.macros.remove(macro); } const QStringList noNotesCompatValues = parser.values(noNotesWarningsCompatOption); - if (parser.isSet(noNotesOption) || noNotesCompatValues.contains(QStringLiteral("n"))) + if (parser.isSet(noNotesOption) || noNotesCompatValues.contains(QLatin1String("n"))) moc.displayNotes = false; - if (parser.isSet(noWarningsOption) || noNotesCompatValues.contains(QStringLiteral("w"))) + if (parser.isSet(noWarningsOption) || noNotesCompatValues.contains(QLatin1String("w"))) moc.displayWarnings = moc.displayNotes = false; if (autoInclude) { diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 4d3ccb8680..b9f71ddb15 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1730,9 +1730,13 @@ void Moc::checkProperties(ClassDef *cdef) } p.notifyId = notifyId; if (notifyId == -1) { - QByteArray msg = "NOTIFY signal '" + p.notify + "' of property '" + p.name - + "' does not exist in class " + cdef->classname + "."; - error(msg.constData()); + int index = cdef->nonClassSignalList.indexOf(p.notify); + if (index == -1) { + cdef->nonClassSignalList << p.notify; + p.notifyId = -1 - cdef->nonClassSignalList.count(); + } else { + p.notifyId = -2 - index; + } } } } diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 6040f944f3..5f8cdfcf2c 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -121,7 +121,7 @@ struct PropertyDef { PropertyDef():notifyId(-1), constant(false), final(false), gspec(ValueSpec), revision(0){} QByteArray name, type, member, read, write, reset, designable, scriptable, editable, stored, user, notify, inPrivateClass; - int notifyId; + int notifyId; // -1 means no notifyId, >= 0 means signal defined in this class, < -1 means signal not defined in this class bool constant; bool final; enum Specification { ValueSpec, ReferenceSpec, PointerSpec }; @@ -179,6 +179,7 @@ struct ClassDef : BaseDef { QVector<FunctionDef> constructorList; QVector<FunctionDef> signalList, slotList, methodList, publicList; + QVector<QByteArray> nonClassSignalList; int notifyableProperties = 0; QVector<PropertyDef> propertyList; int revisionedMethods = 0; diff --git a/src/tools/moc/moc.pro b/src/tools/moc/moc.pro index ccd29341d0..8f66a428c1 100644 --- a/src/tools/moc/moc.pro +++ b/src/tools/moc/moc.pro @@ -12,4 +12,5 @@ include(moc.pri) HEADERS += qdatetime_p.h SOURCES += main.cpp +QMAKE_TARGET_DESCRIPTION = "Qt Meta Object Compiler" load(qt_tool) |