diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-11-09 10:40:29 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-11-10 14:14:59 +0100 |
commit | 3681ae61aaab836d26ad227911c3bfca92322f12 (patch) | |
tree | 0d368fe6dd1b434f4e3838224c4e9c732abada1f /sources/shiboken6/ApiExtractor | |
parent | 2a71960d3ff3640b3dcb0c1b1eb004bbb3eaea4d (diff) |
shiboken6: Enable specifying namespaces for smart pointer instantiations
[ChangeLog][shiboken6] It is now possible to specify a namespace for a
smart pointer instantiation.
Task-number: PYSIDE-454
Change-Id: I9b61c3514211108fd7009e1776ae4fb8988c576b
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/shiboken6/ApiExtractor')
-rw-r--r-- | sources/shiboken6/ApiExtractor/apiextractor.cpp | 38 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/messages.cpp | 5 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/messages.h | 2 |
3 files changed, 41 insertions, 4 deletions
diff --git a/sources/shiboken6/ApiExtractor/apiextractor.cpp b/sources/shiboken6/ApiExtractor/apiextractor.cpp index 43c48882f..15b074d4d 100644 --- a/sources/shiboken6/ApiExtractor/apiextractor.cpp +++ b/sources/shiboken6/ApiExtractor/apiextractor.cpp @@ -12,6 +12,7 @@ #include "abstractmetalang.h" #include "codesnip.h" #include "exception.h" +#include "messages.h" #include "modifications.h" #include "reporthandler.h" #include "typedatabase.h" @@ -20,6 +21,7 @@ #include "primitivetypeentry.h" #include "smartpointertypeentry.h" #include "typedefentry.h" +#include "namespacetypeentry.h" #include "typesystemtypeentry.h" #include "qtcompat.h" @@ -508,14 +510,35 @@ void ApiExtractorPrivate::addInstantiatedSmartPointer(InstantiationCollectContex auto *ste = static_cast<const SmartPointerTypeEntry *>(smp.smartPointer->typeEntry()); QString name = ste->getTargetName(smp.type); auto *parentTypeEntry = ste->parent(); + InheritTemplateFlags flags; + + auto colonPos = name.lastIndexOf(u"::"); + const bool withinNameSpace = colonPos != -1; + if (withinNameSpace) { // user defined + const QString nameSpace = name.left(colonPos); + name.remove(0, colonPos + 2); + const auto nameSpaces = TypeDatabase::instance()->findNamespaceTypes(nameSpace); + if (nameSpaces.isEmpty()) + throw Exception(msgNamespaceNotFound(name)); + parentTypeEntry = nameSpaces.constFirst(); + } else { + flags.setFlag(InheritTemplateFlag::SetEnclosingClass); + } + auto *typedefEntry = new TypedefEntry(name, ste->name(), ste->version(), parentTypeEntry); typedefEntry->setTargetLangPackage(ste->targetLangPackage()); auto *instantiationEntry = TypeDatabase::initializeTypeDefEntry(typedefEntry, ste); smp.specialized = ApiExtractor::inheritTemplateClass(instantiationEntry, smp.smartPointer, - {instantiatedType}, - InheritTemplateFlag::SetEnclosingClass); + {instantiatedType}, flags); Q_ASSERT(smp.specialized); + if (withinNameSpace) { // move class to desired namespace + auto *enclClass = AbstractMetaClass::findClass(m_builder->classes(), parentTypeEntry); + Q_ASSERT(enclClass); + auto *specialized = const_cast<AbstractMetaClass *>(smp.specialized); + specialized->setEnclosingClass(enclClass); + enclClass->addInnerClass(specialized); + } if (instantiationEntry->isComplex()) { addOwnerModification(smp.specialized->queryFunctions(FunctionQueryOption::Constructors), @@ -550,8 +573,15 @@ ApiExtractorPrivate::collectInstantiatedContainersAndSmartPointers(Instantiation collectInstantiatedContainersAndSmartPointers(context, func); for (const AbstractMetaField &field : metaClass->fields()) addInstantiatedContainersAndSmartPointers(context, field.type(), field.name()); - for (auto *innerClass : metaClass->innerClasses()) - collectInstantiatedContainersAndSmartPointers(context, innerClass); + + // The list of inner classes might be extended when smart pointer + // instantiations are specified to be in namespaces. + auto &innerClasses = metaClass->innerClasses(); + for (auto i = innerClasses.size() - 1; i >= 0; --i) { + auto *innerClass = innerClasses.at(i); + if (!innerClass->typeEntry()->isSmartPointer()) + collectInstantiatedContainersAndSmartPointers(context, innerClass); + } } void diff --git a/sources/shiboken6/ApiExtractor/messages.cpp b/sources/shiboken6/ApiExtractor/messages.cpp index 5fbd6c8aa..f9dad4d50 100644 --- a/sources/shiboken6/ApiExtractor/messages.cpp +++ b/sources/shiboken6/ApiExtractor/messages.cpp @@ -255,6 +255,11 @@ QString msgNamespaceNoTypeEntry(const NamespaceModelItem &item, return result; } +QString msgNamespaceNotFound(const QString &name) +{ + return u"namespace '"_s + name + u"' not found."_s; +} + QString msgAmbiguousVaryingTypesFound(const QString &qualifiedName, const TypeEntries &te) { QString result = u"Ambiguous types of varying types found for \""_s + qualifiedName diff --git a/sources/shiboken6/ApiExtractor/messages.h b/sources/shiboken6/ApiExtractor/messages.h index 1d40dc76c..6b4ce2711 100644 --- a/sources/shiboken6/ApiExtractor/messages.h +++ b/sources/shiboken6/ApiExtractor/messages.h @@ -67,6 +67,8 @@ QString msgNoEnumTypeConflict(const EnumModelItem &enumItem, QString msgNamespaceNoTypeEntry(const NamespaceModelItem &item, const QString &fullName); +QString msgNamespaceNotFound(const QString &name); + QString msgAmbiguousVaryingTypesFound(const QString &qualifiedName, const TypeEntries &te); QString msgAmbiguousTypesFound(const QString &qualifiedName, const TypeEntries &te); |