diff options
| -rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp | 12 | ||||
| -rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetalang.cpp | 15 | ||||
| -rw-r--r-- | sources/shiboken6/ApiExtractor/include.h | 11 | ||||
| -rw-r--r-- | sources/shiboken6/ApiExtractor/typesystem.cpp | 4 | ||||
| -rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.cpp | 33 | ||||
| -rw-r--r-- | sources/shiboken6/generator/shiboken/headergenerator.cpp | 3 |
6 files changed, 65 insertions, 13 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp index 4a4f4489e..88cda5461 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp @@ -326,6 +326,10 @@ void AbstractMetaBuilderPrivate::traverseOperatorFunction(const FunctionModelIte metaFunction->setFlags(flags); metaFunction->setAccess(Access::Public); baseoperandClass->addFunction(AbstractMetaFunctionCPtr(metaFunction)); + if (!metaFunction->arguments().isEmpty()) { + const auto include = metaFunction->arguments().constFirst().type().typeEntry()->include(); + baseoperandClass->typeEntry()->addArgumentInclude(include); + } Q_ASSERT(!metaFunction->wasPrivate()); } @@ -1035,10 +1039,14 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseClass(const FileModelItem reason = AbstractMetaBuilder::GenerationDisabled; } else if (!type) { TypeEntry *te = TypeDatabase::instance()->findType(fullClassName); - if (te && !te->isComplex()) + if (te && !te->isComplex()) { reason = AbstractMetaBuilder::RedefinedToNotClass; - else + // Set the default include file name + if (!te->include().isValid()) + setInclude(te, classItem->fileName()); + } else { reason = AbstractMetaBuilder::NotInTypeSystem; + } } else if (type->codeGeneration() == TypeEntry::GenerateNothing) { reason = AbstractMetaBuilder::GenerationDisabled; } diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp index 840d628d5..056003f5c 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp @@ -1341,11 +1341,10 @@ static void addExtraIncludeForType(AbstractMetaClass *metaClass, const AbstractM Q_ASSERT(metaClass); const TypeEntry *entry = type.typeEntry(); - if (entry && entry->isComplex()) { - const auto *centry = static_cast<const ComplexTypeEntry *>(entry); + + if (entry && entry->include().isValid()) { ComplexTypeEntry *class_entry = metaClass->typeEntry(); - if (class_entry && centry->include().isValid()) - class_entry->addArgumentInclude(centry->include()); + class_entry->addArgumentInclude(entry->include()); } if (type.hasInstantiations()) { @@ -1362,8 +1361,12 @@ static void addExtraIncludesForFunction(AbstractMetaClass *metaClass, addExtraIncludeForType(metaClass, meta_function->type()); const AbstractMetaArgumentList &arguments = meta_function->arguments(); - for (const AbstractMetaArgument &argument : arguments) - addExtraIncludeForType(metaClass, argument.type()); + for (const AbstractMetaArgument &argument : arguments) { + const auto &type = argument.type(); + addExtraIncludeForType(metaClass, type); + if (argument.modifiedType() != type) + addExtraIncludeForType(metaClass, argument.modifiedType()); + } } static bool addSuperFunction(const AbstractMetaFunctionCPtr &f) diff --git a/sources/shiboken6/ApiExtractor/include.h b/sources/shiboken6/ApiExtractor/include.h index 6b463a230..fcbaf9b9c 100644 --- a/sources/shiboken6/ApiExtractor/include.h +++ b/sources/shiboken6/ApiExtractor/include.h @@ -71,6 +71,17 @@ struct IncludeGroup { QString title; IncludeList includes; + + void append(const Include &include) + { + IncludeGroup::appendInclude(include, &includes); + } + + static void appendInclude(const Include &include, IncludeList *list) + { + if (include.isValid() && !list->contains(include)) + list->append(include); + } }; TextStream& operator<<(TextStream &out, const IncludeGroup& include); diff --git a/sources/shiboken6/ApiExtractor/typesystem.cpp b/sources/shiboken6/ApiExtractor/typesystem.cpp index 5e52cf0d8..0542a3117 100644 --- a/sources/shiboken6/ApiExtractor/typesystem.cpp +++ b/sources/shiboken6/ApiExtractor/typesystem.cpp @@ -12,6 +12,7 @@ #include "enumvaluetypeentry.h" #include "flagstypeentry.h" #include "functiontypeentry.h" +#include "include.h" #include "namespacetypeentry.h" #include "objecttypeentry.h" #include "primitivetypeentry.h" @@ -1387,8 +1388,7 @@ const IncludeList &ComplexTypeEntry::argumentIncludes() const void ComplexTypeEntry::addArgumentInclude(const Include &newInclude) { S_D(ComplexTypeEntry); - if (!d->m_argumentIncludes.contains(newInclude)) - d->m_argumentIncludes.append(newInclude); + IncludeGroup::appendInclude(newInclude, &d->m_argumentIncludes); } AddedFunctionList ComplexTypeEntry::addedFunctions() const diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index 68e7f0028..35fcb003f 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -534,6 +534,8 @@ void CppGenerator::generateIncludes(TextStream &s, const GeneratorContext &class if (normalClass && usePySideExtensions()) { s << includeQDebug; + if (metaClass->hasToStringCapability()) + s << "#include <QtCore/QBuffer>\n"; if (metaClass->isQObject()) { s << "#include <pysideqobject.h>\n" << "#include <pysidesignal.h>\n" @@ -542,6 +544,7 @@ void CppGenerator::generateIncludes(TextStream &s, const GeneratorContext &class << "#include <pysidemetafunction.h>\n"; } s << "#include <pysideqenum.h>\n" + << "#include <pysideqflags.h>\n" << "#include <pysideqmetatype.h>\n" << "#include <pysideutils.h>\n" << "#include <feature_select.h>\n" @@ -969,6 +972,8 @@ void CppGenerator::generateSmartPointerClass(TextStream &s, const GeneratorConte const bool isValueHandle = smartPointerType ==TypeSystem::SmartPointerType::ValueHandle; IncludeGroup includes{u"Extra includes"_s, typeEntry->extraIncludes()}; + if (hasPointeeClass) + includes.append(classContext.pointeeClass()->typeEntry()->include()); generateIncludes(s, classContext, {includes}); s << '\n' << typeNameFunc << '\n'; @@ -6636,6 +6641,26 @@ bool CppGenerator::finishGeneration() writeInitFunc(s_classInitDecl, s_classPythonDefines, getInitFunctionName(context), smp.type.typeEntry()->targetLangEnclosingEntry()); + includes << smp.type.instantiations().constFirst().typeEntry()->include(); + } + + for (auto &instantiatedContainer : api().instantiatedContainers()) { + for (const auto &inst : instantiatedContainer.instantiations()) + includes << inst.typeEntry()->include(); + } + + const ExtendedConverterData extendedConverters = getExtendedConverters(); + for (auto it = extendedConverters.cbegin(), end = extendedConverters.cend(); it != end; ++it) { + const TypeEntry *te = it.key(); + includes << te->include(); + for (const auto &metaClass : it.value()) + includes << metaClass->typeEntry()->include(); + } + + const QList<CustomConversionPtr> &typeConversions = getPrimitiveCustomConversions(); + for (const auto &c : typeConversions) { + if (auto *te = c->ownerType()) + includes << te->include(); } QString moduleFileName(outputDirectory() + u'/' + subDirectoryForPackage(packageName())); @@ -6673,8 +6698,12 @@ bool CppGenerator::finishGeneration() // Global enums AbstractMetaEnumList globalEnums = api().globalEnums(); - for (const AbstractMetaClass *nsp : invisibleTopNamespaces()) + for (const AbstractMetaClass *nsp : invisibleTopNamespaces()) { + const auto oldSize = globalEnums.size(); nsp->getEnumsToBeGenerated(&globalEnums); + if (globalEnums.size() > oldSize) + s << nsp->typeEntry()->include(); + } TypeDatabase *typeDb = TypeDatabase::instance(); const TypeSystemTypeEntry *moduleEntry = typeDb->defaultTypeSystemType(); @@ -6758,7 +6787,6 @@ bool CppGenerator::finishGeneration() s << "\n// Module initialization " << "------------------------------------------------------------\n"; - ExtendedConverterData extendedConverters = getExtendedConverters(); if (!extendedConverters.isEmpty()) { s << '\n' << "// Extended Converters.\n\n"; for (ExtendedConverterData::const_iterator it = extendedConverters.cbegin(), end = extendedConverters.cend(); it != end; ++it) { @@ -6773,7 +6801,6 @@ bool CppGenerator::finishGeneration() } } - const QList<CustomConversionPtr> &typeConversions = getPrimitiveCustomConversions(); if (!typeConversions.isEmpty()) { s << "\n// Primitive Type converters.\n\n"; for (const auto &conversion : typeConversions) { diff --git a/sources/shiboken6/generator/shiboken/headergenerator.cpp b/sources/shiboken6/generator/shiboken/headergenerator.cpp index a0a5c5696..3b52132b0 100644 --- a/sources/shiboken6/generator/shiboken/headergenerator.cpp +++ b/sources/shiboken6/generator/shiboken/headergenerator.cpp @@ -109,6 +109,9 @@ void HeaderGenerator::generateClass(TextStream &s, const GeneratorContext &class //Includes auto typeEntry = metaClass->typeEntry(); s << typeEntry->include() << '\n'; + for (auto &inst : metaClass->templateBaseClassInstantiations()) + s << inst.typeEntry()->include(); + if (classContext.useWrapper() && !typeEntry->extraIncludes().isEmpty()) { s << "\n// Extra includes\n"; for (const Include &inc : typeEntry->extraIncludes()) |
