diff options
Diffstat (limited to 'generator/shiboken2/headergenerator.cpp')
-rw-r--r-- | generator/shiboken2/headergenerator.cpp | 66 |
1 files changed, 57 insertions, 9 deletions
diff --git a/generator/shiboken2/headergenerator.cpp b/generator/shiboken2/headergenerator.cpp index 950e938..ea308f5 100644 --- a/generator/shiboken2/headergenerator.cpp +++ b/generator/shiboken2/headergenerator.cpp @@ -38,11 +38,23 @@ #include <QtCore/QRegExp> #include <QtCore/QDebug> -QString HeaderGenerator::fileNameForClass(const AbstractMetaClass* metaClass) const +QString HeaderGenerator::fileNamePrefix() const { - QString result = metaClass->qualifiedCppName().toLower(); - result.replace(QLatin1String("::"), QLatin1String("_")); - return result + QLatin1String("_wrapper.h"); + return QLatin1String("_wrapper.h"); +} + +QString HeaderGenerator::fileNameForContext(GeneratorContext &context) const +{ + const AbstractMetaClass *metaClass = context.metaClass(); + if (!context.forSmartPointer()) { + QString fileNameBase = metaClass->qualifiedCppName().toLower(); + fileNameBase.replace(QLatin1String("::"), QLatin1String("_")); + return fileNameBase + fileNamePrefix(); + } else { + const AbstractMetaType *smartPointerType = context.preciseType(); + QString fileNameBase = getFileNameBaseForSmartPointer(smartPointerType, metaClass); + return fileNameBase + fileNamePrefix(); + } } void HeaderGenerator::writeCopyCtor(QTextStream& s, const AbstractMetaClass* metaClass) const @@ -78,8 +90,9 @@ void HeaderGenerator::writeProtectedFieldAccessors(QTextStream& s, const Abstrac << " { " << fieldName << " = value; }" << endl; } -void HeaderGenerator::generateClass(QTextStream& s, const AbstractMetaClass* metaClass) +void HeaderGenerator::generateClass(QTextStream &s, GeneratorContext &classContext) { + AbstractMetaClass *metaClass = classContext.metaClass(); if (ReportHandler::isDebug(ReportHandler::SparseDebug)) qCDebug(lcShiboken) << "Generating header for " << metaClass->fullName(); m_inheritedOverloads.clear(); @@ -88,8 +101,13 @@ void HeaderGenerator::generateClass(QTextStream& s, const AbstractMetaClass* met // write license comment s << licenseComment(); - QString wrapperName = HeaderGenerator::wrapperName(metaClass); - QString headerGuard = wrapperName.replace(QLatin1String("::"), QLatin1String("_")).toUpper(); + QString wrapperName; + if (!classContext.forSmartPointer()) { + wrapperName = HeaderGenerator::wrapperName(metaClass); + } else { + wrapperName = HeaderGenerator::wrapperName(classContext.preciseType()); + } + QString headerGuard = getFilteredCppSignatureString(wrapperName).toUpper(); // Header s << "#ifndef SBK_" << headerGuard << "_H" << endl; @@ -297,17 +315,35 @@ bool HeaderGenerator::finishGeneration() writeTypeIndexDefine(macrosStream, metaClass); lookForEnumsInClassesNotToBeGenerated(globalEnums, metaClass); } + foreach (const AbstractMetaEnum* metaEnum, globalEnums) writeTypeIndexDefineLine(macrosStream, metaEnum->typeEntry()); + + // Write the smart pointer define indexes. + int smartPointerCountIndex = getMaxTypeIndex(); + int smartPointerCount = 0; + foreach (const AbstractMetaType *metaType, instantiatedSmartPointers()) { + QString variableName = getTypeIndexVariableName(metaType); + macrosStream << "#define "; + macrosStream.setFieldWidth(60); + macrosStream << variableName; + macrosStream.setFieldWidth(0); + macrosStream << ' ' << smartPointerCountIndex << " // " << metaType->cppSignature() + << endl; + ++smartPointerCountIndex; + ++smartPointerCount; + } + + macrosStream << "#define "; macrosStream.setFieldWidth(60); macrosStream << QLatin1String("SBK_") + moduleName() + QLatin1String("_IDX_COUNT"); macrosStream.setFieldWidth(0); - macrosStream << ' ' << getMaxTypeIndex() << endl << endl; + macrosStream << ' ' << getMaxTypeIndex() + smartPointerCount << endl << endl; macrosStream << "// This variable stores all Python types exported by this module." << endl; macrosStream << "extern PyTypeObject** " << cppApiVariableName() << ';' << endl << endl; macrosStream << "// This variable stores all type converters exported by this module." << endl; - macrosStream << "extern SbkConverter** " << convertersVariableName() << ';' << endl << endl;; + macrosStream << "extern SbkConverter** " << convertersVariableName() << ';' << endl << endl; // TODO-CONVERTER ------------------------------------------------------------------------------ // Using a counter would not do, a fix must be made to APIExtractor's getTypeIndex(). @@ -375,6 +411,12 @@ bool HeaderGenerator::finishGeneration() writeSbkTypeFunction(typeFunctions, metaClass); } + foreach (const AbstractMetaType *metaType, instantiatedSmartPointers()) { + const TypeEntry *classType = metaType->typeEntry(); + includes << classType->include(); + writeSbkTypeFunction(typeFunctions, metaType); + } + QString moduleHeaderFileName(outputDirectory() + QDir::separator() + subDirectoryForPackage(packageName()) + QDir::separator() + getModuleHeaderFileName()); @@ -480,6 +522,12 @@ void HeaderGenerator::writeSbkTypeFunction(QTextStream& s, const AbstractMetaCla << "{ return reinterpret_cast<PyTypeObject*>(" << cpythonTypeNameExt(cppClass->typeEntry()) << "); }\n"; } +void HeaderGenerator::writeSbkTypeFunction(QTextStream &s, const AbstractMetaType *metaType) +{ + s << "template<> inline PyTypeObject* SbkType< ::" << metaType->cppSignature() << " >() " + << "{ return reinterpret_cast<PyTypeObject*>(" << cpythonTypeNameExt(metaType) << "); }\n"; +} + void HeaderGenerator::writeInheritedOverloads(QTextStream& s) { foreach (const AbstractMetaFunction* func, m_inheritedOverloads) { |