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_metaTypeArrayclassInfoList += infoDef; + return encounteredQmlMacro ? EncounteredQmlMacro::Yes : EncounteredQmlMacro::No; +} + +void Moc::parseClassInfo(ClassDef *def) +{ + if (parseClassInfo(static_cast(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();