aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/ApiExtractor/typesystem.h
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken2/ApiExtractor/typesystem.h')
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem.h147
1 files changed, 93 insertions, 54 deletions
diff --git a/sources/shiboken2/ApiExtractor/typesystem.h b/sources/shiboken2/ApiExtractor/typesystem.h
index a8ee0ced4..f825379e7 100644
--- a/sources/shiboken2/ApiExtractor/typesystem.h
+++ b/sources/shiboken2/ApiExtractor/typesystem.h
@@ -35,9 +35,11 @@
#include <QtCore/QHash>
#include <QtCore/qobjectdefs.h>
+#include <QtCore/QRegularExpression>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QMap>
+#include <QtCore/QVector>
//Used to identify the conversion rule to avoid break API
#define TARGET_CONVERSION_RULE_FLAG "0"
@@ -47,6 +49,7 @@ class Indentor;
class AbstractMetaType;
QT_BEGIN_NAMESPACE
+class QDebug;
class QTextStream;
QT_END_NAMESPACE
@@ -103,6 +106,7 @@ private:
TemplateInstance *m_instance;
public:
+ CodeSnipFragment() : m_instance(0) {}
CodeSnipFragment(const QString &code)
: m_code(code),
m_instance(0) {}
@@ -126,7 +130,7 @@ public:
codeList.append(CodeSnipFragment(ti));
}
- QList<CodeSnipFragment> codeList;
+ QVector<CodeSnipFragment> codeList;
};
class CustomFunction : public CodeSnipAbstract
@@ -194,6 +198,7 @@ private:
class CodeSnip : public CodeSnipAbstract
{
public:
+ CodeSnip() : language(TypeSystem::TargetLangCode), version(0) {}
CodeSnip(double vr) : language(TypeSystem::TargetLangCode), version(vr) { }
CodeSnip(double vr, TypeSystem::Language lang) : language(lang), version(vr) { }
@@ -205,21 +210,24 @@ public:
struct ArgumentModification
{
+ ArgumentModification() : removedDefaultExpression(false), removed(false),
+ noNullPointers(false), array(false), index(-1), version(0) {}
ArgumentModification(int idx, double vr)
: removedDefaultExpression(false), removed(false),
- noNullPointers(false), index(idx), version(vr) {}
+ noNullPointers(false), array(false), index(idx), version(vr) {}
// Should the default expression be removed?
uint removedDefaultExpression : 1;
uint removed : 1;
uint noNullPointers : 1;
uint resetAfterUse : 1;
+ uint array : 1; // consider "int*" to be "int[]"
// The index of this argument
int index;
// Reference count flags for this argument
- QList<ReferenceCount> referenceCounts;
+ QVector<ReferenceCount> referenceCounts;
// The text given for the new type of the argument
QString modified_type;
@@ -344,6 +352,7 @@ struct Modification
struct FunctionModification: public Modification
{
+ FunctionModification() : m_thread(false), m_allowThread(false), m_version(0) {}
FunctionModification(double vr) : m_thread(false), m_allowThread(false), m_version(vr) {}
bool isCodeInjection() const
@@ -374,18 +383,26 @@ struct FunctionModification: public Modification
bool operator!=(const FunctionModification& other) const;
bool operator==(const FunctionModification& other) const;
+ 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; }
QString toString() const;
- QString signature;
QString association;
CodeSnipList snips;
- QList<ArgumentModification> argument_mods;
+ QVector<ArgumentModification> argument_mods;
private:
- FunctionModification() {}
-
+ QString m_signature;
+ QRegularExpression m_signaturePattern;
bool m_thread;
bool m_allowThread;
double m_version;
@@ -440,6 +457,7 @@ struct AddedFunction
/// Creates a new AddedFunction with a signature and a return type.
AddedFunction(QString signature, QString returnType, double vr);
+ AddedFunction() : m_access(Protected), m_isConst(false), m_isStatic(false), m_version(0) {}
/// Returns the function name.
QString name() const
@@ -466,7 +484,7 @@ struct AddedFunction
}
/// Returns a list of argument type infos.
- QList<TypeInfo> arguments() const
+ QVector<TypeInfo> arguments() const
{
return m_arguments;
}
@@ -496,7 +514,7 @@ struct AddedFunction
private:
QString m_name;
Access m_access;
- QList<TypeInfo> m_arguments;
+ QVector<TypeInfo> m_arguments;
TypeInfo m_returnType;
bool m_isConst;
bool m_isStatic;
@@ -525,6 +543,7 @@ class ObjectTypeEntry;
class DocModification
{
public:
+ DocModification() : format(TypeSystem::NativeCode), m_mode(TypeSystem::DocModificationXPathReplace), m_version(0) {}
DocModification(const QString& xpath, const QString& signature, double vr)
: format(TypeSystem::NativeCode), m_mode(TypeSystem::DocModificationXPathReplace),
m_xpath(xpath), m_signature(signature), m_version(vr) {}
@@ -882,7 +901,13 @@ public:
}
void setInclude(const Include &inc)
{
- m_include = inc;
+ // This is a workaround for preventing double inclusion of the QSharedPointer implementation
+ // header, which does not use header guards. In the previous parser this was not a problem
+ // because the Q_QDOC define was set, and the implementation header was never included.
+ if (inc.name() == QLatin1String("qsharedpointer_impl.h"))
+ m_include = Include(inc.type(), QLatin1String("qsharedpointer.h"));
+ else
+ m_include = inc;
}
// Replace conversionRule arg to CodeSnip in future version
@@ -1004,11 +1029,11 @@ public:
return m_nestedType;
}
- QString targetLangName() const
+ QString targetLangName() const override
{
return m_nestedType->targetLangName() + QLatin1String("[]");
}
- QString targetLangApiName() const
+ QString targetLangApiName() const override
{
if (m_nestedType->isPrimitive())
return m_nestedType->targetLangApiName() + QLatin1String("Array");
@@ -1032,7 +1057,7 @@ public:
{
}
- QString targetLangName() const
+ QString targetLangName() const override
{
return m_targetLangName;
}
@@ -1041,7 +1066,7 @@ public:
m_targetLangName = targetLangName;
}
- QString targetLangApiName() const
+ QString targetLangApiName() const override
{
return m_targetLangApiName;
}
@@ -1088,26 +1113,26 @@ public:
*/
PrimitiveTypeEntry* basicReferencedTypeEntry() const;
- virtual bool preferredConversion() const
+ bool preferredConversion() const override
{
return m_preferredConversion;
}
- virtual void setPreferredConversion(bool b)
+ void setPreferredConversion(bool b) override
{
m_preferredConversion = b;
}
- virtual bool preferredTargetLangType() const
+ bool preferredTargetLangType() const
{
return m_preferredTargetLangType;
}
- virtual void setPreferredTargetLangType(bool b)
+ void setPreferredTargetLangType(bool b)
{
m_preferredTargetLangType = b;
}
void setTargetLangPackage(const QString& package);
- QString targetLangPackage() const;
+ QString targetLangPackage() const override;
private:
QString m_targetLangName;
QString m_targetLangApiName;
@@ -1119,6 +1144,7 @@ private:
struct EnumValueRedirection
{
+ EnumValueRedirection() {}
EnumValueRedirection(const QString &rej, const QString &us)
: rejected(rej),
used(us)
@@ -1157,7 +1183,7 @@ public:
return m_targetLangName;
}
QString targetLangQualifier() const;
- QString qualifiedTargetLangName() const
+ QString qualifiedTargetLangName() const override
{
QString qualifiedName;
QString pkg = targetLangPackage();
@@ -1172,7 +1198,7 @@ public:
return qualifiedName;
}
- QString targetLangApiName() const;
+ QString targetLangApiName() const override;
QString qualifier() const
{
@@ -1183,7 +1209,7 @@ public:
m_qualifier = q;
}
- virtual bool preferredConversion() const
+ bool preferredConversion() const override
{
return false;
}
@@ -1272,7 +1298,7 @@ private:
QString m_upperBound;
QStringList m_rejectedEnums;
- QList<EnumValueRedirection> m_enumRedirections;
+ QVector<EnumValueRedirection> m_enumRedirections;
FlagsTypeEntry *m_flags;
@@ -1303,13 +1329,13 @@ public:
{
}
- QString qualifiedTargetLangName() const;
- QString targetLangName() const
+ QString qualifiedTargetLangName() const override;
+ QString targetLangName() const override
{
return m_targetLangName;
}
- QString targetLangApiName() const;
- virtual bool preferredConversion() const
+ QString targetLangApiName() const override;
+ bool preferredConversion() const override
{
return false;
}
@@ -1346,7 +1372,7 @@ public:
m_enum = e;
}
- QString targetLangPackage() const
+ QString targetLangPackage() const override
{
return m_enum->targetLangPackage();
}
@@ -1414,12 +1440,12 @@ public:
m_lookupName = name;
}
- virtual QString lookupName() const
+ QString lookupName() const override
{
return m_lookupName.isEmpty() ? targetLangName() : m_lookupName;
}
- QString targetLangApiName() const;
+ QString targetLangApiName() const override;
void setTypeFlags(TypeFlags flags)
{
@@ -1495,7 +1521,7 @@ public:
m_defaultSuperclass = sc;
}
- virtual QString qualifiedCppName() const
+ QString qualifiedCppName() const override
{
return m_qualifiedCppName;
}
@@ -1547,7 +1573,7 @@ public:
m_targetType = code;
}
- QString targetLangName() const
+ QString targetLangName() const override
{
return m_targetLangName.isEmpty()
? TypeEntry::targetLangName()
@@ -1728,12 +1754,12 @@ class ValueTypeEntry : public ComplexTypeEntry
public:
ValueTypeEntry(const QString &name, double vr) : ComplexTypeEntry(name, BasicValueType, vr) { }
- bool isValue() const
+ bool isValue() const override
{
return true;
}
- virtual bool isNativeIdBased() const
+ bool isNativeIdBased() const override
{
return true;
}
@@ -1752,11 +1778,11 @@ public:
setCodeGeneration(GenerateNothing);
}
- QString targetLangApiName() const;
- QString targetLangName() const;
- QString targetLangPackage() const;
+ QString targetLangApiName() const override;
+ QString targetLangName() const override;
+ QString targetLangPackage() const override;
- virtual bool isNativeIdBased() const
+ bool isNativeIdBased() const override
{
return false;
}
@@ -1770,14 +1796,14 @@ public:
setCodeGeneration(GenerateNothing);
}
- QString targetLangApiName() const;
- QString targetLangName() const;
- QString targetLangPackage() const
+ QString targetLangApiName() const override;
+ QString targetLangName() const override;
+ QString targetLangPackage() const override
{
return QString();
}
- virtual bool isNativeIdBased() const
+ bool isNativeIdBased() const override
{
return false;
}
@@ -1788,11 +1814,11 @@ class VariantTypeEntry: public ValueTypeEntry
public:
VariantTypeEntry(const QString &name, double vr) : ValueTypeEntry(name, VariantType, vr) { }
- QString targetLangApiName() const;
- QString targetLangName() const;
- QString targetLangPackage() const;
+ QString targetLangApiName() const override;
+ QString targetLangName() const override;
+ QString targetLangPackage() const override;
- virtual bool isNativeIdBased() const
+ bool isNativeIdBased() const override
{
return false;
}
@@ -1819,11 +1845,11 @@ public:
m_origin = origin;
}
- virtual bool isNativeIdBased() const
+ bool isNativeIdBased() const override
{
return true;
}
- virtual QString qualifiedCppName() const
+ QString qualifiedCppName() const override
{
const int len = ComplexTypeEntry::qualifiedCppName().length() - interfaceName(QString()).length();
return ComplexTypeEntry::qualifiedCppName().left(len);
@@ -1875,7 +1901,7 @@ public:
m_interface = entry;
}
- virtual bool isNativeIdBased() const
+ bool isNativeIdBased() const override
{
return true;
}
@@ -1886,12 +1912,25 @@ private:
struct TypeRejection
{
- QString class_name;
- QString function_name;
- QString field_name;
- QString enum_name;
+ 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
+ };
+
+ QRegularExpression className;
+ QRegularExpression pattern;
+ MatchType matchType;
};
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug d, const TypeRejection &r);
+#endif
+
QString fixCppTypeName(const QString &name);
class CustomConversion
@@ -1932,7 +1971,7 @@ public:
bool replaceOriginalTargetToNativeConversions() const;
void setReplaceOriginalTargetToNativeConversions(bool replaceOriginalTargetToNativeConversions);
- typedef QList<TargetToNativeConversion*> TargetToNativeConversions;
+ typedef QVector<TargetToNativeConversion*> TargetToNativeConversions;
bool hasTargetToNativeConversions() const;
TargetToNativeConversions& targetToNativeConversions();
const TargetToNativeConversions& targetToNativeConversions() const;