diff options
Diffstat (limited to 'sources/shiboken2/ApiExtractor/typesystem.h')
-rw-r--r-- | sources/shiboken2/ApiExtractor/typesystem.h | 147 |
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; |