aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-08-23 14:25:27 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-08-24 12:58:38 +0200
commit240a7a92e657cf1ab39b7aa6a6eb01e9269cb10b (patch)
tree1f1c8deb8f8502605ee261bcccc4017b64da4be3
parent2fad8803d51631c85e055c2ca865c08ccbc269f7 (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.cpp152
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.h2
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;