From 3b05862730ca8f5cf674562c438501e8d9877738 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 18 Nov 2020 11:02:44 +0100 Subject: shiboken6: Preferably search classes by type entry If a type entry is available, use that to search rather than by name, which has issues with qualified names. Task-number: PYSIDE-1417 Change-Id: I9d9bc1d85481c366d6d7c84879ec2caa9458ac77 Reviewed-by: Christian Tismer (cherry picked from commit 768cfefa3d693f682d8c71b085e861c3be9631d7) --- .../shiboken2/ApiExtractor/abstractmetabuilder.cpp | 8 +++++--- .../shiboken2/ApiExtractor/abstractmetalang.cpp | 22 ++++++---------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index d59147d54..5ab6c1976 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -575,7 +575,8 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) } else if (entry->isEnum() && entry->generateCode()) { auto enumEntry = static_cast(entry); const QString name = enumEntry->targetLangQualifier(); - AbstractMetaClass *cls = AbstractMetaClass::findClass(m_metaClasses, name); + AbstractMetaClass *cls = AbstractMetaClass::findClass(m_metaClasses, + enumEntry->parent()); const bool enumFound = cls ? cls->findEnum(entry->targetLangEntryName()) != nullptr @@ -1471,12 +1472,13 @@ bool AbstractMetaBuilderPrivate::setupInheritance(AbstractMetaClass *metaClass) for (const auto &baseClassName : baseClasses) { if (!types->isClassRejected(baseClassName)) { - if (!types->findType(baseClassName)) { + auto typeEntry = types->findType(baseClassName); + if (typeEntry == nullptr || !typeEntry->isComplex()) { qCWarning(lcShiboken, "%s", qPrintable(msgUnknownBase(metaClass, baseClassName))); return false; } - auto baseClass = AbstractMetaClass::findClass(m_metaClasses, baseClassName); + auto baseClass = AbstractMetaClass::findClass(m_metaClasses, typeEntry); if (!baseClass) { qCWarning(lcShiboken).noquote().nospace() << QStringLiteral("class not found for setup inheritance '%1'").arg(baseClassName); diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp index 3bdac909c..f1f01e02c 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp @@ -2520,28 +2520,18 @@ AbstractMetaEnum *AbstractMetaClass::findEnum(const AbstractMetaClassList &class { Q_ASSERT(entry->isEnum()); - QString qualifiedName = entry->qualifiedCppName(); - int pos = qualifiedName.lastIndexOf(QLatin1String("::")); - - QString enumName; - QString className; - - if (pos > 0) { - enumName = qualifiedName.mid(pos + 2); - className = qualifiedName.mid(0, pos); - } else { - enumName = qualifiedName; - className = TypeDatabase::globalNamespaceClassName(entry); - } - - AbstractMetaClass *metaClass = AbstractMetaClass::findClass(classes, className); + auto scopeEntry = entry->parent(); + AbstractMetaClass *metaClass = AbstractMetaClass::findClass(classes, scopeEntry); if (!metaClass) { qCWarning(lcShiboken).noquote().nospace() << QStringLiteral("AbstractMeta::findEnum(), unknown class '%1' in '%2'") - .arg(className, entry->qualifiedCppName()); + .arg(scopeEntry->qualifiedCppName(), entry->qualifiedCppName()); return nullptr; } + QString qualifiedName = entry->qualifiedCppName(); + const int pos = qualifiedName.lastIndexOf(QLatin1String("::")); + const QString enumName = pos > 0 ? qualifiedName.mid(pos + 2) : qualifiedName; return metaClass->findEnum(enumName); } -- cgit v1.2.3