@@ -430,6 +430,15 @@ bool AbstractMetaBuilder::build()
430430
431431
432432 // Start the generation...
433+
434+ // First automatically add all enums marked as QEnum into the TypeDatabase
435+ // (if they don't contain an entry already). If there is an QEnum entry,
436+ // the enum is obviously meant for scripting.
437+ for (ClassModelItem item : typeMap.values ()) {
438+ autoAddQEnumsForClassItem (item);
439+ }
440+
441+
433442 for (ClassModelItem item : typeMap.values ()) {
434443 AbstractMetaClass *cls = traverseClass (item);
435444 addAbstractMetaClass (cls);
@@ -609,6 +618,33 @@ bool AbstractMetaBuilder::build()
609618 return true ;
610619}
611620
621+ void AbstractMetaBuilder::autoAddQEnumsForClassItem (ClassModelItem class_item)
622+ {
623+ // also do this for sub-classes:
624+ for (ClassModelItem sub_class : class_item->classMap ().values ()) {
625+ autoAddQEnumsForClassItem (sub_class);
626+ }
627+
628+ auto qEnumDeclarations = class_item->qEnumDeclarations ();
629+ for (EnumModelItem enum_item : class_item->enumMap ().values ()) {
630+ if (enum_item) {
631+ const auto & names = enum_item->qualifiedName ();
632+ QString qualified_name = names.join (" ::" );
633+ QString enum_name = enum_item->name ();
634+
635+ bool hasQEnumDeclaration = qEnumDeclarations.contains (qualified_name)
636+ || qEnumDeclarations.contains (enum_name);
637+
638+ TypeEntry* type_entry = TypeDatabase::instance ()->findType (qualified_name);
639+ if (hasQEnumDeclaration && !type_entry) {
640+ // automatically add enum type declared as Q_ENUM
641+ type_entry = new EnumTypeEntry (QStringList (names.mid (0 , names.size () - 1 )).join (" ::" ), names.last ());
642+ TypeDatabase::instance ()->addType (type_entry);
643+ }
644+ }
645+ }
646+ }
647+
612648
613649void AbstractMetaBuilder::addAbstractMetaClass (AbstractMetaClass *cls)
614650{
@@ -664,7 +700,7 @@ AbstractMetaClass *AbstractMetaBuilder::traverseNamespace(NamespaceModelItem nam
664700 .arg (meta_class->package ())
665701 .arg (namespace_item->name ()));
666702
667- traverseEnums (model_dynamic_cast<ScopeModelItem>(namespace_item), meta_class, namespace_item->enumsDeclarations ());
703+ traverseEnums (model_dynamic_cast<ScopeModelItem>(namespace_item), meta_class, namespace_item->qEnumDeclarations ());
668704 traverseFunctions (model_dynamic_cast<ScopeModelItem>(namespace_item), meta_class);
669705// traverseClasses(model_dynamic_cast<ScopeModelItem>(namespace_item));
670706
@@ -1122,12 +1158,12 @@ AbstractMetaClass *AbstractMetaBuilder::traverseClass(ClassModelItem class_item)
11221158 meta_class->setTemplateArguments (template_args);
11231159 meta_class->setHasActualDeclaration (class_item->hasActualDeclaration ());
11241160
1125- parseQ_Property (meta_class, class_item->propertyDeclarations ());
1126-
11271161 traverseFunctions (model_dynamic_cast<ScopeModelItem>(class_item), meta_class);
1128- traverseEnums (model_dynamic_cast<ScopeModelItem>(class_item), meta_class, class_item->enumsDeclarations ());
1162+ traverseEnums (model_dynamic_cast<ScopeModelItem>(class_item), meta_class, class_item->qEnumDeclarations ());
11291163 traverseFields (model_dynamic_cast<ScopeModelItem>(class_item), meta_class);
11301164
1165+ parseQ_Property (meta_class, class_item->propertyDeclarations ());
1166+
11311167 // Inner classes
11321168 {
11331169 QList<ClassModelItem> inner_classes = class_item->classMap ().values ();
@@ -1465,17 +1501,11 @@ bool AbstractMetaBuilder::setupInheritance(AbstractMetaClass *meta_class)
14651501 return true ;
14661502}
14671503
1468- void AbstractMetaBuilder::traverseEnums (ScopeModelItem scope_item, AbstractMetaClass *meta_class, const QStringList &enumsDeclarations )
1504+ void AbstractMetaBuilder::traverseEnums (ScopeModelItem scope_item, AbstractMetaClass *meta_class, const QSet<QString> &qEnumDeclarations )
14691505{
14701506 EnumList enums = scope_item->enums ();
14711507 for (EnumModelItem enum_item : enums) {
1472- AbstractMetaEnum *meta_enum = traverseEnum (enum_item, meta_class,
1473- #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
1474- QSet<QString>::fromList (enumsDeclarations)
1475- #else
1476- QSet<QString>(enumsDeclarations.begin (), enumsDeclarations.end ())
1477- #endif
1478- );
1508+ AbstractMetaEnum* meta_enum = traverseEnum (enum_item, meta_class, qEnumDeclarations);
14791509 if (meta_enum) {
14801510 meta_enum->setOriginalAttributes (meta_enum->attributes ());
14811511 meta_class->addEnum (meta_enum);
0 commit comments