aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-11-09 10:40:29 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-11-10 14:14:59 +0100
commit3681ae61aaab836d26ad227911c3bfca92322f12 (patch)
tree0d368fe6dd1b434f4e3838224c4e9c732abada1f /sources/shiboken6/ApiExtractor
parent2a71960d3ff3640b3dcb0c1b1eb004bbb3eaea4d (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.cpp38
-rw-r--r--sources/shiboken6/ApiExtractor/messages.cpp5
-rw-r--r--sources/shiboken6/ApiExtractor/messages.h2
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);