diff options
5 files changed, 52 insertions, 75 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index b0bbdcc5e..37b82e99f 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -2740,12 +2740,9 @@ int AbstractMetaBuilderPrivate::findOutValueFromString(const QString &stringValu } for (AbstractMetaEnum *metaEnum : qAsConst(m_globalEnums)) { - const AbstractMetaEnumValueList &values = metaEnum->values(); - for (const AbstractMetaEnumValue *ev : values) { - if (ev->name() == stringValue) { - ok = true; - return ev->value(); - } + if (const AbstractMetaEnumValue *ev = metaEnum->findEnumValue(stringValue)) { + ok = true; + return ev->value(); } } diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp index 840466108..4e507cd38 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp @@ -1938,61 +1938,26 @@ AbstractMetaEnum *AbstractMetaClass::findEnum(const QString &enumName) if (typeEntry()->designatedInterface()) return extractInterface()->findEnum(enumName); - return 0; + return nullptr; } - - - -/*! Recursivly searches for the enum value named \a enumValueName in - this class and its superclasses and interfaces. Values belonging to - \a meta_enum are excluded from the search. +/*! Recursively searches for the enum value named \a enumValueName in + this class and its superclasses and interfaces. */ -AbstractMetaEnumValue *AbstractMetaClass::findEnumValue(const QString &enumValueName, AbstractMetaEnum *meta_enum) -{ - for (AbstractMetaEnum *e : qAsConst(m_enums)) { - if (e != meta_enum) - continue; - const AbstractMetaEnumValueList &values = e->values(); - for (AbstractMetaEnumValue *v : values) { - if (v->name() == enumValueName) - return v; - } - } - - if (typeEntry()->designatedInterface()) - return extractInterface()->findEnumValue(enumValueName, meta_enum); - - if (baseClass()) - return baseClass()->findEnumValue(enumValueName, meta_enum); - - return 0; -} - - -/*! - * Searches through all of this class' enums for a value matching the - * name \a enumValueName. The name is excluding the class/namespace - * prefix. The function recursivly searches interfaces and baseclasses - * of this class. - */ -AbstractMetaEnum *AbstractMetaClass::findEnumForValue(const QString &enumValueName) +AbstractMetaEnumValue *AbstractMetaClass::findEnumValue(const QString &enumValueName) { for (AbstractMetaEnum *e : qAsConst(m_enums)) { - const AbstractMetaEnumValueList &values = e->values(); - for (AbstractMetaEnumValue *v : values) { - if (v->name() == enumValueName) - return e; - } + if (AbstractMetaEnumValue *v = e->findEnumValue(enumValueName)) + return v; } if (typeEntry()->designatedInterface()) - return extractInterface()->findEnumForValue(enumValueName); + return extractInterface()->findEnumValue(enumValueName); if (baseClass()) - return baseClass()->findEnumForValue(enumValueName); + return baseClass()->findEnumValue(enumValueName); - return 0; + return nullptr; } @@ -2332,29 +2297,23 @@ AbstractMetaEnum *AbstractMetaClass::findEnum(const AbstractMetaClassList &class AbstractMetaEnumValue *AbstractMetaClass::findEnumValue(const AbstractMetaClassList &classes, const QString &name) { - QStringList lst = name.split(QLatin1String("::")); + const QVector<QStringRef> lst = name.splitRef(QLatin1String("::")); if (lst.size() > 1) { - QString prefixName = lst.at(0); - QString enumName = lst.at(1); - - AbstractMetaClass* cl = findClass(classes, prefixName); - if (cl) - return cl->findEnumValue(enumName, 0); + const QStringRef prefixName = lst.at(0); + const QStringRef enumName = lst.at(1); + if (AbstractMetaClass *cl = findClass(classes, prefixName.toString())) + return cl->findEnumValue(enumName.toString()); } for (AbstractMetaClass *metaClass : classes) { - const AbstractMetaEnumList &enums = metaClass->enums(); - for (AbstractMetaEnum *metaEnum : enums) { - AbstractMetaEnumValue* enumValue = metaClass->findEnumValue(name, metaEnum); - if (enumValue) - return enumValue; - } + if (AbstractMetaEnumValue *enumValue = metaClass->findEnumValue(name)) + return enumValue; } qCWarning(lcShiboken).noquote().nospace() << QStringLiteral("no matching enum '%1'").arg(name); - return 0; + return nullptr; } /*! @@ -2461,6 +2420,29 @@ AbstractMetaEnum::~AbstractMetaEnum() qDeleteAll(m_enumValues); } +template <class String> +AbstractMetaEnumValue *findMatchingEnumValue(const AbstractMetaEnumValueList &list, const String &value) +{ + for (AbstractMetaEnumValue *enumValue : list) { + if (enumValue->name() == value) + return enumValue; + } + return nullptr; +} + +// Find enum values for "enum Enum { e1 }" either for "e1" or "Enum::e1" +AbstractMetaEnumValue *AbstractMetaEnum::findEnumValue(const QString &value) const +{ + if (isAnonymous()) + return findMatchingEnumValue(m_enumValues, value); + const int sepPos = value.indexOf(QLatin1String("::")); + if (sepPos == -1) + return findMatchingEnumValue(m_enumValues, value); + return name() == value.leftRef(sepPos) + ? findMatchingEnumValue(m_enumValues, value.rightRef(value.size() - sepPos - 2)) + : nullptr; +} + QString AbstractMetaEnum::name() const { return m_typeEntry->targetLangName(); diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index ca64011bf..45a55e570 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -1155,6 +1155,8 @@ public: m_enumValues << enumValue; } + AbstractMetaEnumValue *findEnumValue(const QString &value) const; + QString name() const; QString qualifier() const; @@ -1383,8 +1385,7 @@ public: } AbstractMetaEnum *findEnum(const QString &enumName); - AbstractMetaEnum *findEnumForValue(const QString &enumName); - AbstractMetaEnumValue *findEnumValue(const QString &enumName, AbstractMetaEnum *meta_enum); + AbstractMetaEnumValue *findEnumValue(const QString &enumName); AbstractMetaClassList interfaces() const { diff --git a/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp b/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp index 7c9d20ede..cbeb216c9 100644 --- a/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp +++ b/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp @@ -128,7 +128,7 @@ void TestArrayArgument::testArrayArgumentWithSizeDefinedByEnumValue() AbstractMetaEnum* someEnum = classA->findEnum(QLatin1String("SomeEnum")); QVERIFY(someEnum); - AbstractMetaEnumValue* nvalues = classA->findEnumValue(QLatin1String("NValues"), someEnum); + AbstractMetaEnumValue *nvalues = classA->findEnumValue(QLatin1String("NValues")); QVERIFY(nvalues); const AbstractMetaArgument* arg = classA->functions().last()->arguments().first(); @@ -159,14 +159,7 @@ void TestArrayArgument::testArrayArgumentWithSizeDefinedByEnumValueFromGlobalEnu AbstractMetaEnum* someEnum = builder->globalEnums().first(); QVERIFY(someEnum); - AbstractMetaEnumValue* nvalues = 0; - const AbstractMetaEnumValueList &values = someEnum->values(); - for (AbstractMetaEnumValue *enumValue : values) { - if (enumValue->name() == QLatin1String("NValues")) { - nvalues = enumValue; - break; - } - } + const AbstractMetaEnumValue *nvalues = someEnum->findEnumValue(QLatin1String("NValues")); QVERIFY(nvalues); const AbstractMetaArgument* arg = classA->functions().last()->arguments().first(); diff --git a/sources/shiboken2/ApiExtractor/tests/testenum.cpp b/sources/shiboken2/ApiExtractor/tests/testenum.cpp index 98e56b86e..55c098840 100644 --- a/sources/shiboken2/ApiExtractor/tests/testenum.cpp +++ b/sources/shiboken2/ApiExtractor/tests/testenum.cpp @@ -83,6 +83,10 @@ void TestEnum::testEnumCppSignature() AbstractMetaEnumList classEnums = classA->enums(); QCOMPARE(classEnums.first()->name(), QLatin1String("ClassEnum")); + AbstractMetaEnumValue *e = AbstractMetaClass::findEnumValue(classes, QLatin1String("CA")); + QVERIFY(e); + e = AbstractMetaClass::findEnumValue(classes, QLatin1String("ClassEnum::CA")); + QVERIFY(e); } void TestEnum::testEnumWithApiVersion() |