diff options
Diffstat (limited to 'sources/shiboken6/generator/shiboken/cppgenerator.h')
-rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.h | 260 |
1 files changed, 138 insertions, 122 deletions
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.h b/sources/shiboken6/generator/shiboken/cppgenerator.h index e2eace487..5920c9a3a 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.h +++ b/sources/shiboken6/generator/shiboken/cppgenerator.h @@ -5,7 +5,6 @@ #define CPPGENERATOR_H #include "shibokengenerator.h" -#include "abstractmetalang_enums.h" #include "include.h" #include "modifications_typedefs.h" @@ -14,6 +13,7 @@ #include <QtCore/QHash> #include <memory> +#include <utility> class OverloadDataNode; class OverloadDataRootNode; @@ -45,60 +45,61 @@ public: protected: QString fileNameForContext(const GeneratorContext &context) const override; - static QList<AbstractMetaFunctionCList> - filterGroupedOperatorFunctions(const AbstractMetaClassCPtr &metaClass, - OperatorQueryOptions query); void generateClass(TextStream &s, const GeneratorContext &classContext) override; bool finishGeneration() override; private: - struct BoolCastFunction + struct VirtualMethodReturn { - AbstractMetaFunctionCPtr function; - bool invert = false; // Function is isNull() (invert result). + QString statement; + bool needsReference = false; }; - using BoolCastFunctionOptional = std::optional<BoolCastFunction>; + void generateSmartPointerClass(TextStream &s, const GeneratorContext &classContext); void generateIncludes(TextStream &s, const GeneratorContext &classContext, const IncludeGroupList &includes = {}, const AbstractMetaClassCList &innerClasses = {}) const; - static void writeInitFunc(TextStream &declStr, TextStream &callStr, - const QString &initFunctionName, - const TypeEntryCPtr &enclosingEntry = {}); + static void writeInitFuncCall(TextStream &callStr, + const QString &functionName, + const TypeEntryCPtr &enclosingEntry, + const QString &pythonName, bool lazy = true); static void writeCacheResetNative(TextStream &s, const GeneratorContext &classContext); void writeConstructorNative(TextStream &s, const GeneratorContext &classContext, const AbstractMetaFunctionCPtr &func) const; - void writeDestructorNative(TextStream &s, const GeneratorContext &classContext) const; + static void writeDestructorNative(TextStream &s, const GeneratorContext &classContext); QString getVirtualFunctionReturnTypeName(const AbstractMetaFunctionCPtr &func) const; - static QPair<QString, QChar> - virtualMethodNativeArg(const AbstractMetaFunctionCPtr &func, + static std::pair<QString, QChar> virtualMethodNativeArg(const AbstractMetaFunctionCPtr &func, const AbstractMetaArgument &arg); - void writeVirtualMethodNativeVectorCallArgs(TextStream &s, - const AbstractMetaFunctionCPtr &func, - const AbstractMetaArgumentList &arguments, - const QList<int> &invalidateArgs) const; - void writeVirtualMethodNativeArgs(TextStream &s, - const AbstractMetaFunctionCPtr &func, - const AbstractMetaArgumentList &arguments, - const QList<int> &invalidateArgs) const; - void writeVirtualMethodNative(TextStream &s, const AbstractMetaFunctionCPtr &func, + static void writeVirtualMethodNativeVectorCallArgs(TextStream &s, + const AbstractMetaFunctionCPtr &func, + const AbstractMetaArgumentList &arguments, + const QList<int> &invalidateArgs); + static void writeVirtualMethodNativeArgs(TextStream &s, + const AbstractMetaFunctionCPtr &func, + const AbstractMetaArgumentList &arguments, + const QList<int> &invalidateArgs); + void writeVirtualMethodNative(TextStream &s, + const AbstractMetaFunctionCPtr &func, int cacheIndex) const; + void writeVirtualMethodPythonOverride(TextStream &s, + const AbstractMetaFunctionCPtr &func, + const CodeSnipList &snips, + const VirtualMethodReturn &returnStatement) const; + void writeUserAddedPythonOverride(TextStream &s, + const AbstractMetaFunctionCPtr &func) const; void writeVirtualMethodCppCall(TextStream &s, const AbstractMetaFunctionCPtr &func, const QString &funcName, const QList<CodeSnip> &snips, const AbstractMetaArgument *lastArg, const TypeEntryCPtr &retType, const QString &returnStatement, bool hasGil) const; - static QString virtualMethodReturn(TextStream &s, const ApiExtractorResult &api, - const AbstractMetaFunctionCPtr &func, - const FunctionModificationList &functionModifications); + + static VirtualMethodReturn virtualMethodReturn(const ApiExtractorResult &api, + const AbstractMetaFunctionCPtr &func, + const FunctionModificationList &functionModifications); void writeMetaObjectMethod(TextStream &s, const GeneratorContext &classContext) const; static void writeMetaCast(TextStream &s, const GeneratorContext &classContext); - void writeFlagsConverterFunctions(TextStream &s, const FlagsTypeEntryCPtr &flagsType, - const QString &enumTypeName, - const QString &flagsCppTypeName, - const QString &enumTypeCheck) const; void writeEnumConverterFunctions(TextStream &s, const AbstractMetaEnum &metaEnum) const; void writeConverterFunctions(TextStream &s, const AbstractMetaClassCPtr &metaClass, const GeneratorContext &classContext) const; @@ -132,11 +133,13 @@ private: void writeSmartPointerConverterFunctions(TextStream &s, const AbstractMetaType &smartPointerType) const; - bool needsArgumentErrorHandling(const OverloadData &overloadData) const; - void writeMethodWrapperPreamble(TextStream &s, const OverloadData &overloadData, - const GeneratorContext &context, - ErrorReturn errorReturn = ErrorReturn::Default) const; - void writeConstructorWrapper(TextStream &s, const OverloadData &overloadData, + static bool needsArgumentErrorHandling(const OverloadData &overloadData); + static void writeMethodWrapperPreamble(TextStream &s, + const OverloadData &overloadData, + const GeneratorContext &context, + ErrorReturn errorReturn = ErrorReturn::Default); + void writeConstructorWrapper(TextStream &s, + const OverloadData &overloadData, const GeneratorContext &classContext) const; void writeMethodWrapper(TextStream &s, const OverloadData &overloadData, const GeneratorContext &classContext) const; @@ -152,22 +155,29 @@ private: bool useWrapperClass); static void writeSmartPointerCppSelfConversion(TextStream &s, const GeneratorContext &context); + + static void writeCppSelfVarDef(TextStream &s, CppSelfDefinitionFlags flags = {}); static void writeSmartPointerCppSelfDefinition(TextStream &s, const GeneratorContext &, ErrorReturn errorReturn = ErrorReturn::Default, CppSelfDefinitionFlags flags = {}); - void writeCppSelfDefinition(TextStream &s, - const AbstractMetaFunctionCPtr &func, - const GeneratorContext &context, - ErrorReturn errorReturn = ErrorReturn::Default, - CppSelfDefinitionFlags flags = {}) const; - void writeCppSelfDefinition(TextStream &s, - const GeneratorContext &context, - ErrorReturn errorReturn = ErrorReturn::Default, - CppSelfDefinitionFlags flags = {}) const; - - static void writeErrorSection(TextStream &s, const OverloadData &overloadData, + static void writeCppSelfDefinition(TextStream &s, + const AbstractMetaFunctionCPtr &func, + const GeneratorContext &context, + ErrorReturn errorReturn = ErrorReturn::Default, + CppSelfDefinitionFlags flags = {}); + static void writeCppSelfDefinition(TextStream &s, + const GeneratorContext &context, + ErrorReturn errorReturn = ErrorReturn::Default, + CppSelfDefinitionFlags flags = {}); + + static void writeErrorSection(TextStream &s, + const OverloadData &overloadData, ErrorReturn errorReturn); + + static QString returnErrorWrongArguments(const OverloadData &overloadData, + ErrorReturn errorReturn); + static void writeFunctionReturnErrorCheckSection(TextStream &s, ErrorReturn errorReturn, bool hasReturnValue = true); @@ -184,14 +194,17 @@ private: static void writeTypeCheck(TextStream& s, const std::shared_ptr<OverloadDataNode> &overloadData, const QString &argumentName); + static void replacePolymorphicIdPlaceHolders(const AbstractMetaClassCPtr &metaClass, + QString *id); static void writeTypeDiscoveryFunction(TextStream &s, const AbstractMetaClassCPtr &metaClass); - void writeSetattroDefinition(TextStream &s, const AbstractMetaClassCPtr &metaClass) const; + static void writeSetattroDefinition(TextStream &s, const AbstractMetaClassCPtr &metaClass); static void writeSetattroDefaultReturn(TextStream &s); - void writeSmartPointerSetattroFunction(TextStream &s, - const GeneratorContext &context) const; - void writeSetattroFunction(TextStream &s, AttroCheck attroCheck, + static void writeSmartPointerSetattroFunction(TextStream &s, + const GeneratorContext &context); + void writeSetattroFunction(TextStream &s, + AttroCheck attroCheck, const GeneratorContext &context) const; static void writeGetattroDefinition(TextStream &s, const AbstractMetaClassCPtr &metaClass); static void writeSmartPointerGetattroFunction(TextStream &s, @@ -201,11 +214,10 @@ private: const GeneratorContext &context) const; QString qObjectGetAttroFunction() const; - void writeNbBoolFunction(const GeneratorContext &context, - const BoolCastFunction &f, - TextStream &s) const; - static void writeNbBoolExpression(TextStream &s, const BoolCastFunction &f, - bool invert = false); + static void writeNbBoolFunction(const GeneratorContext &context, + const BoolCastFunction &f, + TextStream &s); + static void writeNbBoolExpression(TextStream &s, const BoolCastFunction &f, bool invert = false); /** * Writes Python to C++ conversions for arguments on Python wrappers. @@ -272,7 +284,8 @@ private: * \param s text stream to write * \param overloadData the overload data describing all the possible overloads for the function/method */ - void writeOverloadedFunctionDecisor(TextStream &s, const OverloadData &overloadData) const; + void writeOverloadedFunctionDecisor(TextStream &s, const OverloadData &overloadData, + ErrorReturn errorReturn) const; /// Recursive auxiliar method to the other writeOverloadedFunctionDecisor. void writeOverloadedFunctionDecisorEngine(TextStream &s, const OverloadData &overloadData, @@ -354,8 +367,11 @@ private: const QString &pythonToCppFunc, const QString &isConvertibleFunc); - void writeNamedArgumentResolution(TextStream &s, const AbstractMetaFunctionCPtr &func, - bool usePyArgs, const OverloadData &overloadData) const; + static void writeNamedArgumentResolution(TextStream &s, + const AbstractMetaFunctionCPtr &func, + bool usePyArgs, + const OverloadData &overloadData, + ErrorReturn errorReturn); /// Returns a string containing the name of an argument for the given function and argument index. static QString argumentNameFromIndex(const ApiExtractorResult &api, @@ -379,12 +395,14 @@ private: static void writeSignatureStrings(TextStream &s, const QString &signatures, const QString &arrayName, const char *comment); + void writeInitInheritance(TextStream &s) const; void writeClassRegister(TextStream &s, const AbstractMetaClassCPtr &metaClass, const GeneratorContext &classContext, const QString &signatures) const; - QString destructorClassName(const AbstractMetaClassCPtr &metaClass, - const GeneratorContext &classContext) const; + static QStringList pyBaseTypes(const AbstractMetaClassCPtr &metaClass); + static QString destructorClassName(const AbstractMetaClassCPtr &metaClass, + const GeneratorContext &classContext); static void writeStaticFieldInitialization(TextStream &s, const AbstractMetaClassCPtr &metaClass); void writeClassDefinition(TextStream &s, @@ -395,6 +413,7 @@ private: void writeSignatureInfo(TextStream &s, const OverloadData &overloads) const; QString signatureParameter(const AbstractMetaArgument &arg) const; + QString pythonSignature(const AbstractMetaType &type) const; /// Writes the implementation of all methods part of python sequence protocol void writeSequenceMethods(TextStream &s, const AbstractMetaClassCPtr &metaClass, @@ -414,60 +433,40 @@ private: static void writeTpTraverseFunction(TextStream &s, const AbstractMetaClassCPtr &metaClass); static void writeTpClearFunction(TextStream &s, const AbstractMetaClassCPtr &metaClass); - void writeCopyFunction(TextStream &s, const GeneratorContext &context) const; - - QString cppFieldAccess(const AbstractMetaField &metaField, - const GeneratorContext &context) const; - void writeGetterFunction(TextStream &s, - const AbstractMetaField &metaField, - const GeneratorContext &context) const; - void writeGetterFunction(TextStream &s, - const QPropertySpec &property, - const GeneratorContext &context) const; - void writeSetterFunctionPreamble(TextStream &s, - const QString &name, - const QString &funcName, - const AbstractMetaType &type, - const GeneratorContext &context) const; - void writeSetterFunction(TextStream &s, - const AbstractMetaField &metaField, - const GeneratorContext &context) const; - void writeSetterFunction(TextStream &s, - const QPropertySpec &property, - const GeneratorContext &context) const; - - void writeRichCompareFunctionHeader(TextStream &s, - const QString &baseName, - const GeneratorContext &context) const; - static void writeRichCompareFunctionFooter(TextStream &s, + static QString writeCopyFunction(TextStream &s, TextStream &definitionStream, + TextStream &signatureStream, const GeneratorContext &context); + + static QString cppFieldAccess(const AbstractMetaField &metaField, + const GeneratorContext &context); + static void writeGetterFunction(TextStream &s, + const AbstractMetaField &metaField, + const GeneratorContext &context); + static void writeGetterFunction(TextStream &s, + const QPropertySpec &property, + const GeneratorContext &context); + static void writeSetterFunctionPreamble(TextStream &s, + const QString &name, + const QString &funcName, + const AbstractMetaType &type, + const GeneratorContext &context); + static void writeSetterFunction(TextStream &s, + const AbstractMetaField &metaField, + const GeneratorContext &context); + static void writeSetterFunction(TextStream &s, + const QPropertySpec &property, + const GeneratorContext &context); + + static void writeRichCompareFunctionHeader(TextStream &s, const QString &baseName, - bool writeLabel); + const GeneratorContext &context); void writeRichCompareFunction(TextStream &s, const GeneratorContext &context) const; void writeSmartPointerRichCompareFunction(TextStream &s, const GeneratorContext &context) const; - void writeEnumsInitialization(TextStream &s, AbstractMetaEnumList &enums, - ErrorReturn errorReturn) const; - void writeEnumInitialization(TextStream &s, const AbstractMetaEnum &metaEnum, - ErrorReturn errorReturn) const; + static void writeEnumsInitialization(TextStream &s, AbstractMetaEnumList &enums); + static bool writeEnumInitialization(TextStream &s, const AbstractMetaEnum &metaEnum); static void writeSignalInitialization(TextStream &s, const AbstractMetaClassCPtr &metaClass); - static void writeFlagsMethods(TextStream &s, const AbstractMetaEnum &cppEnum); - static void writeFlagsToLong(TextStream &s, const AbstractMetaEnum &cppEnum); - static void writeFlagsNonZero(TextStream &s, const AbstractMetaEnum &cppEnum); - static void writeFlagsNumberMethodsDefinition(TextStream &s, const AbstractMetaEnum &cppEnum); - static void writeFlagsNumberMethodsDefinitions(TextStream &s, - const AbstractMetaEnumList &enums); - static void writeFlagsBinaryOperator(TextStream &s, - const AbstractMetaEnum &cppEnum, - const QString &pyOpName, - const QString &cppOpName); - static void writeFlagsUnaryOperator(TextStream &s, - const AbstractMetaEnum &cppEnum, - const QString &pyOpName, - const QString &cppOpName, - bool boolResult = false); - /// Writes the function that registers the multiple inheritance information /// for the classes that need it. static void writeMultipleInheritanceInitializerFunction(TextStream &s, @@ -478,10 +477,13 @@ private: static void writePrimitiveConverterInitialization(TextStream &s, const CustomConversionPtr &customConversion); - static void writeFlagsConverterInitialization(TextStream &s, const FlagsTypeEntryCPtr &enumType); static void writeEnumConverterInitialization(TextStream &s, const AbstractMetaEnum &metaEnum); - QString writeContainerConverterInitialization(TextStream &s, const AbstractMetaType &type) const; + static QString writeContainerConverterInitialization(TextStream &s, + const AbstractMetaType &type, + const ApiExtractorResult &api); void writeSmartPointerConverterInitialization(TextStream &s, const AbstractMetaType &ype) const; + + static QString typeInitStruct(const TypeEntryCPtr &te); static void writeExtendedConverterInitialization(TextStream &s, const TypeEntryCPtr &externalType, const AbstractMetaClassCList &conversions); @@ -508,7 +510,7 @@ private: static QStringList getAncestorMultipleInheritance(const AbstractMetaClassCPtr &metaClass); /// Returns true if the given class supports the python number protocol - bool supportsNumberProtocol(const AbstractMetaClassCPtr &metaClass) const; + static bool supportsNumberProtocol(const AbstractMetaClassCPtr &metaClass); /// Returns true if the given class supports the python sequence protocol static bool supportsSequenceProtocol(const AbstractMetaClassCPtr &metaClass) ; @@ -517,9 +519,10 @@ private: static bool supportsMappingProtocol(const AbstractMetaClassCPtr &metaClass) ; /// Returns true if generator should produce getters and setters for the given class. - bool shouldGenerateGetSetList(const AbstractMetaClassCPtr &metaClass) const; + static bool shouldGenerateGetSetList(const AbstractMetaClassCPtr &metaClass); - void writeHashFunction(TextStream &s, const GeneratorContext &context) const; + static bool hasHashFunction(const AbstractMetaClassCPtr &c); + static void writeHashFunction(TextStream &s, const GeneratorContext &context); /// Write default implementations for sequence protocol void writeDefaultSequenceMethods(TextStream &s, const GeneratorContext &context) const; @@ -527,23 +530,36 @@ private: static void writeIndexError(TextStream &s, const QString &errorMsg, ErrorReturn errorReturn); - QString writeReprFunction(TextStream &s, const GeneratorContext &context, - uint indirections) const; - - BoolCastFunctionOptional boolCast(const AbstractMetaClassCPtr &metaClass) const; - bool hasBoolCast(const AbstractMetaClassCPtr &metaClass) const + static QString writeReprFunctionHeader(TextStream &s, const GeneratorContext &context); + static QString writeReprFunction(TextStream &s, + const GeneratorContext &context, + uint indirections); + static QString writeSmartPointerReprFunction(TextStream &s, + const GeneratorContext &context); + static QString writeSmartPointerDirFunction(TextStream &s, + TextStream &definitionStream, + TextStream &signatureStream, + const GeneratorContext &context); + static void writeReprFunctionFooter(TextStream &s); + static void writePyMethodDefs(TextStream &s, const QString &className, + const QString &methodsDefinitions); + + void writeModuleCodeSnips(TextStream &s, const CodeSnipList &codeSnips, + TypeSystem::CodeSnipPosition position, + TypeSystem::Language language) const; + + static bool hasBoolCast(const AbstractMetaClassCPtr &metaClass) { return boolCast(metaClass).has_value(); } - std::optional<AbstractMetaType> - findSmartPointerInstantiation(const SmartPointerTypeEntryCPtr &pointer, - const TypeEntryCPtr &pointee) const; void clearTpFuncs(); + static QString chopType(QString s); QHash<QString, QString> m_tpFuncs; - - static const char *PYTHON_TO_CPPCONVERSION_STRUCT; + QHash<QString, QString> m_nbFuncs; }; Q_DECLARE_OPERATORS_FOR_FLAGS(CppGenerator::CppSelfDefinitionFlags) +TextStream &operator<<(TextStream &s, CppGenerator::ErrorReturn r); + #endif // CPPGENERATOR_H |