aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp9
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp98
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h5
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp11
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testenum.cpp4
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()