diff options
Diffstat (limited to 'sources/shiboken2/generator/generator.h')
-rw-r--r-- | sources/shiboken2/generator/generator.h | 433 |
1 files changed, 0 insertions, 433 deletions
diff --git a/sources/shiboken2/generator/generator.h b/sources/shiboken2/generator/generator.h deleted file mode 100644 index 5a55422a1..000000000 --- a/sources/shiboken2/generator/generator.h +++ /dev/null @@ -1,433 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt for Python. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef GENERATOR_H -#define GENERATOR_H - -#include "indentor.h" -#include <abstractmetalang_typedefs.h> -#include <typedatabase_typedefs.h> -#include <dependency.h> -#include <QtCore/QObject> -#include <QtCore/QSharedPointer> -#include <QtCore/QTextStream> -#include <QtCore/QVector> - -class ApiExtractor; -class AbstractMetaBuilder; -class AbstractMetaFunction; -class AbstractMetaClass; -class AbstractMetaEnum; -class TypeEntry; -class ComplexTypeEntry; -class AbstractMetaType; -class EnumTypeEntry; -class FlagsTypeEntry; - -QT_BEGIN_NAMESPACE -class QFile; -QT_END_NAMESPACE - -class PrimitiveTypeEntry; -class ContainerTypeEntry; - -QTextStream &formatCode(QTextStream &s, const QString &code, Indentor &indentor); -void verifyDirectoryFor(const QString &file); - -QString getClassTargetFullName(const AbstractMetaClass *metaClass, bool includePackageName = true); -QString getClassTargetFullName(const AbstractMetaEnum *metaEnum, bool includePackageName = true); -QString getClassTargetFullName(const AbstractMetaType *metaType, bool includePackageName = true); -QString getFilteredCppSignatureString(QString signature); - -/** - * PYSIDE-504: Handling the "protected hack" - * - * The problem: Creating wrappers when the class has private destructors. - * You can see an example on Windows in qclipboard_wrapper.h and others. - * Simply search for the text "// C++11: need to declare (unimplemented) destructor". - * - * The protected hack is the definition "#define protected public". - * For most compilers, this "hack" is enabled, because the problem of private - * destructors simply vanishes. - * - * If one does not want to use this hack, then a new problem arises: - * C++11 requires that a destructor is declared in a wrapper class when it is - * private in the base class. There is no implementation allowed! - * - * Unfortunately, MSVC in recent versions supports C++11, and due to restrictive - * rules, it is impossible to use the hack with this compiler. - * More unfortunate: Clang, when C++11 is enabled, also enforces a declaration - * of a private destructor, but it falsely then creates a linker error! - * - * Originally, we wanted to remove the protected hack. But due to the Clang - * problem, we gave up on removal of the protected hack and use it always - * when we can. This might change again when the Clang problem is solved. - */ - -#ifdef Q_CC_MSVC -const int alwaysGenerateDestructor = 1; -#else -const int alwaysGenerateDestructor = 0; -#endif - -class DefaultValue -{ -public: - enum Type - { - Error, - Boolean, - CppScalar, // A C++ scalar type (int,..) specified by value() - Custom, // A custom constructor/expression, uses value() as is - DefaultConstructor, // For classes named value() - DefaultConstructorWithDefaultValues, // as DefaultConstructor, but can't return {} though. - Enum, // Enum value as specified by value() - Pointer, // Pointer of type value() - Void // "", for return values only - }; - - explicit DefaultValue(Type t = Error, QString value = QString()); - explicit DefaultValue(QString customValue); - - bool isValid() const { return m_type != Error; } - - QString returnValue() const; - QString initialization() const; - QString constructorParameter() const; - - QString value() const { return m_value; } - void setValue(const QString &value) { m_value = value; } - - Type type() const { return m_type; } - void setType(Type type) { m_type = type; } - -private: - Type m_type; - QString m_value; -}; - -/** - * A GeneratorContext object contains a pointer to an AbstractMetaClass and/or a specialized - * AbstractMetaType, for which code is currently being generated. - * - * The main case is when the context contains only an AbstractMetaClass pointer, which is used - * by different methods to generate appropriate expressions, functions, type names, etc. - * - * The second case is for generation of code for smart pointers. In this case the m_metaClass member - * contains the generic template class of the smart pointer, and the m_preciseClassType member - * contains the instantiated template type, e.g. a concrete shared_ptr<int>. To - * distinguish this case, the member m_forSmartPointer is set to true. - * - * In the future the second case might be generalized for all template type instantiations. - */ -class GeneratorContext { - friend class ShibokenGenerator; - friend class Generator; -public: - enum Type { Class, WrappedClass, SmartPointer }; - - GeneratorContext() = default; - - const AbstractMetaClass *metaClass() const { return m_metaClass; } - const AbstractMetaType *preciseType() const { return m_preciseClassType; } - - bool forSmartPointer() const { return m_type == SmartPointer; } - bool useWrapper() const { return m_type == WrappedClass; } - - QString wrapperName() const - { - Q_ASSERT(m_type == WrappedClass); - return m_wrappername; - } - - QString smartPointerWrapperName() const; - -private: - const AbstractMetaClass *m_metaClass = nullptr; - const AbstractMetaType *m_preciseClassType = nullptr; - QString m_wrappername; - Type m_type = Class; -}; - -/** - * Base class for all generators. The default implementations does nothing, - * you must subclass this to create your own generators. - */ -class Generator -{ -public: - using OptionDescription = QPair<QString, QString>; - using OptionDescriptions = QVector<OptionDescription>; - - /// Optiosn used around the generator code - enum Option { - NoOption = 0x00000000, - ExcludeConst = 0x00000001, - ExcludeReference = 0x00000002, - - EnumAsInts = 0x00000004, - SkipName = 0x00000008, - SkipReturnType = 0x00000010, - OriginalName = 0x00000020, - VirtualCall = 0x00000040, - OriginalTypeDescription = 0x00000080, - SkipRemovedArguments = 0x00000100, - - SkipDefaultValues = 0x00000200, - - WriteSelf = 0x00000400, - ExcludeMethodConst = 0x00000800, - - ForceValueType = ExcludeReference | ExcludeConst - }; - Q_DECLARE_FLAGS(Options, Option) - - Generator(); - virtual ~Generator(); - - bool setup(const ApiExtractor &extractor); - - virtual OptionDescriptions options() const; - virtual bool handleOption(const QString &key, const QString &value); - - /// Returns the classes used to generate the binding code. - AbstractMetaClassList classes() const; - - /// Returns the output directory - QString outputDirectory() const; - - /// Set the output directory - void setOutputDirectory(const QString &outDir); - - /** - * Start the code generation, be sure to call setClasses before callign this method. - * For each class it creates a QTextStream, call the write method with the current - * class and the associated text stream, then write the text stream contents if needed. - * \see #write - */ - bool generate(); - - /// Returns the license comment to be prepended to each source file generated. - QString licenseComment() const; - - /// Sets the license comment to be prepended to each source file generated. - void setLicenseComment(const QString &licenseComment); - - /// Returns the generator's name. Used for cosmetic purposes. - virtual const char *name() const = 0; - - /** - * Retrieves the name of the currently processed module. - * While package name is a complete package idetification, e.g. 'PySide.QtCore', - * a module name represents the last part of the package, e.g. 'QtCore'. - * If the target language separates the modules with characters other than - * dots ('.') the generator subclass must overload this method. - * \return a string representing the last part of a package name - */ - QString moduleName() const; - - /** - * Retrieves a list of constructors used in implicit conversions - * available on the given type. The TypeEntry must be a value-type - * or else it will return an empty list. - * \param type a TypeEntry that is expected to be a value-type - * \return a list of constructors that could be used as implicit converters - */ - AbstractMetaFunctionList implicitConversions(const TypeEntry *type) const; - - /// Convenience function for implicitConversions(const TypeEntry *type). - AbstractMetaFunctionList implicitConversions(const AbstractMetaType *metaType) const; - - /// Check if type is a pointer. - static bool isPointer(const AbstractMetaType *type); - - /// Tells if the type or class is an Object (or QObject) Type. - static bool isObjectType(const TypeEntry *type); - static bool isObjectType(const ComplexTypeEntry *type); - static bool isObjectType(const AbstractMetaType *metaType); - static bool isObjectType(const AbstractMetaClass *metaClass); - - /// Returns true if the type is a C string (const char *). - static bool isCString(const AbstractMetaType *type); - /// Returns true if the type is a void pointer. - static bool isVoidPointer(const AbstractMetaType *type); - -protected: - /// Returns the classes, topologically ordered, used to generate the binding code. - /// - /// The classes are ordered such that derived classes appear later in the list than - /// their parent classes. - AbstractMetaClassList classesTopologicalSorted(const Dependencies &additionalDependencies = Dependencies()) const; - - /// Returns all global functions found by APIExtractor - AbstractMetaFunctionList globalFunctions() const; - - /// Returns all global enums found by APIExtractor - AbstractMetaEnumList globalEnums() const; - - /// Returns all primitive types found by APIExtractor - PrimitiveTypeEntryList primitiveTypes() const; - - /// Returns all container types found by APIExtractor - ContainerTypeEntryList containerTypes() const; - - /// Returns an AbstractMetaEnum for a given TypeEntry that is an EnumTypeEntry, or nullptr if not found. - const AbstractMetaEnum *findAbstractMetaEnum(const TypeEntry *typeEntry) const; - - /// Returns an AbstractMetaEnum for a given AbstractMetaType that holds an EnumTypeEntry, or nullptr if not found. - const AbstractMetaEnum *findAbstractMetaEnum(const AbstractMetaType *metaType) const; - - virtual GeneratorContext contextForClass(const AbstractMetaClass *c) const; - GeneratorContext contextForSmartPointer(const AbstractMetaClass *c, - const AbstractMetaType *t) const; - - /// Generates a file for given AbstractMetaClass or AbstractMetaType (smart pointer case). - bool generateFileForContext(const GeneratorContext &context); - - /// Returns the file base name for a smart pointer. - QString getFileNameBaseForSmartPointer(const AbstractMetaType *smartPointerType, - const AbstractMetaClass *smartPointerClass) const; - - /// Returns true if the generator should generate any code for the TypeEntry. - bool shouldGenerateTypeEntry(const TypeEntry *) const; - - /// Returns true if the generator should generate any code for the AbstractMetaClass. - virtual bool shouldGenerate(const AbstractMetaClass *) const; - - /// Returns the subdirectory used to write the binding code of an AbstractMetaClass. - virtual QString subDirectoryForClass(const AbstractMetaClass *clazz) const; - - /** - * Translate metatypes to binding source format. - * \param metatype a pointer to metatype - * \param context the current meta class - * \param option some extra options - * \return the metatype translated to binding source format - */ - QString translateType(const AbstractMetaType *metatype, - const AbstractMetaClass *context, - Options options = NoOption) const; - - /** - * Function used to write the fucntion arguments on the class buffer. - * \param s the class output buffer - * \param metafunction the pointer to metafunction information - * \param count the number of function arguments - * \param options some extra options used during the parser - */ - virtual void writeFunctionArguments(QTextStream &s, - const AbstractMetaFunction *metafunction, - Options options = NoOption) const = 0; - - virtual void writeArgumentNames(QTextStream &s, - const AbstractMetaFunction *metafunction, - Options options = NoOption) const = 0; - - void replaceTemplateVariables(QString &code, const AbstractMetaFunction *func); - - /** - * Returns the package name. - */ - QString packageName() const; - - // Returns the full name of the type. - QString getFullTypeName(const TypeEntry *type) const; - QString getFullTypeName(const AbstractMetaType *type) const; - QString getFullTypeName(const AbstractMetaClass *metaClass) const; - - /** - * Returns the full qualified C++ name for an AbstractMetaType, but removing modifiers - * as 'const', '&', and '*' (except if the class is not derived from a template). - * This is useful for instantiated templates. - */ - QString getFullTypeNameWithoutModifiers(const AbstractMetaType *type) const; - - /** - * Tries to build a minimal constructor for the type. - * It will check first for a user defined default constructor. - * Returns a null string if it fails. - */ - DefaultValue minimalConstructor(const TypeEntry *type) const; - DefaultValue minimalConstructor(const AbstractMetaType *type) const; - DefaultValue minimalConstructor(const AbstractMetaClass *metaClass) const; - - /** - * Returns the file name used to write the binding code of an AbstractMetaClass/Type. - * \param context the GeneratorContext which contains an AbstractMetaClass or AbstractMetaType - * for which the file name must be returned - * \return the file name used to write the binding code for the class - */ - virtual QString fileNameSuffix() const = 0; - virtual QString fileNameForContext(const GeneratorContext &context) const = 0; - - - virtual bool doSetup() = 0; - - /** - * Write the bindding code for an AbstractMetaClass. - * This is called by generate method. - * \param s text stream to write the generated output - * \param metaClass the class that should be generated - */ - virtual void generateClass(QTextStream &s, const GeneratorContext &classContext) = 0; - virtual bool finishGeneration() = 0; - - /** - * Returns the subdirectory path for a given package - * (aka module, aka library) name. - * If the target language separates the package modules with characters other - * than dots ('.') the generator subclass must overload this method. - * /param packageName complete package name for which to return the subdirectory path - * or nothing the use the name of the currently processed package - * /return a string representing the subdirectory path for the given package - */ - virtual QString subDirectoryForPackage(QString packageName = QString()) const; - - QVector<const AbstractMetaType *> instantiatedContainers() const; - QVector<const AbstractMetaType *> instantiatedSmartPointers() const; - - static QString getSimplifiedContainerTypeName(const AbstractMetaType *type); - void addInstantiatedContainersAndSmartPointers(const AbstractMetaType *type, - const QString &context); - -private: - bool useEnumAsIntForProtectedHack(const AbstractMetaType *cType) const; - - struct GeneratorPrivate; - GeneratorPrivate *m_d; - void collectInstantiatedContainersAndSmartPointers(const AbstractMetaFunction *func); - void collectInstantiatedContainersAndSmartPointers(const AbstractMetaClass *metaClass); - void collectInstantiatedContainersAndSmartPointers(); -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(Generator::Options) -using GeneratorPtr = QSharedPointer<Generator>; -using Generators = QVector<GeneratorPtr>; - -#endif // GENERATOR_H - |