diff options
Diffstat (limited to 'sources/shiboken2/ApiExtractor/abstractmetalang.h')
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetalang.h | 291 |
1 files changed, 106 insertions, 185 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index e9ce4d71b..c100c63a1 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. @@ -30,6 +30,7 @@ #define ABSTRACTMETALANG_H #include "abstractmetalang_typedefs.h" +#include "sourcelocation.h" #include "typesystem_enums.h" #include "typesystem_typedefs.h" @@ -38,6 +39,7 @@ #include <QtCore/qobjectdefs.h> #include <QtCore/QStringList> +#include <QtCore/QMap> QT_FORWARD_DECLARE_CLASS(QDebug) @@ -71,34 +73,27 @@ public: Native, Target }; + enum Type { + Detailed, + Brief, + Last + }; Documentation() = default; + Documentation(const QString& value, Type t = Documentation::Detailed, + Format fmt = Documentation::Native); - Documentation(const QString& value, Format fmt = Documentation::Native) - : m_data(value.trimmed()), m_format(fmt) {} - - bool isEmpty() const { return m_data.isEmpty(); } - - QString value() const - { - return m_data; - } - - void setValue(const QString& value, Format fmt = Documentation::Native) - { - m_data = value.trimmed(); - m_format = fmt; - } + bool isEmpty() const; - Documentation::Format format() const - { - return m_format; - } + QString value(Type t = Documentation::Detailed) const; + void setValue(const QString& value, Type t = Documentation::Detailed, + Format fmt = Documentation::Native); - void setFormat(Format f) { m_format = f; } + Documentation::Format format() const; + void setFormat(Format f); private: - QString m_data; + QMap<Type, QString> m_data; Format m_format = Documentation::Native; }; @@ -298,11 +293,19 @@ public: ContainerPattern, SmartPointerPattern, VarargsPattern, - ArrayPattern + ArrayPattern, + VoidPattern, // Plain "void", no "void *" or similar. + TemplateArgument, // 'T' in std::array<T,2> + NonTypeTemplateArgument // '2' in in std::array<T,2> }; Q_ENUM(TypeUsagePattern) - AbstractMetaType(); + enum ComparisonFlag { + ConstRefMatchesValue = 0x1 + }; + Q_DECLARE_FLAGS(ComparisonFlags, ComparisonFlag); + + explicit AbstractMetaType(const TypeEntry *t = nullptr); ~AbstractMetaType(); QString package() const; @@ -340,7 +343,7 @@ public: } } - AbstractMetaTypeList instantiations() const + const AbstractMetaTypeList &instantiations() const { return m_instantiations; } @@ -416,6 +419,8 @@ public: return m_pattern == FlagsPattern; } + bool isVoid() const { return m_pattern == VoidPattern; } + bool isConstant() const { return m_constant; @@ -428,7 +433,8 @@ public: bool isVolatile() const { return m_volatile; } void setVolatile(bool v) { m_volatile = v; } - bool isConstRef() const; + bool passByConstRef() const; + bool passByValue() const; ReferenceType referenceType() const { return m_referenceType; } void setReferenceType(ReferenceType ref) { m_referenceType = ref; } @@ -508,7 +514,7 @@ public: AbstractMetaType *getSmartPointerInnerType() const { Q_ASSERT(isSmartPointer()); - AbstractMetaTypeList instantiations = this->instantiations(); + const AbstractMetaTypeList &instantiations = this->instantiations(); Q_ASSERT(!instantiations.isEmpty()); AbstractMetaType *innerType = instantiations.at(0); return innerType; @@ -527,17 +533,18 @@ public: bool hasTemplateChildren() const; - bool equals(const AbstractMetaType &rhs) const; + bool compare(const AbstractMetaType &rhs, ComparisonFlags = {}) const; + + static AbstractMetaType *createVoid(); private: TypeUsagePattern determineUsagePattern() const; QString formatSignature(bool minimal) const; - QString formatPythonSignature(bool minimal) const; + QString formatPythonSignature() const; - const TypeEntry *m_typeEntry = nullptr; + const TypeEntry *m_typeEntry; AbstractMetaTypeList m_instantiations; QString m_package; - mutable QString m_name; mutable QString m_cachedCppSignature; mutable QString m_cachedPythonSignature; QString m_originalTypeDescription; @@ -559,10 +566,12 @@ private: Q_DISABLE_COPY(AbstractMetaType) }; +Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractMetaType::ComparisonFlags); + inline bool operator==(const AbstractMetaType &t1, const AbstractMetaType &t2) -{ return t1.equals(t2); } +{ return t1.compare(t2); } inline bool operator!=(const AbstractMetaType &t1, const AbstractMetaType &t2) -{ return !t1.equals(t2); } +{ return !t1.compare(t2); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug d, const AbstractMetaType *at); @@ -697,27 +706,24 @@ private: friend class AbstractMetaClass; }; +class EnclosingClassMixin { +public: + const AbstractMetaClass *enclosingClass() const { return m_enclosingClass; } + void setEnclosingClass(const AbstractMetaClass *cls) { m_enclosingClass = cls; } + const AbstractMetaClass *targetLangEnclosingClass() const; + +private: + const AbstractMetaClass *m_enclosingClass = nullptr; +}; + #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug d, const AbstractMetaArgument *aa); #endif -class AbstractMetaField : public AbstractMetaVariable, public AbstractMetaAttributes +class AbstractMetaField : public AbstractMetaVariable, public AbstractMetaAttributes, public EnclosingClassMixin { public: AbstractMetaField(); - ~AbstractMetaField(); - - const AbstractMetaClass *enclosingClass() const - { - return m_class; - } - void setEnclosingClass(const AbstractMetaClass *cls) - { - m_class = cls; - } - - const AbstractMetaFunction *getter() const; - const AbstractMetaFunction *setter() const; FieldModificationList modifications() const; @@ -730,11 +736,6 @@ public: static AbstractMetaField * find(const AbstractMetaFieldList &haystack, const QString &needle); - -private: - mutable AbstractMetaFunction *m_getter = nullptr; - mutable AbstractMetaFunction *m_setter = nullptr; - const AbstractMetaClass *m_class = nullptr; }; #ifndef QT_NO_DEBUG_STREAM @@ -756,7 +757,9 @@ public: SignalFunction, EmptyFunction, SlotFunction, - GlobalScopeFunction + GlobalScopeFunction, + GetAttroFunction, + SetAttroFunction }; Q_ENUM(FunctionType) @@ -885,6 +888,7 @@ public: bool isModifiedRemoved(int types = TypeSystem::All) const; + bool isVoid() const { return m_type->isVoid(); } AbstractMetaType *type() const { return m_type; @@ -911,6 +915,9 @@ public: m_class = cls; } + // Owner excluding invisible namespaces + const AbstractMetaClass *targetLangOwner() const; + // The first class in a hierarchy that declares the function const AbstractMetaClass *declaringClass() const { @@ -1080,10 +1087,15 @@ public: void setExceptionHandlingModification(TypeSystem::ExceptionHandling em) { m_exceptionHandlingModification = em; } + int overloadNumber() const; + #ifndef QT_NO_DEBUG_STREAM void formatDebugVerbose(QDebug &d) const; #endif + SourceLocation sourceLocation() const; + void setSourceLocation(const SourceLocation &sourceLocation); + private: bool autoDetectAllowThread() const; @@ -1102,11 +1114,13 @@ private: QPropertySpec *m_propertySpec = nullptr; AbstractMetaArgumentList m_arguments; AddedFunctionPtr m_addedFunction; + SourceLocation m_sourceLocation; uint m_constant : 1; uint m_reverse : 1; uint m_explicit : 1; uint m_pointerOperator : 1; uint m_isCallOperator : 1; + mutable int m_cachedOverloadNumber = TypeSystem::OverloadNumberUnset; ExceptionSpecification m_exceptionSpecification = ExceptionSpecification::Unknown; TypeSystem::AllowThread m_allowThreadModification = TypeSystem::AllowThread::Unspecified; TypeSystem::ExceptionHandling m_exceptionHandlingModification = TypeSystem::ExceptionHandling::Unspecified; @@ -1172,7 +1186,7 @@ private: Documentation m_doc; }; -class AbstractMetaEnum : public AbstractMetaAttributes +class AbstractMetaEnum : public AbstractMetaAttributes, public EnclosingClassMixin { public: AbstractMetaEnum(); @@ -1227,23 +1241,12 @@ public: m_typeEntry = entry; } - AbstractMetaClass *enclosingClass() const - { - return m_class; - } - - void setEnclosingClass(AbstractMetaClass *c) - { - m_class = c; - } - bool isSigned() const { return m_signed; } void setSigned(bool s) { m_signed = s; } private: AbstractMetaEnumValueList m_enumValues; EnumTypeEntry *m_typeEntry = nullptr; - AbstractMetaClass *m_class = nullptr; EnumKind m_enumKind = CEnum; uint m_hasQenumsDeclaration : 1; @@ -1254,7 +1257,7 @@ private: QDebug operator<<(QDebug d, const AbstractMetaEnum *ae); #endif -class AbstractMetaClass : public AbstractMetaAttributes +class AbstractMetaClass : public AbstractMetaAttributes, public EnclosingClassMixin { Q_GADGET public: @@ -1275,7 +1278,9 @@ public: VirtualInTargetLangFunctions = 0x0080000, // Only functions which are virtual in TargetLang NotRemovedFromTargetLang = 0x0400000, // Only functions that have not been removed from TargetLang OperatorOverloads = 0x2000000, // Only functions that are operator overloads - GenerateExceptionHandling = 0x4000000 + GenerateExceptionHandling = 0x4000000, + GetAttroFunction = 0x8000000, + SetAttroFunction = 0x10000000 }; Q_DECLARE_FLAGS(FunctionQueryOptions, FunctionQueryOption) Q_FLAG(FunctionQueryOption) @@ -1299,7 +1304,6 @@ public: AbstractMetaClass(); ~AbstractMetaClass(); - AbstractMetaClass *extractInterface(); void fixFunctions(); AbstractMetaFunctionList functions() const @@ -1367,10 +1371,7 @@ public: return m_hasVirtualDestructor; } - void setHasVirtualDestructor(bool value) - { - m_hasVirtualDestructor = value; - } + void setHasVirtualDestructor(bool value); bool isConstructible() const { @@ -1423,10 +1424,7 @@ public: AbstractMetaField *findField(const QString &name) const; - AbstractMetaEnumList enums() const - { - return m_enums; - } + const AbstractMetaEnumList &enums() const { return m_enums; } void setEnums(const AbstractMetaEnumList &enums) { m_enums = enums; @@ -1439,13 +1437,10 @@ public: AbstractMetaEnum *findEnum(const QString &enumName); AbstractMetaEnumValue *findEnumValue(const QString &enumName); + void getEnumsToBeGenerated(AbstractMetaEnumList *enumList) const; + void getEnumsFromInvisibleNamespacesToBeGenerated(AbstractMetaEnumList *enumList) const; - AbstractMetaClassList interfaces() const - { - return m_interfaces; - } - void addInterface(AbstractMetaClass *interface); - void setInterfaces(const AbstractMetaClassList &interface); + void getFunctionsFromInvisibleNamespacesToBeGenerated(AbstractMetaFunctionList *funcList) const; QString fullName() const { @@ -1460,32 +1455,24 @@ public: QString baseClassName() const { - return m_baseClass ? m_baseClass->name() : QString(); + return m_baseClasses.isEmpty() ? QString() : m_baseClasses.constFirst()->name(); } AbstractMetaClass *baseClass() const { - return m_baseClass; + return m_baseClasses.value(0, nullptr); } + const AbstractMetaClassList &baseClasses() const { return m_baseClasses; } + void addBaseClass(AbstractMetaClass *base_class); void setBaseClass(AbstractMetaClass *base_class); - const AbstractMetaClass *enclosingClass() const - { - return m_enclosingClass; - } - /** * \return the namespace from another package which this namespace extends. */ AbstractMetaClass *extendedNamespace() const { return m_extendedNamespace; } void setExtendedNamespace(AbstractMetaClass *e) { m_extendedNamespace = e; } - void setEnclosingClass(AbstractMetaClass *cl) - { - m_enclosingClass = cl; - } - const AbstractMetaClassList& innerClasses() const { return m_innerClasses; @@ -1503,9 +1490,8 @@ public: QString package() const; - bool isInterface() const; - bool isNamespace() const; + bool isInvisibleNamespace() const; bool isQObject() const; @@ -1557,8 +1543,6 @@ public: m_templateArgs = args; } - bool hasFieldAccessors() const; - // only valid during metabuilder's run QStringList baseClassNames() const { @@ -1621,11 +1605,9 @@ public: m_propertySpecs << spec; } - QVector<QPropertySpec *> propertySpecs() const - { - return m_propertySpecs; - } + const QVector<QPropertySpec *> &propertySpecs() const { return m_propertySpecs; } + QPropertySpec *propertySpecByName(const QString &name) const; QPropertySpec *propertySpecForRead(const QString &name) const; QPropertySpec *propertySpecForWrite(const QString &name) const; QPropertySpec *propertySpecForReset(const QString &name) const; @@ -1660,8 +1642,8 @@ public: } bool hasTemplateBaseClassInstantiations() const; - AbstractMetaTypeList templateBaseClassInstantiations() const; - void setTemplateBaseClassInstantiations(AbstractMetaTypeList& instantiations); + const AbstractMetaTypeList &templateBaseClassInstantiations() const; + void setTemplateBaseClassInstantiations(const AbstractMetaTypeList& instantiations); void setTypeDef(bool typeDef) { m_isTypeDef = typeDef; } bool isTypeDef() const { return m_isTypeDef; } @@ -1703,8 +1685,16 @@ public: static AbstractMetaEnum *findEnum(const AbstractMetaClassList &classes, const EnumTypeEntry *entry); + SourceLocation sourceLocation() const; + void setSourceLocation(const SourceLocation &sourceLocation); + + template <class Function> + void invisibleNamespaceRecursion(Function f) const; + private: #ifndef QT_NO_DEBUG_STREAM + void format(QDebug &d) const; + void formatMembers(QDebug &d) const; friend QDebug operator<<(QDebug d, const AbstractMetaClass *ac); #endif uint m_hasVirtuals : 1; @@ -1723,23 +1713,23 @@ private: uint m_hasToStringCapability : 1; const AbstractMetaClass *m_enclosingClass = nullptr; - AbstractMetaClass *m_baseClass = nullptr; + AbstractMetaClassList m_baseClasses; // Real base classes after setting up inheritance + AbstractMetaTypeList m_baseTemplateInstantiations; AbstractMetaClass *m_extendedNamespace = nullptr; const AbstractMetaClass *m_templateBaseClass = nullptr; AbstractMetaFunctionList m_functions; AbstractMetaFieldList m_fields; AbstractMetaEnumList m_enums; - AbstractMetaClassList m_interfaces; - AbstractMetaClass *m_extractedInterface = nullptr; QVector<QPropertySpec *> m_propertySpecs; AbstractMetaClassList m_innerClasses; AbstractMetaFunctionList m_externalConversionOperators; - QStringList m_baseClassNames; + QStringList m_baseClassNames; // Base class names from C++, including rejected QVector<TypeEntry *> m_templateArgs; ComplexTypeEntry *m_typeEntry = nullptr; + SourceLocation m_sourceLocation; // FunctionModelItem m_qDebugStreamFunction; bool m_stream = false; @@ -1749,84 +1739,15 @@ private: Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractMetaClass::FunctionQueryOptions) Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractMetaClass::OperatorQueryOptions) -class QPropertySpec +template <class Function> +void AbstractMetaClass::invisibleNamespaceRecursion(Function f) const { -public: - explicit QPropertySpec(const TypeEntry *type) : m_type(type) {} - - const TypeEntry *type() const - { - return m_type; - } - - QString name() const - { - return m_name; - } - - void setName(const QString &name) - { - m_name = name; - } - - QString read() const - { - return m_read; - } - - void setRead(const QString &read) - { - m_read = read; - } - - QString write() const - { - return m_write; - } - - void setWrite(const QString &write) - { - m_write = write; - } - - QString designable() const - { - return m_designable; - } - - void setDesignable(const QString &designable) - { - m_designable = designable; - } - - QString reset() const - { - return m_reset; - } - - void setReset(const QString &reset) - { - m_reset = reset; - } - - int index() const - { - return m_index; - } - - void setIndex(int index) - { - m_index = index; + for (auto ic : m_innerClasses) { + if (ic->isInvisibleNamespace()) { + f(ic); + ic->invisibleNamespaceRecursion(f); + } } - -private: - QString m_name; - QString m_read; - QString m_write; - QString m_designable; - QString m_reset; - const TypeEntry *m_type; - int m_index = -1; -}; +} #endif // ABSTRACTMETALANG_H |