aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/ApiExtractor/abstractmetalang.h
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken2/ApiExtractor/abstractmetalang.h')
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h291
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