diff options
Diffstat (limited to 'sources/shiboken2/ApiExtractor/typesystem.h')
-rw-r--r-- | sources/shiboken2/ApiExtractor/typesystem.h | 1671 |
1 files changed, 0 insertions, 1671 deletions
diff --git a/sources/shiboken2/ApiExtractor/typesystem.h b/sources/shiboken2/ApiExtractor/typesystem.h deleted file mode 100644 index 9d97f5c93..000000000 --- a/sources/shiboken2/ApiExtractor/typesystem.h +++ /dev/null @@ -1,1671 +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 TYPESYSTEM_H -#define TYPESYSTEM_H - -#include "typesystem_enums.h" -#include "typesystem_typedefs.h" -#include "include.h" -#include "sourcelocation.h" - -#include <QtCore/QHash> -#include <QtCore/qobjectdefs.h> -#include <QtCore/QRegularExpression> -#include <QtCore/QString> -#include <QtCore/QStringList> -#include <QtCore/QMap> -#include <QtCore/QVector> -#include <QtCore/QVersionNumber> - -//Used to identify the conversion rule to avoid break API -extern const char *TARGET_CONVERSION_RULE_FLAG; -extern const char *NATIVE_CONVERSION_RULE_FLAG; - -class AbstractMetaType; -QT_BEGIN_NAMESPACE -class QDebug; -class QTextStream; -QT_END_NAMESPACE - -class EnumTypeEntry; -class FlagsTypeEntry; - -using ArgumentMap = QMap<int, QString>; - -class TemplateInstance; - -struct ReferenceCount -{ - enum Action { // 0x01 - 0xff - Invalid = 0x00, - Add = 0x01, - AddAll = 0x02, - Remove = 0x04, - Set = 0x08, - Ignore = 0x10, - - ActionsMask = 0xff, - - Padding = 0xffffffff - }; - - QString varName; - Action action = Invalid; -}; - -struct ArgumentOwner -{ - enum Action { - Invalid = 0x00, - Add = 0x01, - Remove = 0x02 - }; - enum { - InvalidIndex = -2, - ThisIndex = -1, - ReturnIndex = 0, - FirstArgumentIndex = 1 - }; - - Action action = Invalid; - int index = InvalidIndex; -}; - -class CodeSnipFragment -{ -public: - CodeSnipFragment() = default; - explicit CodeSnipFragment(const QString &code) : m_code(code) {} - explicit CodeSnipFragment(TemplateInstance *instance) : m_instance(instance) {} - - QString code() const; - -private: - QString m_code; - TemplateInstance *m_instance = nullptr; -}; - -class CodeSnipAbstract -{ -public: - QString code() const; - - void addCode(const QString &code); - void addCode(const QStringRef &code) { addCode(code.toString()); } - - void addTemplateInstance(TemplateInstance *ti) - { - codeList.append(CodeSnipFragment(ti)); - } - - QVector<CodeSnipFragment> codeList; - - static QString fixSpaces(QString code); - static QString dedent(const QString &code); - static void prependCode(QString *code, QString firstLine); -}; - -class CustomFunction : public CodeSnipAbstract -{ -public: - explicit CustomFunction(const QString &n = QString()) : name(n) {} - - QString name; - QString paramName; -}; - -class TemplateEntry : public CodeSnipAbstract -{ -public: - explicit TemplateEntry(const QString &name) : m_name(name) {} - - QString name() const - { - return m_name; - } - -private: - QString m_name; -}; - -class TemplateInstance -{ -public: - explicit TemplateInstance(const QString &name) : m_name(name) {} - - void addReplaceRule(const QString &name, const QString &value) - { - replaceRules[name] = value; - } - - QString expandCode() const; - - QString name() const - { - return m_name; - } - -private: - const QString m_name; - QHash<QString, QString> replaceRules; -}; - - -class CodeSnip : public CodeSnipAbstract -{ -public: - CodeSnip() = default; - explicit CodeSnip(TypeSystem::Language lang) : language(lang) {} - - TypeSystem::Language language = TypeSystem::TargetLangCode; - TypeSystem::CodeSnipPosition position = TypeSystem::CodeSnipPositionAny; - ArgumentMap argumentMap; -}; - -struct ArgumentModification -{ - ArgumentModification() : removedDefaultExpression(false), removed(false), - noNullPointers(false), resetAfterUse(false), array(false) {} - explicit ArgumentModification(int idx) : index(idx), removedDefaultExpression(false), removed(false), - noNullPointers(false), resetAfterUse(false), array(false) {} - - // Should the default expression be removed? - - - // Reference count flags for this argument - QVector<ReferenceCount> referenceCounts; - - // The text given for the new type of the argument - QString modified_type; - - QString replace_value; - - // The text of the new default expression of the argument - QString replacedDefaultExpression; - - // The new definition of ownership for a specific argument - QHash<TypeSystem::Language, TypeSystem::Ownership> ownerships; - - // Different conversion rules - CodeSnipList conversion_rules; - - //QObject parent(owner) of this argument - ArgumentOwner owner; - - //New name - QString renamed_to; - - // The index of this argument - int index = -1; - - uint removedDefaultExpression : 1; - uint removed : 1; - uint noNullPointers : 1; - uint resetAfterUse : 1; - uint array : 1; // consider "int*" to be "int[]" -}; - -struct Modification -{ - enum Modifiers : uint { - InvalidModifier = 0x0000, - Private = 0x0001, - Protected = 0x0002, - Public = 0x0003, - Friendly = 0x0004, - AccessModifierMask = 0x000f, - - Final = 0x0010, - NonFinal = 0x0020, - FinalMask = Final | NonFinal, - - Readable = 0x0100, - Writable = 0x0200, - - CodeInjection = 0x1000, - Rename = 0x2000, - Deprecated = 0x4000, - ReplaceExpression = 0x8000 - }; - - bool isAccessModifier() const - { - return modifiers & AccessModifierMask; - } - Modifiers accessModifier() const - { - return Modifiers(modifiers & AccessModifierMask); - } - bool isPrivate() const - { - return accessModifier() == Private; - } - bool isProtected() const - { - return accessModifier() == Protected; - } - bool isPublic() const - { - return accessModifier() == Public; - } - bool isFriendly() const - { - return accessModifier() == Friendly; - } - bool isFinal() const - { - return modifiers & Final; - } - bool isNonFinal() const - { - return modifiers & NonFinal; - } - QString accessModifierString() const; - - bool isDeprecated() const - { - return modifiers & Deprecated; - } - - void setRenamedTo(const QString &name) - { - renamedToName = name; - } - QString renamedTo() const - { - return renamedToName; - } - bool isRenameModifier() const - { - return modifiers & Rename; - } - - bool isRemoveModifier() const - { - return removal != TypeSystem::NoLanguage; - } - -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const; -#endif - - QString renamedToName; - uint modifiers = 0; - TypeSystem::Language removal = TypeSystem::NoLanguage; -}; - -struct FunctionModification: public Modification -{ - using AllowThread = TypeSystem::AllowThread; - - bool isCodeInjection() const - { - return modifiers & CodeInjection; - } - void setIsThread(bool flag) - { - m_thread = flag; - } - bool isThread() const - { - return m_thread; - } - - AllowThread allowThread() const { return m_allowThread; } - void setAllowThread(AllowThread allow) { m_allowThread = allow; } - - bool matches(const QString &functionSignature) const - { - return m_signature.isEmpty() - ? m_signaturePattern.match(functionSignature).hasMatch() - : m_signature == functionSignature; - } - - bool setSignature(const QString &s, QString *errorMessage = nullptr); - QString signature() const { return m_signature.isEmpty() ? m_signaturePattern.pattern() : m_signature; } - - void setOriginalSignature(const QString &s) { m_originalSignature = s; } - QString originalSignature() const { return m_originalSignature; } - - TypeSystem::ExceptionHandling exceptionHandling() const { return m_exceptionHandling; } - void setExceptionHandling(TypeSystem::ExceptionHandling e) { m_exceptionHandling = e; } - - QString toString() const; - -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const; -#endif - - QString association; - CodeSnipList snips; - - QVector<ArgumentModification> argument_mods; - -private: - QString m_signature; - QString m_originalSignature; - QRegularExpression m_signaturePattern; - bool m_thread = false; - AllowThread m_allowThread = AllowThread::Unspecified; - TypeSystem::ExceptionHandling m_exceptionHandling = TypeSystem::ExceptionHandling::Unspecified; -}; - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug d, const ReferenceCount &); -QDebug operator<<(QDebug d, const ArgumentOwner &a); -QDebug operator<<(QDebug d, const ArgumentModification &a); -QDebug operator<<(QDebug d, const FunctionModification &fm); -#endif - -struct FieldModification: public Modification -{ - bool isReadable() const - { - return modifiers & Readable; - } - bool isWritable() const - { - return modifiers & Writable; - } - - QString name; -}; - -/** -* \internal -* Struct used to store information about functions added by the typesystem. -* This info will be used later to create a fake AbstractMetaFunction which -* will be inserted into the right AbstractMetaClass. -*/ -struct AddedFunction -{ - /// Function access types. - enum Access { - InvalidAccess = 0, - Protected = 0x1, - Public = 0x2 - }; - - /** - * \internal - * Internal struct used to store information about arguments and return type of the - * functions added by the type system. This information is later used to create - * AbstractMetaType and AbstractMetaArgument for the AbstractMetaFunctions. - */ - struct TypeInfo { - TypeInfo() = default; - static TypeInfo fromSignature(const QString& signature); - - QString name; - QString defaultValue; - int indirections = 0; - bool isConstant = false; - bool isReference = false; - }; - - struct Argument - { - QString name; - TypeInfo typeInfo; - }; - - /// Creates a new AddedFunction with a signature and a return type. - explicit AddedFunction(QString signature, const QString &returnType); - AddedFunction() = default; - - /// Returns the function name. - QString name() const - { - return m_name; - } - - /// Set the function access type. - void setAccess(Access access) - { - m_access = access; - } - - /// Returns the function access type. - Access access() const - { - return m_access; - } - - /// Returns the function return type. - TypeInfo returnType() const - { - return m_returnType; - } - - /// Returns a list of argument type infos. - const QVector<Argument> &arguments() const - { - return m_arguments; - } - - /// Returns true if this is a constant method. - bool isConstant() const - { - return m_isConst; - } - - /// Set this method static. - void setStatic(bool value) - { - m_isStatic = value; - } - - /// Returns true if this is a static method. - bool isStatic() const - { - return m_isStatic; - } - - FunctionModificationList modifications; - -private: - QString m_name; - QVector<Argument> m_arguments; - TypeInfo m_returnType; - Access m_access = Protected; - bool m_isConst = false; - bool m_isStatic = false; -}; - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug d, const AddedFunction::TypeInfo &ti); -QDebug operator<<(QDebug d, const AddedFunction::Argument &a); -QDebug operator<<(QDebug d, const AddedFunction &af); -#endif - -class ObjectTypeEntry; - -class DocModification -{ -public: - DocModification() = default; - explicit DocModification(const QString& xpath, const QString& signature) : - m_xpath(xpath), m_signature(signature) {} - explicit DocModification(TypeSystem::DocModificationMode mode, const QString& signature) : - m_signature(signature), m_mode(mode) {} - - void setCode(const QString& code); - void setCode(const QStringRef& code) { setCode(code.toString()); } - - QString code() const - { - return m_code; - } - QString xpath() const - { - return m_xpath; - } - QString signature() const - { - return m_signature; - } - TypeSystem::DocModificationMode mode() const - { - return m_mode; - } - - TypeSystem::Language format() const { return m_format; } - void setFormat(TypeSystem::Language f) { m_format = f; } - -private: - QString m_code; - QString m_xpath; - QString m_signature; - TypeSystem::DocModificationMode m_mode = TypeSystem::DocModificationXPathReplace; - TypeSystem::Language m_format = TypeSystem::NativeCode; -}; - -class CustomConversion; -class TypeSystemTypeEntry; - -class TypeEntry -{ - Q_GADGET -public: - TypeEntry &operator=(const TypeEntry &) = delete; - TypeEntry &operator=(TypeEntry &&) = delete; - TypeEntry(TypeEntry &&) = delete; - - enum Type { - PrimitiveType, - VoidType, - VarargsType, - FlagsType, - EnumType, - EnumValue, - ConstantValueType, - TemplateArgumentType, - BasicValueType, - ContainerType, - ObjectType, - NamespaceType, - ArrayType, - TypeSystemType, - CustomType, - FunctionType, - SmartPointerType, - TypedefType - }; - Q_ENUM(Type) - - enum CodeGeneration { - GenerateTargetLang = 0x0001, - GenerateCpp = 0x0002, - GenerateForSubclass = 0x0004, - - GenerateNothing = 0, - GenerateAll = 0xffff, - GenerateCode = GenerateTargetLang | GenerateCpp - }; - Q_ENUM(CodeGeneration) - - explicit TypeEntry(const QString &entryName, Type t, const QVersionNumber &vr, - const TypeEntry *parent); - - virtual ~TypeEntry(); - - Type type() const - { - return m_type; - } - - const TypeEntry *parent() const { return m_parent; } - void setParent(const TypeEntry *p) { m_parent = p; } - bool isChildOf(const TypeEntry *p) const; - const TypeSystemTypeEntry *typeSystemTypeEntry() const; - // cf AbstractMetaClass::targetLangEnclosingClass() - const TypeEntry *targetLangEnclosingEntry() const; - - bool isPrimitive() const - { - return m_type == PrimitiveType; - } - bool isEnum() const - { - return m_type == EnumType; - } - bool isFlags() const - { - return m_type == FlagsType; - } - bool isObject() const - { - return m_type == ObjectType; - } - bool isNamespace() const - { - return m_type == NamespaceType; - } - bool isContainer() const - { - return m_type == ContainerType; - } - bool isSmartPointer() const - { - return m_type == SmartPointerType; - } - bool isArray() const - { - return m_type == ArrayType; - } - bool isTemplateArgument() const - { - return m_type == TemplateArgumentType; - } - bool isVoid() const - { - return m_type == VoidType; - } - bool isVarargs() const - { - return m_type == VarargsType; - } - bool isCustom() const - { - return m_type == CustomType; - } - bool isTypeSystem() const - { - return m_type == TypeSystemType; - } - bool isFunction() const - { - return m_type == FunctionType; - } - bool isEnumValue() const - { - return m_type == EnumValue; - } - - bool stream() const - { - return m_stream; - } - - void setStream(bool b) - { - m_stream = b; - } - - // The type's name in C++, fully qualified - QString name() const { return m_name; } - // C++ excluding inline namespaces - QString shortName() const; - // Name as specified in XML - QString entryName() const { return m_entryName; } - - uint codeGeneration() const - { - return m_codeGeneration; - } - void setCodeGeneration(uint cg) - { - m_codeGeneration = cg; - } - - // Returns true if code must be generated for this entry, - // it will return false in case of types coming from typesystems - // included for reference only. - // NOTE: 'GenerateForSubclass' means 'generate="no"' - // on 'load-typesystem' tag - inline bool generateCode() const - { - return m_codeGeneration != TypeEntry::GenerateForSubclass - && m_codeGeneration != TypeEntry::GenerateNothing; - } - - int revision() const { return m_revision; } - void setRevision(int r); // see typedatabase.cpp - int sbkIndex() const; - void setSbkIndex(int i) { m_sbkIndex = i; } - - virtual QString qualifiedCppName() const - { - return m_name; - } - - /** - * Its type's name in target language API - * The target language API name represents how this type is - * referred on low level code for the target language. - * Examples: for Java this would be a JNI name, for Python - * it should represent the CPython type name. - * /return string representing the target language API name - * for this type entry - */ - virtual QString targetLangApiName() const - { - return m_name; - } - - // The type's name in TargetLang - QString targetLangName() const; // "Foo.Bar" - void setTargetLangName(const QString &n) { m_cachedTargetLangName = n; } - QString targetLangEntryName() const; // "Bar" - - // The package - QString targetLangPackage() const { return m_targetLangPackage; } - void setTargetLangPackage(const QString &p) { m_targetLangPackage = p; } - - QString qualifiedTargetLangName() const; - - void setCustomConstructor(const CustomFunction &func) - { - m_customConstructor = func; - } - CustomFunction customConstructor() const - { - return m_customConstructor; - } - - void setCustomDestructor(const CustomFunction &func) - { - m_customDestructor = func; - } - CustomFunction customDestructor() const - { - return m_customDestructor; - } - - virtual bool isValue() const - { - return false; - } - virtual bool isComplex() const - { - return false; - } - - CodeSnipList codeSnips() const; - void setCodeSnips(const CodeSnipList &codeSnips) - { - m_codeSnips = codeSnips; - } - void addCodeSnip(const CodeSnip &codeSnip) - { - m_codeSnips << codeSnip; - } - - void setDocModification(const DocModificationList& docMods) - { - m_docModifications << docMods; - } - DocModificationList docModifications() const - { - return m_docModifications; - } - - IncludeList extraIncludes() const - { - return m_extraIncludes; - } - void setExtraIncludes(const IncludeList &includes) - { - m_extraIncludes = includes; - } - void addExtraInclude(const Include &newInclude); - - Include include() const - { - return m_include; - } - void setInclude(const Include &inc); - - // Replace conversionRule arg to CodeSnip in future version - /// Set the type convertion rule - void setConversionRule(const QString& conversionRule) - { - m_conversionRule = conversionRule; - } - - /// Returns the type convertion rule - QString conversionRule() const - { - //skip conversions flag - return m_conversionRule.mid(1); - } - - /// Returns true if there are any conversiton rule for this type, false otherwise. - bool hasConversionRule() const - { - return !m_conversionRule.isEmpty(); - } - - QVersionNumber version() const - { - return m_version; - } - - /// TODO-CONVERTER: mark as deprecated - bool hasNativeConversionRule() const - { - return m_conversionRule.startsWith(QLatin1String(NATIVE_CONVERSION_RULE_FLAG)); - } - - /// TODO-CONVERTER: mark as deprecated - bool hasTargetConversionRule() const - { - return m_conversionRule.startsWith(QLatin1String(TARGET_CONVERSION_RULE_FLAG)); - } - - bool isCppPrimitive() const; - - bool hasCustomConversion() const; - void setCustomConversion(CustomConversion* customConversion); - CustomConversion* customConversion() const; - - virtual TypeEntry *clone() const; - - void useAsTypedef(const TypeEntry *source); - - SourceLocation sourceLocation() const; - void setSourceLocation(const SourceLocation &sourceLocation); - -#ifndef QT_NO_DEBUG_STREAM - virtual void formatDebug(QDebug &d) const; -#endif - -protected: - TypeEntry(const TypeEntry &); - - virtual QString buildTargetLangName() const; - -private: - const TypeEntry *m_parent; - QString m_name; // C++ fully qualified - mutable QString m_cachedShortName; // C++ excluding inline namespaces - QString m_entryName; - QString m_targetLangPackage; - mutable QString m_cachedTargetLangName; // "Foo.Bar" - mutable QString m_cachedTargetLangEntryName; // "Bar" - CustomFunction m_customConstructor; - CustomFunction m_customDestructor; - CodeSnipList m_codeSnips; - DocModificationList m_docModifications; - IncludeList m_extraIncludes; - Include m_include; - QString m_conversionRule; - QVersionNumber m_version; - CustomConversion *m_customConversion = nullptr; - SourceLocation m_sourceLocation; // XML file - uint m_codeGeneration = GenerateAll; - int m_revision = 0; - int m_sbkIndex = 0; - Type m_type; - bool m_stream = false; -}; - -class TypeSystemTypeEntry : public TypeEntry -{ -public: - explicit TypeSystemTypeEntry(const QString &entryName, const QVersionNumber &vr, - const TypeEntry *parent); - - TypeEntry *clone() const override; - -protected: - TypeSystemTypeEntry(const TypeSystemTypeEntry &); -}; - -class VoidTypeEntry : public TypeEntry -{ -public: - VoidTypeEntry(); - - TypeEntry *clone() const override; - -protected: - VoidTypeEntry(const VoidTypeEntry &); -}; - -class VarargsTypeEntry : public TypeEntry -{ -public: - VarargsTypeEntry(); - - TypeEntry *clone() const override; - -protected: - VarargsTypeEntry(const VarargsTypeEntry &); -}; - -class TemplateArgumentEntry : public TypeEntry -{ -public: - explicit TemplateArgumentEntry(const QString &entryName, const QVersionNumber &vr, - const TypeEntry *parent); - - int ordinal() const - { - return m_ordinal; - } - void setOrdinal(int o) - { - m_ordinal = o; - } - - TypeEntry *clone() const override; - -protected: - TemplateArgumentEntry(const TemplateArgumentEntry &); - -private: - int m_ordinal = 0; -}; - -class ArrayTypeEntry : public TypeEntry -{ -public: - explicit ArrayTypeEntry(const TypeEntry *nested_type, const QVersionNumber &vr, - const TypeEntry *parent); - - void setNestedTypeEntry(TypeEntry *nested) - { - m_nestedType = nested; - } - const TypeEntry *nestedTypeEntry() const - { - return m_nestedType; - } - - QString targetLangApiName() const override; - - TypeEntry *clone() const override; - -protected: - ArrayTypeEntry(const ArrayTypeEntry &); - - QString buildTargetLangName() const override; - -private: - const TypeEntry *m_nestedType; -}; - - -class PrimitiveTypeEntry : public TypeEntry -{ -public: - explicit PrimitiveTypeEntry(const QString &entryName, const QVersionNumber &vr, - const TypeEntry *parent); - - QString targetLangApiName() const override; - void setTargetLangApiName(const QString &targetLangApiName) - { - m_targetLangApiName = targetLangApiName; - } - - QString defaultConstructor() const - { - return m_defaultConstructor; - } - void setDefaultConstructor(const QString& defaultConstructor) - { - m_defaultConstructor = defaultConstructor; - } - bool hasDefaultConstructor() const - { - return !m_defaultConstructor.isEmpty(); - } - - /** - * The PrimitiveTypeEntry pointed by this type entry if it - * represents a typedef). - * /return the type referenced by the typedef, or a null pointer - * if the current object is not an typedef - */ - PrimitiveTypeEntry* referencedTypeEntry() const { return m_referencedTypeEntry; } - - /** - * Defines type referenced by this entry. - * /param referencedTypeEntry type referenced by this entry - */ - void setReferencedTypeEntry(PrimitiveTypeEntry* referencedTypeEntry) - { - m_referencedTypeEntry = referencedTypeEntry; - } - - /** - * Finds the most basic primitive type that the typedef represents, - * i.e. a type that is not an typedef'ed. - * /return the most basic non-typedef'ed primitive type represented - * by this typedef - */ - PrimitiveTypeEntry* basicReferencedTypeEntry() const; - - bool preferredTargetLangType() const - { - return m_preferredTargetLangType; - } - void setPreferredTargetLangType(bool b) - { - m_preferredTargetLangType = b; - } - - TypeEntry *clone() const override; - -protected: - PrimitiveTypeEntry(const PrimitiveTypeEntry &); - -private: - QString m_targetLangApiName; - QString m_defaultConstructor; - uint m_preferredTargetLangType : 1; - PrimitiveTypeEntry* m_referencedTypeEntry = nullptr; -}; - -class EnumValueTypeEntry; - -class EnumTypeEntry : public TypeEntry -{ -public: - explicit EnumTypeEntry(const QString &entryName, - const QVersionNumber &vr, - const TypeEntry *parent); - - QString targetLangQualifier() const; - - QString targetLangApiName() const override; - - QString qualifier() const; - - const EnumValueTypeEntry *nullValue() const { return m_nullValue; } - void setNullValue(const EnumValueTypeEntry *n) { m_nullValue = n; } - - void setFlags(FlagsTypeEntry *flags) - { - m_flags = flags; - } - FlagsTypeEntry *flags() const - { - return m_flags; - } - - bool isEnumValueRejected(const QString &name) const - { - return m_rejectedEnums.contains(name); - } - void addEnumValueRejection(const QString &name) - { - m_rejectedEnums << name; - } - QStringList enumValueRejections() const - { - return m_rejectedEnums; - } - - TypeEntry *clone() const override; -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const override; -#endif -protected: - EnumTypeEntry(const EnumTypeEntry &); - -private: - const EnumValueTypeEntry *m_nullValue = nullptr; - - QStringList m_rejectedEnums; - - FlagsTypeEntry *m_flags = nullptr; -}; - -// EnumValueTypeEntry is used for resolving integer type templates -// like array<EnumValue>. Note: Dummy entries for integer values will -// be created for non-type template parameters, where m_enclosingEnum==nullptr. -class EnumValueTypeEntry : public TypeEntry -{ -public: - explicit EnumValueTypeEntry(const QString& name, const QString& value, - const EnumTypeEntry* enclosingEnum, - bool isScopedEnum, const QVersionNumber &vr); - - QString value() const { return m_value; } - const EnumTypeEntry* enclosingEnum() const { return m_enclosingEnum; } - - TypeEntry *clone() const override; - -protected: - EnumValueTypeEntry(const EnumValueTypeEntry &); - -private: - QString m_value; - const EnumTypeEntry* m_enclosingEnum; -}; - -class FlagsTypeEntry : public TypeEntry -{ -public: - explicit FlagsTypeEntry(const QString &entryName, const QVersionNumber &vr, - const TypeEntry *parent); - - QString targetLangApiName() const override; - - QString originalName() const - { - return m_originalName; - } - void setOriginalName(const QString &s) - { - m_originalName = s; - } - - QString flagsName() const - { - return m_flagsName; - } - void setFlagsName(const QString &name) - { - m_flagsName = name; - } - - EnumTypeEntry *originator() const - { - return m_enum; - } - void setOriginator(EnumTypeEntry *e) - { - m_enum = e; - } - - TypeEntry *clone() const override; - -protected: - FlagsTypeEntry(const FlagsTypeEntry &); - - QString buildTargetLangName() const override; - -private: - QString m_originalName; - QString m_flagsName; - EnumTypeEntry *m_enum = nullptr; -}; - -// For primitive values, typically to provide a dummy type for -// example the '2' in non-type template 'Array<2>'. -class ConstantValueTypeEntry : public TypeEntry -{ -public: - explicit ConstantValueTypeEntry(const QString& name, - const TypeEntry *parent); - - TypeEntry *clone() const override; - -protected: - ConstantValueTypeEntry(const ConstantValueTypeEntry &); -}; - -class ComplexTypeEntry : public TypeEntry -{ -public: - enum TypeFlag { - Deprecated = 0x4 - }; - Q_DECLARE_FLAGS(TypeFlags, TypeFlag) - - enum CopyableFlag { - CopyableSet, - NonCopyableSet, - Unknown - }; - - explicit ComplexTypeEntry(const QString &entryName, Type t, const QVersionNumber &vr, - const TypeEntry *parent); - - bool isComplex() const override; - - QString targetLangApiName() const override; - - void setTypeFlags(TypeFlags flags) - { - m_typeFlags = flags; - } - - TypeFlags typeFlags() const - { - return m_typeFlags; - } - - FunctionModificationList functionModifications() const - { - return m_functionMods; - } - void setFunctionModifications(const FunctionModificationList &functionModifications) - { - m_functionMods = functionModifications; - } - void addFunctionModification(const FunctionModification &functionModification) - { - m_functionMods << functionModification; - } - FunctionModificationList functionModifications(const QString &signature) const; - - AddedFunctionList addedFunctions() const - { - return m_addedFunctions; - } - void setAddedFunctions(const AddedFunctionList &addedFunctions) - { - m_addedFunctions = addedFunctions; - } - void addNewFunction(const AddedFunctionPtr &addedFunction) - { - m_addedFunctions << addedFunction; - } - - FieldModification fieldModification(const QString &name) const; - void setFieldModifications(const FieldModificationList &mods) - { - m_fieldMods = mods; - } - FieldModificationList fieldModifications() const - { - return m_fieldMods; - } - - QString defaultSuperclass() const - { - return m_defaultSuperclass; - } - void setDefaultSuperclass(const QString &sc) - { - m_defaultSuperclass = sc; - } - - QString qualifiedCppName() const override - { - return m_qualifiedCppName; - } - - - void setIsPolymorphicBase(bool on) - { - m_polymorphicBase = on; - } - bool isPolymorphicBase() const - { - return m_polymorphicBase; - } - - void setPolymorphicIdValue(const QString &value) - { - m_polymorphicIdValue = value; - } - QString polymorphicIdValue() const - { - return m_polymorphicIdValue; - } - - QString targetType() const - { - return m_targetType; - } - void setTargetType(const QString &code) - { - m_targetType = code; - } - - bool isGenericClass() const - { - return m_genericClass; - } - void setGenericClass(bool isGeneric) - { - m_genericClass = isGeneric; - } - - bool deleteInMainThread() const { return m_deleteInMainThread; } - void setDeleteInMainThread(bool d) { m_deleteInMainThread = d; } - - CopyableFlag copyable() const - { - return m_copyableFlag; - } - void setCopyable(CopyableFlag flag) - { - m_copyableFlag = flag; - } - - QString hashFunction() const - { - return m_hashFunction; - } - void setHashFunction(const QString &hashFunction) - { - m_hashFunction = hashFunction; - } - - void setBaseContainerType(const ComplexTypeEntry *baseContainer) - { - m_baseContainerType = baseContainer; - } - - const ComplexTypeEntry* baseContainerType() const - { - return m_baseContainerType; - } - - TypeSystem::ExceptionHandling exceptionHandling() const { return m_exceptionHandling; } - void setExceptionHandling(TypeSystem::ExceptionHandling e) { m_exceptionHandling = e; } - - TypeSystem::AllowThread allowThread() const { return m_allowThread; } - void setAllowThread(TypeSystem::AllowThread allowThread) { m_allowThread = allowThread; } - - QString defaultConstructor() const; - void setDefaultConstructor(const QString& defaultConstructor); - bool hasDefaultConstructor() const; - - TypeEntry *clone() const override; - - void useAsTypedef(const ComplexTypeEntry *source); - -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const override; -#endif -protected: - ComplexTypeEntry(const ComplexTypeEntry &); - -private: - AddedFunctionList m_addedFunctions; - FunctionModificationList m_functionMods; - FieldModificationList m_fieldMods; - QString m_defaultConstructor; - QString m_defaultSuperclass; - QString m_qualifiedCppName; - - uint m_polymorphicBase : 1; - uint m_genericClass : 1; - uint m_deleteInMainThread : 1; - - QString m_polymorphicIdValue; - QString m_targetType; - TypeFlags m_typeFlags; - CopyableFlag m_copyableFlag = Unknown; - QString m_hashFunction; - - const ComplexTypeEntry* m_baseContainerType = nullptr; - // For class functions - TypeSystem::ExceptionHandling m_exceptionHandling = TypeSystem::ExceptionHandling::Unspecified; - TypeSystem::AllowThread m_allowThread = TypeSystem::AllowThread::Unspecified; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(ComplexTypeEntry::TypeFlags) - -class TypedefEntry : public ComplexTypeEntry -{ -public: - explicit TypedefEntry(const QString &entryName, - const QString &sourceType, - const QVersionNumber &vr, - const TypeEntry *parent); - - QString sourceType() const { return m_sourceType; } - void setSourceType(const QString &s) { m_sourceType =s; } - - TypeEntry *clone() const override; - - ComplexTypeEntry *source() const { return m_source; } - void setSource(ComplexTypeEntry *source) { m_source = source; } - - ComplexTypeEntry *target() const { return m_target; } - void setTarget(ComplexTypeEntry *target) { m_target = target; } - -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const override; -#endif -protected: - TypedefEntry(const TypedefEntry &); - -private: - QString m_sourceType; - ComplexTypeEntry *m_source = nullptr; - ComplexTypeEntry *m_target = nullptr; -}; - -class ContainerTypeEntry : public ComplexTypeEntry -{ - Q_GADGET -public: - enum ContainerKind { - NoContainer, - ListContainer, - StringListContainer, - LinkedListContainer, - VectorContainer, - StackContainer, - QueueContainer, - SetContainer, - MapContainer, - MultiMapContainer, - HashContainer, - MultiHashContainer, - PairContainer, - }; - Q_ENUM(ContainerKind) - - explicit ContainerTypeEntry(const QString &entryName, ContainerKind containerKind, - const QVersionNumber &vr, const TypeEntry *parent); - - ContainerKind containerKind() const - { - return m_containerKind; - } - - QString typeName() const; - QString qualifiedCppName() const override; - - TypeEntry *clone() const override; - -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const override; -#endif -protected: - ContainerTypeEntry(const ContainerTypeEntry &); - -private: - ContainerKind m_containerKind; -}; - -class SmartPointerTypeEntry : public ComplexTypeEntry -{ -public: - using Instantiations = QVector<const TypeEntry *>; - - explicit SmartPointerTypeEntry(const QString &entryName, - const QString &getterName, - const QString &smartPointerType, - const QString &refCountMethodName, - const QVersionNumber &vr, - const TypeEntry *parent); - - QString getter() const - { - return m_getterName; - } - - QString refCountMethodName() const - { - return m_refCountMethodName; - } - - TypeEntry *clone() const override; - - Instantiations instantiations() const { return m_instantiations; } - void setInstantiations(const Instantiations &i) { m_instantiations = i; } - bool matchesInstantiation(const TypeEntry *e) const; - -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const override; -#endif -protected: - SmartPointerTypeEntry(const SmartPointerTypeEntry &); - -private: - QString m_getterName; - QString m_smartPointerType; - QString m_refCountMethodName; - Instantiations m_instantiations; -}; - -class NamespaceTypeEntry : public ComplexTypeEntry -{ -public: - explicit NamespaceTypeEntry(const QString &entryName, const QVersionNumber &vr, - const TypeEntry *parent); - - TypeEntry *clone() const override; - - const NamespaceTypeEntry *extends() const { return m_extends; } - void setExtends(const NamespaceTypeEntry *e) { m_extends = e; } - - const QRegularExpression &filePattern() const { return m_filePattern; } // restrict files - void setFilePattern(const QRegularExpression &r); - - bool hasPattern() const { return m_hasPattern; } - - bool matchesFile(const QString &needle) const; - - bool isVisible() const; - void setVisibility(TypeSystem::Visibility v) { m_visibility = v; } - - // C++ 11 inline namespace, from code model - bool isInlineNamespace() const { return m_inlineNamespace; } - void setInlineNamespace(bool i) { m_inlineNamespace = i; } - - static bool isVisibleScope(const TypeEntry *e); - -#ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &d) const override; -#endif - -protected: - NamespaceTypeEntry(const NamespaceTypeEntry &); - -private: - QRegularExpression m_filePattern; - const NamespaceTypeEntry *m_extends = nullptr; - TypeSystem::Visibility m_visibility = TypeSystem::Visibility::Auto; - bool m_hasPattern = false; - bool m_inlineNamespace = false; -}; - -class ValueTypeEntry : public ComplexTypeEntry -{ -public: - explicit ValueTypeEntry(const QString &entryName, const QVersionNumber &vr, - const TypeEntry *parent); - - bool isValue() const override; - - TypeEntry *clone() const override; - -protected: - explicit ValueTypeEntry(const QString &entryName, Type t, const QVersionNumber &vr, - const TypeEntry *parent); - ValueTypeEntry(const ValueTypeEntry &); -}; - -class FunctionTypeEntry : public TypeEntry -{ -public: - explicit FunctionTypeEntry(const QString& name, const QString& signature, - const QVersionNumber &vr, - const TypeEntry *parent); - void addSignature(const QString& signature) - { - m_signatures << signature; - } - - QStringList signatures() const - { - return m_signatures; - } - - bool hasSignature(const QString& signature) const - { - return m_signatures.contains(signature); - } - - TypeEntry *clone() const override; - -protected: - FunctionTypeEntry(const FunctionTypeEntry &); - -private: - QStringList m_signatures; -}; - -class ObjectTypeEntry : public ComplexTypeEntry -{ -public: - explicit ObjectTypeEntry(const QString &entryName, const QVersionNumber &vr, - const TypeEntry *parent); - - TypeEntry *clone() const override; - -protected: - ObjectTypeEntry(const ObjectTypeEntry &); -}; - -struct TypeRejection -{ - enum MatchType - { - ExcludeClass, // Match className only - Function, // Match className and function name - Field, // Match className and field name - Enum, // Match className and enum name - ArgumentType, // Match className and argument type - ReturnType, // Match className and return type - Invalid - }; - - QRegularExpression className; - QRegularExpression pattern; - MatchType matchType = Invalid; -}; - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug d, const TypeRejection &r); -#endif - -class CustomConversion -{ -public: - CustomConversion(TypeEntry* ownerType); - ~CustomConversion(); - - const TypeEntry* ownerType() const; - QString nativeToTargetConversion() const; - void setNativeToTargetConversion(const QString& nativeToTargetConversion); - - class TargetToNativeConversion - { - public: - TargetToNativeConversion(const QString& sourceTypeName, - const QString& sourceTypeCheck, - const QString& conversion = QString()); - ~TargetToNativeConversion(); - - const TypeEntry* sourceType() const; - void setSourceType(const TypeEntry* sourceType); - bool isCustomType() const; - QString sourceTypeName() const; - QString sourceTypeCheck() const; - QString conversion() const; - void setConversion(const QString& conversion); - private: - struct TargetToNativeConversionPrivate; - TargetToNativeConversionPrivate* m_d; - }; - - /** - * Returns true if the target to C++ custom conversions should - * replace the original existing ones, and false if the custom - * conversions should be added to the original. - */ - bool replaceOriginalTargetToNativeConversions() const; - void setReplaceOriginalTargetToNativeConversions(bool replaceOriginalTargetToNativeConversions); - - using TargetToNativeConversions = QVector<TargetToNativeConversion *>; - bool hasTargetToNativeConversions() const; - TargetToNativeConversions& targetToNativeConversions(); - const TargetToNativeConversions& targetToNativeConversions() const; - void addTargetToNativeConversion(const QString& sourceTypeName, - const QString& sourceTypeCheck, - const QString& conversion = QString()); -private: - struct CustomConversionPrivate; - CustomConversionPrivate* m_d; -}; - -#endif // TYPESYSTEM_H |