diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/moc/generator.cpp | 2 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 12 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 5 |
3 files changed, 16 insertions, 3 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 155a98209d..0df3a43584 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -572,7 +572,7 @@ void Generator::generateCode() fprintf(out, " nullptr,\n"); } else { bool needsComma = false; - if (!requireCompleteTypes) { + if (!(requireCompleteTypes || cdef->requireCompleteMethodTypes)) { fprintf(out, "qt_incomplete_metaTypeArray<qt_meta_stringdata_%s_t\n", qualifiedClassNameIdentifier.constData()); needsComma = true; } else { diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 516b231cd5..228a21e3c2 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1512,12 +1512,15 @@ void Moc::parseFlag(BaseDef *def) next(RPAREN); } -void Moc::parseClassInfo(BaseDef *def) +Moc::EncounteredQmlMacro Moc::parseClassInfo(BaseDef *def) { + bool encounteredQmlMacro = false; next(LPAREN); ClassInfoDef infoDef; next(STRING_LITERAL); infoDef.name = symbol().unquotedLexem(); + if (infoDef.name.startsWith("QML.")) + encounteredQmlMacro = true; next(COMMA); if (test(STRING_LITERAL)) { infoDef.value = symbol().unquotedLexem(); @@ -1533,6 +1536,13 @@ void Moc::parseClassInfo(BaseDef *def) } next(RPAREN); def->classInfoList += infoDef; + return encounteredQmlMacro ? EncounteredQmlMacro::Yes : EncounteredQmlMacro::No; +} + +void Moc::parseClassInfo(ClassDef *def) +{ + if (parseClassInfo(static_cast<BaseDef *>(def)) == EncounteredQmlMacro::Yes) + def->requireCompleteMethodTypes = true; } void Moc::parseInterfaces(ClassDef *def) diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 7f63402aca..5ce057210f 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -204,6 +204,7 @@ struct ClassDef : BaseDef { bool hasQObject = false; bool hasQGadget = false; bool hasQNamespace = false; + bool requireCompleteMethodTypes = false; QJsonObject toJson() const; }; @@ -266,7 +267,9 @@ public: void parsePropertyAttributes(PropertyDef &propDef); void parseEnumOrFlag(BaseDef *def, bool isFlag); void parseFlag(BaseDef *def); - void parseClassInfo(BaseDef *def); + enum class EncounteredQmlMacro {Yes, No}; + EncounteredQmlMacro parseClassInfo(BaseDef *def); + void parseClassInfo(ClassDef *def); void parseInterfaces(ClassDef *def); void parseDeclareInterface(); void parseDeclareMetatype(); |