diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-08-23 14:25:27 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-08-24 12:58:38 +0200 |
| commit | 240a7a92e657cf1ab39b7aa6a6eb01e9269cb10b (patch) | |
| tree | 1f1c8deb8f8502605ee261bcccc4017b64da4be3 | |
| parent | 2fad8803d51631c85e055c2ca865c08ccbc269f7 (diff) | |
shiboken6: Split the enum converter initialization functions
writeEnumConverterInitialization() also wrote the code for flags and
called itself. Disentangle this by splitting out the flags code to
writeFlagsConverterInitialization() for clarity. Use the new indenter
to further streamline the code.
Task-number: PYSIDE-1735
Change-Id: I2a8d4970f5bdbbbdf865167cf9a5017e4ef17cb1
Reviewed-by: Christian Tismer <tismer@stackless.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
| -rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.cpp | 152 | ||||
| -rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.h | 2 |
2 files changed, 79 insertions, 75 deletions
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index 0031fa90e..6540baf03 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -4388,92 +4388,96 @@ void CppGenerator::writePrimitiveConverterInitialization(TextStream &s, writeCustomConverterRegister(s, customConversion, converter); } -void CppGenerator::writeEnumConverterInitialization(TextStream &s, const AbstractMetaEnum &metaEnum) +static void registerEnumConverterScopes(TextStream &s, QString signature) +{ + while (true) { + s << "Shiboken::Conversions::registerConverterName(converter, \"" + << signature << "\");\n"; + const int qualifierPos = signature.indexOf(u"::"); + if (qualifierPos != -1) + signature.remove(0, qualifierPos + 2); + else + break; + } +} + +void CppGenerator::writeFlagsConverterInitialization(TextStream &s, const FlagsTypeEntry *flags) { - if (metaEnum.isPrivate() || metaEnum.isAnonymous()) - return; - writeEnumConverterInitialization(s, metaEnum.typeEntry()); + static const char enumPythonVar[] = "FType"; + + const QString qualifiedCppName = flags->qualifiedCppName(); + s << "// Register converter for flag '" << qualifiedCppName << "'.\n{\n" + << indent; + QString typeName = fixedCppTypeName(flags); + s << "SbkConverter *converter = Shiboken::Conversions::createConverter(" + << enumPythonVar << ',' << '\n' << indent + << cppToPythonFunctionName(typeName, typeName) << ");\n" << outdent; + + const QString enumTypeName = fixedCppTypeName(flags->originator()); + QString toCpp = pythonToCppFunctionName(enumTypeName, typeName); + QString isConv = convertibleToCppFunctionName(enumTypeName, typeName); + writeAddPythonToCppConversion(s, u"converter"_s, toCpp, isConv); + toCpp = pythonToCppFunctionName(typeName, typeName); + isConv = convertibleToCppFunctionName(typeName, typeName); + writeAddPythonToCppConversion(s, u"converter"_s, toCpp, isConv); + toCpp = pythonToCppFunctionName(u"number"_s, typeName); + isConv = convertibleToCppFunctionName(u"number"_s, typeName); + writeAddPythonToCppConversion(s, u"converter"_s, toCpp, isConv); + s << "Shiboken::Enum::setTypeConverter(" << enumPythonVar + << ", converter, true);\n"; + // Replace "QFlags<Class::Option>" by "Class::Options" + QString signature = qualifiedCppName; + if (qualifiedCppName.startsWith(u"QFlags<") && qualifiedCppName.endsWith(u'>')) { + signature.chop(1); + signature.remove(0, 7); + const int lastQualifierPos = signature.lastIndexOf(u"::"); + if (lastQualifierPos != -1) { + signature.replace(lastQualifierPos + 2, signature.size() - lastQualifierPos - 2, + flags->flagsName()); + } else { + signature = flags->flagsName(); + } + } + + registerEnumConverterScopes(s, signature); + + // PYSIDE-1673: Also register "QFlags<Class::Option>" purely for + // the purpose of finding the converter by QVariant::typeName() + // in the QVariant conversion code. + s << "Shiboken::Conversions::registerConverterName(converter, \"" + << flags->name() << "\");\n" + << outdent << "}\n"; } -void CppGenerator::writeEnumConverterInitialization(TextStream &s, const TypeEntry *enumType) +void CppGenerator::writeEnumConverterInitialization(TextStream &s, const AbstractMetaEnum &metaEnum) { - if (!enumType) + if (metaEnum.isPrivate() || metaEnum.isAnonymous()) return; - QString enumFlagName = enumType->isFlags() ? u"flag"_s : u"enum"_s; - QString enumPythonVar = enumType->isFlags() ? u"FType"_s : u"EType"_s; - - const FlagsTypeEntry *flags = nullptr; - if (enumType->isFlags()) - flags = static_cast<const FlagsTypeEntry *>(enumType); + const EnumTypeEntry *enumType = metaEnum.typeEntry(); + Q_ASSERT(enumType); - s << "// Register converter for " << enumFlagName << " '" << enumType->qualifiedCppName() - << "'.\n{\n"; - { - Indentation indent(s); - QString typeName = fixedCppTypeName(enumType); - s << "SbkConverter *converter = Shiboken::Conversions::createConverter(" - << enumPythonVar << ',' << '\n'; - { - Indentation indent(s); - s << cppToPythonFunctionName(typeName, typeName) << ");\n"; - } + static const char enumPythonVar[] = "EType"; - if (flags) { - QString enumTypeName = fixedCppTypeName(flags->originator()); - QString toCpp = pythonToCppFunctionName(enumTypeName, typeName); - QString isConv = convertibleToCppFunctionName(enumTypeName, typeName); - writeAddPythonToCppConversion(s, u"converter"_s, toCpp, isConv); - } + s << "// Register converter for enum '" << enumType->qualifiedCppName() + << "'.\n{\n" << indent; - QString toCpp = pythonToCppFunctionName(typeName, typeName); - QString isConv = convertibleToCppFunctionName(typeName, typeName); - writeAddPythonToCppConversion(s, u"converter"_s, toCpp, isConv); + const QString typeName = fixedCppTypeName(enumType); + s << "SbkConverter *converter = Shiboken::Conversions::createConverter(" + << enumPythonVar << ',' << '\n' << indent + << cppToPythonFunctionName(typeName, typeName) << ");\n" << outdent; - if (flags) { - QString toCpp = pythonToCppFunctionName(u"number"_s, typeName); - QString isConv = convertibleToCppFunctionName(u"number"_s, typeName); - writeAddPythonToCppConversion(s, u"converter"_s, toCpp, isConv); - } - - s << "Shiboken::Enum::setTypeConverter(" << enumPythonVar - << ", converter, " << (enumType->isFlags() ? "true" : "false") << ");\n"; - - QString signature = enumType->qualifiedCppName(); - // Replace "QFlags<Class::Option>" by "Class::Options" - if (flags && signature.startsWith(u"QFlags<") && signature.endsWith(u'>')) { - signature.chop(1); - signature.remove(0, 7); - const int lastQualifierPos = signature.lastIndexOf(u"::"); - if (lastQualifierPos != -1) { - signature.replace(lastQualifierPos + 2, signature.size() - lastQualifierPos - 2, - flags->flagsName()); - } else { - signature = flags->flagsName(); - } - } + const QString toCpp = pythonToCppFunctionName(typeName, typeName); + const QString isConv = convertibleToCppFunctionName(typeName, typeName); + writeAddPythonToCppConversion(s, u"converter"_s, toCpp, isConv); + s << "Shiboken::Enum::setTypeConverter(" << enumPythonVar + << ", converter, false);\n"; - while (true) { - s << "Shiboken::Conversions::registerConverterName(converter, \"" - << signature << "\");\n"; - const int qualifierPos = signature.indexOf(u"::"); - if (qualifierPos != -1) - signature.remove(0, qualifierPos + 2); - else - break; - } - if (flags) { - // PYSIDE-1673: Also register "QFlags<Class::Option>" purely for - // the purpose of finding the converter by QVariant::typeName() - // in the QVariant conversion code. - s << "Shiboken::Conversions::registerConverterName(converter, \"" - << flags->name() << "\");\n"; - } + registerEnumConverterScopes(s, enumType->qualifiedCppName()); - } - s << "}\n"; + s << outdent << "}\n"; - if (!flags) - writeEnumConverterInitialization(s, static_cast<const EnumTypeEntry *>(enumType)->flags()); + if (auto *flags = enumType->flags()) + writeFlagsConverterInitialization(s, flags); } QString CppGenerator::writeContainerConverterInitialization(TextStream &s, const AbstractMetaType &type) const diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.h b/sources/shiboken6/generator/shiboken/cppgenerator.h index 77d06f53a..615a0f775 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.h +++ b/sources/shiboken6/generator/shiboken/cppgenerator.h @@ -452,7 +452,7 @@ private: static void writePrimitiveConverterInitialization(TextStream &s, const CustomConversion *customConversion); - static void writeEnumConverterInitialization(TextStream &s, const TypeEntry *enumType); + static void writeFlagsConverterInitialization(TextStream &s, const FlagsTypeEntry *enumType); static void writeEnumConverterInitialization(TextStream &s, const AbstractMetaEnum &metaEnum); QString writeContainerConverterInitialization(TextStream &s, const AbstractMetaType &type) const; void writeSmartPointerConverterInitialization(TextStream &s, const AbstractMetaType &ype) const; |
