From faf7c506a451cef1dc8229a3779eb62796c93e5f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 29 Sep 2020 09:36:12 +0200 Subject: shiboken2: Refactor handling of invisible top level namespaces To avoid having to add a ShibokenGenerator::lookForFunctionsInClassesNotToBeGenerated() to fix the function issue, replace ShibokenGenerator::lookForEnumsInClassesNotToBeGenerated() by several helper functions: - Add a list of top level invisible namespace to the generators - Add functions to retrieve enumerations of nested invisible namespaces to AbstractMetaClass with recursion helpers. Task-number: PYSIDE-1075 Change-Id: I421113770e622611caeb221498b872d0a6ba1aeb Reviewed-by: Christian Tismer --- sources/shiboken2/generator/generator.cpp | 16 +++++++++++++++- sources/shiboken2/generator/generator.h | 3 +++ sources/shiboken2/generator/shiboken2/cppgenerator.cpp | 18 +++++------------- .../generator/shiboken2/shibokengenerator.cpp | 14 -------------- .../shiboken2/generator/shiboken2/shibokengenerator.h | 3 --- 5 files changed, 23 insertions(+), 31 deletions(-) (limited to 'sources/shiboken2/generator') diff --git a/sources/shiboken2/generator/generator.cpp b/sources/shiboken2/generator/generator.cpp index 926840235..e39ead258 100644 --- a/sources/shiboken2/generator/generator.cpp +++ b/sources/shiboken2/generator/generator.cpp @@ -168,7 +168,7 @@ struct Generator::GeneratorPrivate QStringList instantiatedContainersNames; QVector instantiatedContainers; QVector instantiatedSmartPointers; - + AbstractMetaClassList m_invisibleTopNamespaces; }; Generator::Generator() : m_d(new GeneratorPrivate) @@ -191,6 +191,15 @@ bool Generator::setup(const ApiExtractor &extractor) collectInstantiatedContainersAndSmartPointers(); + for (auto c : classes()) { + if (c->enclosingClass() == nullptr && c->isInvisibleNamespace()) { + m_d->m_invisibleTopNamespaces.append(c); + c->invisibleNamespaceRecursion([&](AbstractMetaClass *ic) { + m_d->m_invisibleTopNamespaces.append(ic); + }); + } + } + return doSetup(); } @@ -344,6 +353,11 @@ const AbstractMetaClassList &Generator::classes() const return m_d->apiextractor->classes(); } +const AbstractMetaClassList &Generator::invisibleTopNamespaces() const +{ + return m_d->m_invisibleTopNamespaces; +} + AbstractMetaClassList Generator::classesTopologicalSorted(const Dependencies &additionalDependencies) const { return m_d->apiextractor->classesTopologicalSorted(additionalDependencies); diff --git a/sources/shiboken2/generator/generator.h b/sources/shiboken2/generator/generator.h index 324bb8474..cf6df528f 100644 --- a/sources/shiboken2/generator/generator.h +++ b/sources/shiboken2/generator/generator.h @@ -218,6 +218,9 @@ public: /// Returns the classes used to generate the binding code. const AbstractMetaClassList &classes() const; + /// Returns the top namespace made invisible + const AbstractMetaClassList &invisibleTopNamespaces() const; + /// Returns the output directory QString outputDirectory() const; diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index 676cb4985..a366dfa1c 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -390,8 +390,7 @@ void CppGenerator::generateClass(QTextStream &s, const GeneratorContext &classCo } AbstractMetaEnumList classEnums = metaClass->enums(); - for (AbstractMetaClass *innerClass : innerClasses) - lookForEnumsInClassesNotToBeGenerated(classEnums, innerClass); + metaClass->getEnumsFromInvisibleNamespacesToBeGenerated(&classEnums); //Extra includes s << "\n// Extra includes\n"; @@ -1390,9 +1389,7 @@ void CppGenerator::writeConverterFunctions(QTextStream &s, const AbstractMetaCla s << "// Type conversion functions.\n\n"; AbstractMetaEnumList classEnums = metaClass->enums(); - const AbstractMetaClassList &innerClasses = metaClass->innerClasses(); - for (AbstractMetaClass *innerClass : innerClasses) - lookForEnumsInClassesNotToBeGenerated(classEnums, innerClass); + metaClass->getEnumsFromInvisibleNamespacesToBeGenerated(&classEnums); if (!classEnums.isEmpty()) s << "// Python to C++ enum conversion.\n"; for (const AbstractMetaEnum *metaEnum : qAsConst(classEnums)) @@ -5334,9 +5331,7 @@ void CppGenerator::writeClassRegister(QTextStream &s, } AbstractMetaEnumList classEnums = metaClass->enums(); - const AbstractMetaClassList &innerClasses = metaClass->innerClasses(); - for (AbstractMetaClass *innerClass : innerClasses) - lookForEnumsInClassesNotToBeGenerated(classEnums, innerClass); + metaClass->getEnumsFromInvisibleNamespacesToBeGenerated(&classEnums); ErrorCode errorCode(QString::fromLatin1("")); writeEnumsInitialization(s, classEnums); @@ -5843,11 +5838,8 @@ bool CppGenerator::finishGeneration() // Global enums AbstractMetaEnumList globalEnums = this->globalEnums(); - for (const AbstractMetaClass *metaClass : classes()) { - const AbstractMetaClass *encClass = metaClass->enclosingClass(); - if (!encClass || !NamespaceTypeEntry::isVisibleScope(encClass->typeEntry())) - lookForEnumsInClassesNotToBeGenerated(globalEnums, metaClass); - } + for (const AbstractMetaClass *nsp : invisibleTopNamespaces()) + nsp->getEnumsToBeGenerated(&globalEnums); TypeDatabase *typeDb = TypeDatabase::instance(); const TypeSystemTypeEntry *moduleEntry = typeDb->defaultTypeSystemType(); diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp index b2c762115..3606f0af0 100644 --- a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp @@ -334,20 +334,6 @@ bool ShibokenGenerator::shouldWriteVirtualMethodNative(const AbstractMetaFunctio && (func->attributes() & AbstractMetaAttributes::FinalCppMethod) == 0); } -void ShibokenGenerator::lookForEnumsInClassesNotToBeGenerated(AbstractMetaEnumList &enumList, const AbstractMetaClass *metaClass) -{ - Q_ASSERT(metaClass); - // if a scope is not to be generated, collect its enums into the parent scope - if (!NamespaceTypeEntry::isVisibleScope(metaClass->typeEntry())) { - for (AbstractMetaEnum *metaEnum : metaClass->enums()) { - if (!metaEnum->isPrivate() && metaEnum->typeEntry()->generateCode() - && !enumList.contains(metaEnum)) { - enumList.append(metaEnum); - } - } - } -} - QString ShibokenGenerator::wrapperName(const AbstractMetaClass *metaClass) const { Q_ASSERT(shouldGenerateCppWrapper(metaClass)); diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.h b/sources/shiboken2/generator/shiboken2/shibokengenerator.h index 83e7cf5b9..33da01a3a 100644 --- a/sources/shiboken2/generator/shiboken2/shibokengenerator.h +++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.h @@ -228,9 +228,6 @@ protected: /// Condition to call WriteVirtualMethodNative. Was extracted because also used to count these calls. bool shouldWriteVirtualMethodNative(const AbstractMetaFunction *func); - /// Adds enums eligible for generation from classes/namespaces marked not to be generated. - static void lookForEnumsInClassesNotToBeGenerated(AbstractMetaEnumList &enumList, const AbstractMetaClass *metaClass); - QString wrapperName(const AbstractMetaClass *metaClass) const; QString fullPythonClassName(const AbstractMetaClass *metaClass); -- cgit v1.2.3