diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-06-09 15:09:16 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-06-09 15:09:18 +0200 |
commit | 98fe750774ac252fe35c42b752e68108b594e43f (patch) | |
tree | 849e9ad1f5e558d610a6d42711eb9f6b49e35e02 /sources/shiboken2/generator | |
parent | 2635541daec35024390dc973ff16e7603c94ce39 (diff) | |
parent | 6d8dee0c92dc914a501e2e0fe3a5e044f5d6d872 (diff) |
Merge remote-tracking branch 'origin/5.6' into 5.9
Change-Id: I73f39966a2af7aa935e1890e29c9b71573aae97c
Diffstat (limited to 'sources/shiboken2/generator')
-rw-r--r-- | sources/shiboken2/generator/shiboken2/cppgenerator.cpp | 11 | ||||
-rw-r--r-- | sources/shiboken2/generator/shiboken2/headergenerator.cpp | 39 |
2 files changed, 32 insertions, 18 deletions
diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index 6aa2c83df..91ed7eec5 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -265,17 +265,6 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext) headerfile.replace(QLatin1String(".cpp"), QLatin1String(".h")); s << endl << "// main header" << endl << "#include \"" << headerfile << '"' << endl; - // PYSIDE-500: Use also includes for inherited wrapper classes, because - // without the protected hack, we sometimes need to cast inherited wrappers. - s << endl << "// inherited wrapper classes" << endl; - AbstractMetaClass *basis = metaClass->baseClass(); - for (; basis; basis = basis->baseClass()) { - GeneratorContext basisContext(basis); - QString headerfile = fileNameForContext(basisContext); - headerfile.replace(QLatin1String(".cpp"), QLatin1String(".h")); - s << "#include \"" << headerfile << '"' << endl; - } - s << endl << "// inner classes" << endl; const AbstractMetaClassList &innerClasses = metaClass->innerClasses(); for (AbstractMetaClass *innerClass : innerClasses) { diff --git a/sources/shiboken2/generator/shiboken2/headergenerator.cpp b/sources/shiboken2/generator/shiboken2/headergenerator.cpp index 6b8185dc9..9fde98d91 100644 --- a/sources/shiboken2/generator/shiboken2/headergenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/headergenerator.cpp @@ -106,11 +106,12 @@ void HeaderGenerator::generateClass(QTextStream &s, GeneratorContext &classConte } else { wrapperName = HeaderGenerator::wrapperName(classContext.preciseType()); } - QString headerGuard = getFilteredCppSignatureString(wrapperName).toUpper(); + QString outerHeaderGuard = getFilteredCppSignatureString(wrapperName).toUpper(); + QString innerHeaderGuard; // Header - s << "#ifndef SBK_" << headerGuard << "_H" << endl; - s << "#define SBK_" << headerGuard << "_H" << endl<< endl; + s << "#ifndef SBK_" << outerHeaderGuard << "_H" << endl; + s << "#define SBK_" << outerHeaderGuard << "_H" << endl << endl; if (!avoidProtectedHack()) s << "#define protected public" << endl << endl; @@ -120,10 +121,16 @@ void HeaderGenerator::generateClass(QTextStream &s, GeneratorContext &classConte //Includes s << metaClass->typeEntry()->include() << endl; - if (shouldGenerateCppWrapper(metaClass)) { + if (shouldGenerateCppWrapper(metaClass) && + usePySideExtensions() && metaClass->isQObject()) + s << "namespace PySide { class DynamicQMetaObject; }\n\n"; - if (usePySideExtensions() && metaClass->isQObject()) - s << "namespace PySide { class DynamicQMetaObject; }\n\n"; + while (shouldGenerateCppWrapper(metaClass)) { + if (!innerHeaderGuard.isEmpty()) { + s << "# ifndef SBK_" << innerHeaderGuard << "_H" << endl; + s << "# define SBK_" << innerHeaderGuard << "_H" << endl << endl; + s << "// Inherited base class:" << endl; + } // Class s << "class " << wrapperName; @@ -173,15 +180,33 @@ void HeaderGenerator::generateClass(QTextStream &s, GeneratorContext &classConte if (m_inheritedOverloads.size()) { s << INDENT << "// Inherited overloads, because the using keyword sux" << endl; writeInheritedOverloads(s); + m_inheritedOverloads.clear(); } if (usePySideExtensions()) s << INDENT << "static void pysideInitQtMetaTypes();" << endl; s << "};" << endl << endl; + if (!innerHeaderGuard.isEmpty()) + s << "# endif // SBK_" << innerHeaderGuard << "_H" << endl << endl; + + // PYSIDE-500: Use also includes for inherited wrapper classes, because + // without the protected hack, we sometimes need to cast inherited wrappers. + // But we don't use multiple include files. Instead, they are inserted as recursive + // headers. This keeps the file structure as simple as before the enhanced inheritance. + metaClass = metaClass->baseClass(); + if (!metaClass || !avoidProtectedHack()) + break; + classContext = GeneratorContext(metaClass); + if (!classContext.forSmartPointer()) { + wrapperName = HeaderGenerator::wrapperName(metaClass); + } else { + wrapperName = HeaderGenerator::wrapperName(classContext.preciseType()); + } + innerHeaderGuard = getFilteredCppSignatureString(wrapperName).toUpper(); } - s << "#endif // SBK_" << headerGuard << "_H" << endl << endl; + s << "#endif // SBK_" << outerHeaderGuard << "_H" << endl << endl; } void HeaderGenerator::writeFunction(QTextStream& s, const AbstractMetaFunction* func) |