Skip to content

Commit 9437436

Browse files
usiemsjcfr
authored andcommitted
[Backport generator] Automatically add enums marked with Q_ENUM to TypeDatabase
If this is for a QObject-derived class, they are ignored automatically, but if it is for a Q_GADGET, they obviously are intended for use with scripting (cherry picked from commit MeVisLab/pythonqt@e1e85a2)
1 parent 3ef72db commit 9437436

File tree

5 files changed

+52
-19
lines changed

5 files changed

+52
-19
lines changed

generator/abstractmetabuilder.cpp

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

613649
void 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);

generator/abstractmetabuilder.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class AbstractMetaBuilder
8282

8383
bool build();
8484

85+
void autoAddQEnumsForClassItem(ClassModelItem item);
86+
8587
void figureOutEnumValuesForClass(AbstractMetaClass *meta_class, QSet<AbstractMetaClass *> *classes);
8688
int figureOutEnumValue(const QString &name, int value, AbstractMetaEnum *meta_enum, AbstractMetaFunction *meta_function = 0);
8789
void figureOutEnumValues();
@@ -92,7 +94,7 @@ class AbstractMetaBuilder
9294
bool setupInheritance(AbstractMetaClass *meta_class);
9395
AbstractMetaClass *traverseNamespace(NamespaceModelItem item);
9496
AbstractMetaEnum *traverseEnum(EnumModelItem item, AbstractMetaClass *enclosing, const QSet<QString> &enumsDeclarations);
95-
void traverseEnums(ScopeModelItem item, AbstractMetaClass *parent, const QStringList &enumsDeclarations);
97+
void traverseEnums(ScopeModelItem item, AbstractMetaClass *parent, const QSet<QString> &enumsDeclarations);
9698
void traverseFunctions(ScopeModelItem item, AbstractMetaClass *parent);
9799
void traverseFields(ScopeModelItem item, AbstractMetaClass *parent);
98100
void traverseStreamOperator(FunctionModelItem function_item);

generator/parser/binder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ void Binder::visitQEnums(QEnumsAST *node)
856856
//if (node->isQEnum) {
857857
// std::cout << enum_list.at(i).toLatin1().constData() << std::endl;
858858
//}
859-
scope->addEnumsDeclaration(enum_list.at(i));
859+
scope->addQEnumDeclaration(enum_list.at(i));
860860
}
861861
}
862862

generator/parser/codemodel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,9 +429,9 @@ FunctionList _ScopeModelItem::functions() const
429429
return _M_functions.values();
430430
}
431431

432-
void _ScopeModelItem::addEnumsDeclaration(const QString &enumsDeclaration)
432+
void _ScopeModelItem::addQEnumDeclaration(const QString &qEnumDeclaration)
433433
{
434-
_M_enumsDeclarations << enumsDeclaration;
434+
_M_qEnumDeclarations.insert(qEnumDeclaration);
435435
}
436436

437437
FunctionDefinitionList _ScopeModelItem::functionDefinitions() const

generator/parser/codemodel.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include <QtCore/QString>
5252
#include <QtCore/QStringList>
5353
#include <QtCore/QVector>
54+
#include <QtCore/QSet>
5455

5556
#define DECLARE_MODEL_NODE(k) \
5657
enum { __node_kind = Kind_##k }; \
@@ -307,8 +308,8 @@ class _ScopeModelItem: public _CodeModelItem
307308
TypeAliasModelItem findTypeAlias(const QString &name) const;
308309
VariableModelItem findVariable(const QString &name) const;
309310

310-
void addEnumsDeclaration(const QString &enumsDeclaration);
311-
QStringList enumsDeclarations() const { return _M_enumsDeclarations; }
311+
void addQEnumDeclaration(const QString &qEnumDeclaration);
312+
QSet<QString> qEnumDeclarations() const { return _M_qEnumDeclarations; }
312313

313314
inline QHash<QString, ClassModelItem> classMap() const { return _M_classes; }
314315
inline QHash<QString, EnumModelItem> enumMap() const { return _M_enums; }
@@ -335,7 +336,7 @@ class _ScopeModelItem: public _CodeModelItem
335336
_ScopeModelItem(const _ScopeModelItem &other);
336337
void operator = (const _ScopeModelItem &other);
337338

338-
QStringList _M_enumsDeclarations;
339+
QSet<QString> _M_qEnumDeclarations;
339340
};
340341

341342
class _ClassModelItem: public _ScopeModelItem

0 commit comments

Comments
 (0)