aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/typesystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken6/ApiExtractor/typesystem.cpp')
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem.cpp2649
1 files changed, 2649 insertions, 0 deletions
diff --git a/sources/shiboken6/ApiExtractor/typesystem.cpp b/sources/shiboken6/ApiExtractor/typesystem.cpp
new file mode 100644
index 000000000..99d42b668
--- /dev/null
+++ b/sources/shiboken6/ApiExtractor/typesystem.cpp
@@ -0,0 +1,2649 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include "typesystem.h"
+#include "arraytypeentry.h"
+#include "codesnip.h"
+#include "complextypeentry.h"
+#include "configurabletypeentry.h"
+#include "constantvaluetypeentry.h"
+#include "containertypeentry.h"
+#include "customtypenentry.h"
+#include "debughelpers_p.h"
+#include "enumtypeentry.h"
+#include "enumvaluetypeentry.h"
+#include "flagstypeentry.h"
+#include "functiontypeentry.h"
+#include "include.h"
+#include "namespacetypeentry.h"
+#include "objecttypeentry.h"
+#include "primitivetypeentry.h"
+#include "pythontypeentry.h"
+#include "smartpointertypeentry.h"
+#include "templateargumententry.h"
+#include "typedefentry.h"
+#include "typesystemtypeentry.h"
+#include "valuetypeentry.h"
+#include "varargstypeentry.h"
+#include "voidtypeentry.h"
+#include "abstractmetatype.h"
+#include "typedatabase.h"
+#include "modifications.h"
+#include "sourcelocation.h"
+
+#include "qtcompat.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/QRegularExpression>
+#include <QtCore/QSet>
+#include <QtCore/QVarLengthArray>
+
+using namespace Qt::StringLiterals;
+
+static QString buildName(const QString &entryName, const TypeEntryCPtr &parent)
+{
+ return parent == nullptr || parent->type() == TypeEntry::TypeSystemType
+ ? entryName : parent->name() + u"::"_s + entryName;
+}
+
+// Access private class as 'd', cf macro Q_D()
+#define S_D(Class) auto d = static_cast<Class##Private *>(d_func())
+
+class TypeEntryPrivate
+{
+public:
+ TypeEntryPrivate(const TypeEntryPrivate &) = default; // Enable copy for cloning.
+ TypeEntryPrivate &operator=(const TypeEntryPrivate &) = delete;
+ TypeEntryPrivate(TypeEntryPrivate &&) = delete;
+ TypeEntryPrivate &operator=(TypeEntryPrivate &&) = delete;
+
+ explicit TypeEntryPrivate(const QString &entryName, TypeEntry::Type t, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent);
+ virtual ~TypeEntryPrivate() = default;
+
+ QString shortName() const;
+
+ TypeEntryCPtr 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"
+ IncludeList m_extraIncludes;
+ Include m_include;
+ QVersionNumber m_version;
+ SourceLocation m_sourceLocation; // XML file
+ TypeEntry::CodeGeneration m_codeGeneration = TypeEntry::GenerateCode;
+ TypeEntryPtr m_viewOn;
+ CustomTypeEntryPtr m_targetLangApiType;
+ int m_revision = 0;
+ int m_sbkIndex = 0;
+ TypeEntry::Type m_type;
+ bool m_stream = false;
+ bool m_private = false;
+ bool m_builtin = false;
+};
+
+TypeEntryPrivate::TypeEntryPrivate(const QString &entryName, TypeEntry::Type t, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ m_parent(parent),
+ m_name(buildName(entryName, parent)),
+ m_entryName(entryName),
+ m_version(vr),
+ m_type(t)
+{
+}
+
+TypeEntry::TypeEntry(const QString &entryName, TypeEntry::Type t, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new TypeEntryPrivate(entryName, t, vr, parent))
+{
+}
+
+TypeEntry::TypeEntry(TypeEntryPrivate *d) : m_d(d)
+{
+}
+
+TypeEntry::~TypeEntry() = default;
+
+const IncludeList &TypeEntry::extraIncludes() const
+{
+ return m_d->m_extraIncludes;
+}
+
+void TypeEntry::setExtraIncludes(const IncludeList &includes)
+{
+ m_d->m_extraIncludes = includes;
+}
+
+void TypeEntry::addExtraInclude(const Include &newInclude)
+{
+ if (!m_d->m_extraIncludes.contains(newInclude))
+ m_d->m_extraIncludes.append(newInclude);
+}
+
+Include TypeEntry::include() const
+{
+ return m_d->m_include;
+}
+
+void TypeEntry::setInclude(const 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().endsWith(u"qsharedpointer_impl.h")) {
+ QString path = inc.name();
+ path.remove(u"_impl"_s);
+ m_d->m_include = Include(inc.type(), path);
+ } else {
+ m_d->m_include = inc;
+ }
+}
+
+QVersionNumber TypeEntry::version() const
+{
+ return m_d->m_version;
+}
+
+bool isCppPrimitive(const TypeEntryCPtr &e)
+{
+ if (!e->isPrimitive())
+ return false;
+
+ if (e->type() == TypeEntry::VoidType)
+ return true;
+
+ PrimitiveTypeEntryCPtr referencedType = basicReferencedTypeEntry(e);
+ const QString &typeName = referencedType->name();
+ return AbstractMetaType::cppPrimitiveTypes().contains(typeName);
+}
+
+TypeEntry::Type TypeEntry::type() const
+{
+ return m_d->m_type;
+}
+
+TypeEntryCPtr TypeEntry::parent() const
+{
+ return m_d->m_parent;
+}
+
+void TypeEntry::setParent(const TypeEntryCPtr &p)
+{
+ m_d->m_parent = p;
+}
+
+bool TypeEntry::isChildOf(const TypeEntryCPtr &p) const
+{
+ for (auto e = m_d->m_parent; e; e = e->parent()) {
+ if (e == p)
+ return true;
+ }
+ return false;
+}
+
+TypeSystemTypeEntryCPtr typeSystemTypeEntry(TypeEntryCPtr e)
+{
+ for (; e; e = e->parent()) {
+ if (e->type() == TypeEntry::TypeSystemType)
+ return std::static_pointer_cast<const TypeSystemTypeEntry>(e);
+ }
+ return {};
+}
+
+TypeEntryCPtr targetLangEnclosingEntry(const TypeEntryCPtr &e)
+{
+ auto result = e->parent();
+ while (result && result->type() != TypeEntry::TypeSystemType
+ && !NamespaceTypeEntry::isVisibleScope(result)) {
+ result = result->parent();
+ }
+ return result;
+}
+
+bool TypeEntry::isPrimitive() const
+{
+ return m_d->m_type == PrimitiveType;
+}
+
+bool TypeEntry::isEnum() const
+{
+ return m_d->m_type == EnumType;
+}
+
+bool TypeEntry::isFlags() const
+{
+ return m_d->m_type == FlagsType;
+}
+
+bool TypeEntry::isObject() const
+{
+ return m_d->m_type == ObjectType;
+}
+
+bool TypeEntry::isNamespace() const
+{
+ return m_d->m_type == NamespaceType;
+}
+
+bool TypeEntry::isContainer() const
+{
+ return m_d->m_type == ContainerType;
+}
+
+bool TypeEntry::isSmartPointer() const
+{
+ return m_d->m_type == SmartPointerType;
+}
+
+bool TypeEntry::isUniquePointer() const
+{
+ if (m_d->m_type != SmartPointerType)
+ return false;
+ auto *ste = static_cast<const SmartPointerTypeEntry *>(this);
+ return ste->smartPointerType() == TypeSystem::SmartPointerType::Unique;
+}
+
+bool TypeEntry::isArray() const
+{
+ return m_d->m_type == ArrayType;
+}
+
+bool TypeEntry::isTemplateArgument() const
+{
+ return m_d->m_type == TemplateArgumentType;
+}
+
+bool TypeEntry::isVoid() const
+{
+ return m_d->m_type == VoidType;
+}
+
+bool TypeEntry::isVarargs() const
+{
+ return m_d->m_type == VarargsType;
+}
+
+bool TypeEntry::isCustom() const
+{
+ return m_d->m_type == CustomType || m_d->m_type == PythonType;
+}
+
+bool TypeEntry::isTypeSystem() const
+{
+ return m_d->m_type == TypeSystemType;
+}
+
+bool TypeEntry::isFunction() const
+{
+ return m_d->m_type == FunctionType;
+}
+
+bool TypeEntry::isEnumValue() const
+{
+ return m_d->m_type == EnumValue;
+}
+
+bool TypeEntry::stream() const
+{
+ return m_d->m_stream;
+}
+
+void TypeEntry::setStream(bool b)
+{
+ m_d->m_stream = b;
+}
+
+bool TypeEntry::isBuiltIn() const
+{
+ return m_d->m_builtin;
+}
+
+void TypeEntry::setBuiltIn(bool b)
+{
+ m_d->m_builtin = b;
+}
+
+bool TypeEntry::isPrivate() const
+{
+ return m_d->m_private;
+}
+
+void TypeEntry::setPrivate(bool b)
+{
+ m_d->m_private = b;
+}
+
+QString TypeEntry::name() const
+{
+ return m_d->m_name;
+}
+
+// Build the C++ name excluding any inline namespaces
+// ("std::__1::shared_ptr" -> "std::shared_ptr"
+QString TypeEntryPrivate::shortName() const
+{
+ if (m_cachedShortName.isEmpty()) {
+ QVarLengthArray<TypeEntryCPtr > parents;
+ bool foundInlineNamespace = false;
+ for (auto p = m_parent; p != nullptr && p->type() != TypeEntry::TypeSystemType; p = p->parent()) {
+ if (p->type() == TypeEntry::NamespaceType
+ && std::static_pointer_cast<const NamespaceTypeEntry>(p)->isInlineNamespace()) {
+ foundInlineNamespace = true;
+ } else {
+ parents.append(p);
+ }
+ }
+ if (foundInlineNamespace) {
+ m_cachedShortName.reserve(m_name.size());
+ for (auto i = parents.size() - 1; i >= 0; --i) {
+ m_cachedShortName.append(parents.at(i)->entryName());
+ m_cachedShortName.append(u"::"_s);
+ }
+ m_cachedShortName.append(m_entryName);
+ } else {
+ m_cachedShortName = m_name;
+ }
+ }
+ return m_cachedShortName;
+}
+
+QString TypeEntry::shortName() const
+{
+ return m_d->shortName();
+}
+
+QString TypeEntry::entryName() const
+{
+ return m_d->m_entryName;
+}
+
+TypeEntry::CodeGeneration TypeEntry::codeGeneration() const
+{
+ return m_d->m_codeGeneration;
+}
+
+void TypeEntry::setCodeGeneration(TypeEntry::CodeGeneration cg)
+{
+ m_d->m_codeGeneration = cg;
+}
+
+bool TypeEntry::generateCode() const
+{
+ return m_d->m_codeGeneration == GenerateCode;
+}
+
+bool TypeEntry::shouldGenerate() const
+{
+ return generateCode() && NamespaceTypeEntry::isVisibleScope(this);
+}
+
+int TypeEntry::revision() const
+{
+ return m_d->m_revision;
+}
+
+void TypeEntry::setSbkIndex(int i)
+{
+ m_d->m_sbkIndex = i;
+}
+
+QString TypeEntry::qualifiedCppName() const
+{
+ return m_d->m_name;
+}
+
+CustomTypeEntryCPtr TypeEntry::targetLangApiType() const
+{
+ return m_d->m_targetLangApiType;
+}
+
+bool TypeEntry::hasTargetLangApiType() const
+{
+ return m_d->m_targetLangApiType != nullptr;
+}
+
+void TypeEntry::setTargetLangApiType(const CustomTypeEntryPtr &cte)
+{
+ m_d->m_targetLangApiType = cte;
+}
+
+QString TypeEntry::targetLangApiName() const
+{
+ return m_d->m_targetLangApiType != nullptr
+ ? m_d->m_targetLangApiType->name() : m_d->m_name;
+}
+
+QString TypeEntry::targetLangName() const
+{
+ if (m_d->m_cachedTargetLangName.isEmpty())
+ m_d->m_cachedTargetLangName = buildTargetLangName();
+ return m_d->m_cachedTargetLangName;
+}
+
+void TypeEntry::setTargetLangName(const QString &n)
+{
+ m_d->m_cachedTargetLangName = n;
+}
+
+QString TypeEntry::buildTargetLangName() const
+{
+ QString result = m_d->m_entryName;
+ for (auto p = parent(); p && p->type() != TypeEntry::TypeSystemType; p = p->parent()) {
+ if (NamespaceTypeEntry::isVisibleScope(p)) {
+ if (!result.isEmpty())
+ result.prepend(u'.');
+ QString n = p->m_d->m_entryName;
+ n.replace(u"::"_s, u"."_s); // Primitive types may have "std::"
+ result.prepend(n);
+ }
+ }
+ return result;
+}
+
+bool TypeEntry::setRevisionHelper(int r)
+{
+ const bool changed = m_d->m_revision != r;
+ m_d->m_revision = r;
+ return changed;
+}
+
+int TypeEntry::sbkIndexHelper() const
+{
+ return m_d->m_sbkIndex;
+}
+
+SourceLocation TypeEntry::sourceLocation() const
+{
+ return m_d->m_sourceLocation;
+}
+
+void TypeEntry::setSourceLocation(const SourceLocation &sourceLocation)
+{
+ m_d->m_sourceLocation = sourceLocation;
+}
+
+bool isUserPrimitive(const TypeEntryCPtr &e)
+{
+ if (!e->isPrimitive())
+ return false;
+ const auto type = basicReferencedTypeEntry(e);
+ return !isCppPrimitive(type)
+ && type->qualifiedCppName() != u"std::string";
+}
+
+bool TypeEntry::isWrapperType() const
+{
+ return isObject() || isValue() || isSmartPointer();
+}
+
+bool isCppIntegralPrimitive(const TypeEntryCPtr &e)
+{
+ if (!isCppPrimitive(e))
+ return false;
+ const auto type = basicReferencedTypeEntry(e);
+ return AbstractMetaType::cppIntegralTypes().contains(type->qualifiedCppName());
+}
+
+bool isExtendedCppPrimitive(const TypeEntryCPtr &e)
+{
+ if (isCppPrimitive(e))
+ return true;
+ if (!e->isPrimitive())
+ return false;
+ const auto type = basicReferencedTypeEntry(e);
+ const QString &name = type->qualifiedCppName();
+ return name == u"std::string" || name == u"std::wstring";
+}
+
+const TypeEntryPrivate *TypeEntry::d_func() const
+{
+ return m_d.data();
+}
+
+TypeEntryPrivate *TypeEntry::d_func()
+{
+ return m_d.data();
+}
+
+QString TypeEntry::targetLangEntryName() const
+{
+ if (m_d->m_cachedTargetLangEntryName.isEmpty()) {
+ m_d->m_cachedTargetLangEntryName = targetLangName();
+ const int lastDot = m_d->m_cachedTargetLangEntryName.lastIndexOf(u'.');
+ if (lastDot != -1)
+ m_d->m_cachedTargetLangEntryName.remove(0, lastDot + 1);
+ }
+ return m_d->m_cachedTargetLangEntryName;
+}
+
+QString TypeEntry::targetLangPackage() const
+{
+ return m_d->m_targetLangPackage;
+}
+
+void TypeEntry::setTargetLangPackage(const QString &p)
+{
+ m_d->m_targetLangPackage = p;
+}
+
+QString TypeEntry::qualifiedTargetLangName() const
+{
+ return targetLangPackage() + u'.' + targetLangName();
+}
+
+bool TypeEntry::isValue() const
+{
+ return false;
+}
+
+bool TypeEntry::isComplex() const
+{
+ return false;
+}
+
+TypeEntryPtr TypeEntry::viewOn() const
+{
+ return m_d->m_viewOn;
+}
+
+void TypeEntry::setViewOn(const TypeEntryPtr &v)
+{
+ m_d->m_viewOn = v;
+}
+
+TypeEntry *TypeEntry::clone() const
+{
+ return new TypeEntry(new TypeEntryPrivate(*m_d.data()));
+}
+
+// Take over parameters relevant for typedefs
+void TypeEntry::useAsTypedef(const TypeEntryCPtr &source)
+{
+ // XML Typedefs are in the global namespace for now.
+ m_d->m_parent = typeSystemTypeEntry(source);
+ m_d->m_entryName = source->m_d->m_entryName;
+ m_d->m_name = source->m_d->m_name;
+ m_d->m_targetLangPackage = source->m_d->m_targetLangPackage;
+ m_d->m_cachedTargetLangName.clear(); // Clear cached names.
+ m_d->m_cachedTargetLangEntryName.clear();
+ m_d->m_codeGeneration = source->m_d->m_codeGeneration;
+ m_d->m_version = source->m_d->m_version;
+}
+
+// ----------------- CustomTypeEntry
+class CustomTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ using TypeEntryPrivate::TypeEntryPrivate;
+
+ QString m_checkFunction;
+};
+
+CustomTypeEntry::CustomTypeEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new CustomTypeEntryPrivate(entryName, CustomType, vr, parent))
+{
+}
+
+CustomTypeEntry::CustomTypeEntry(TypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+TypeEntry *CustomTypeEntry::clone() const
+{
+ S_D(const CustomTypeEntry);
+ return new CustomTypeEntry(new CustomTypeEntryPrivate(*d));
+}
+
+bool CustomTypeEntry::hasCheckFunction() const
+{
+ S_D(const CustomTypeEntry);
+ return !d->m_checkFunction.isEmpty();
+}
+
+QString CustomTypeEntry::checkFunction() const
+{
+ S_D(const CustomTypeEntry);
+ return d->m_checkFunction;
+}
+
+void CustomTypeEntry::setCheckFunction(const QString &f)
+{
+ S_D(CustomTypeEntry);
+ d->m_checkFunction = f;
+}
+
+// ----------------- PythonTypeEntry
+class PythonTypeEntryPrivate : public CustomTypeEntryPrivate
+{
+public:
+ using CustomTypeEntryPrivate::CustomTypeEntryPrivate;
+ explicit PythonTypeEntryPrivate(const QString &entryName,
+ const QString &checkFunction,
+ TypeSystem::CPythonType type) :
+ CustomTypeEntryPrivate(entryName, TypeEntry::PythonType, {}, {}),
+ m_cPythonType(type)
+ {
+ m_checkFunction = checkFunction;
+ }
+
+ TypeSystem::CPythonType m_cPythonType;
+};
+
+PythonTypeEntry::PythonTypeEntry(const QString &entryName,
+ const QString &checkFunction,
+ TypeSystem::CPythonType type) :
+ CustomTypeEntry(new PythonTypeEntryPrivate(entryName, checkFunction, type))
+{
+}
+
+TypeEntry *PythonTypeEntry::clone() const
+{
+ S_D(const PythonTypeEntry);
+ return new PythonTypeEntry(new PythonTypeEntryPrivate(*d));
+}
+
+TypeSystem::CPythonType PythonTypeEntry::cPythonType() const
+{
+ S_D(const PythonTypeEntry);
+ return d->m_cPythonType;
+}
+
+PythonTypeEntry::PythonTypeEntry(TypeEntryPrivate *d) :
+ CustomTypeEntry(d)
+{
+}
+
+// ----------------- TypeSystemTypeEntry
+class TypeSystemTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ using TypeEntryPrivate::TypeEntryPrivate;
+
+ CodeSnipList m_codeSnips;
+ TypeSystem::SnakeCase m_snakeCase = TypeSystem::SnakeCase::Disabled;
+ QString m_subModuleOf;
+ QString m_namespaceBegin;
+ QString m_namespaceEnd;
+};
+
+TypeSystemTypeEntry::TypeSystemTypeEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new TypeSystemTypeEntryPrivate(entryName, TypeSystemType, vr, parent))
+{
+}
+
+TypeSystemTypeEntry::TypeSystemTypeEntry(TypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+TypeEntry *TypeSystemTypeEntry::clone() const
+{
+ S_D(const TypeSystemTypeEntry);
+ return new TypeSystemTypeEntry(new TypeSystemTypeEntryPrivate(*d));
+}
+
+const CodeSnipList &TypeSystemTypeEntry::codeSnips() const
+{
+ S_D(const TypeSystemTypeEntry);
+ return d->m_codeSnips;
+}
+
+CodeSnipList &TypeSystemTypeEntry::codeSnips()
+{
+ S_D(TypeSystemTypeEntry);
+ return d->m_codeSnips;
+}
+
+void TypeSystemTypeEntry::addCodeSnip(const CodeSnip &codeSnip)
+{
+ S_D(TypeSystemTypeEntry);
+ d->m_codeSnips.append(codeSnip);
+}
+
+QString TypeSystemTypeEntry::subModuleOf() const
+{
+ S_D(const TypeSystemTypeEntry);
+ return d->m_subModuleOf;
+}
+
+void TypeSystemTypeEntry::setSubModule(const QString &s)
+{
+ S_D(TypeSystemTypeEntry);
+ d->m_subModuleOf = s;
+}
+
+const QString &TypeSystemTypeEntry::namespaceBegin() const
+{
+ S_D(const TypeSystemTypeEntry);
+ return d->m_namespaceBegin;
+}
+
+void TypeSystemTypeEntry::setNamespaceBegin(const QString &p)
+{
+ S_D(TypeSystemTypeEntry);
+ d->m_namespaceBegin = p;
+}
+
+const QString &TypeSystemTypeEntry::namespaceEnd() const
+{
+ S_D(const TypeSystemTypeEntry);
+ return d->m_namespaceEnd;
+}
+
+void TypeSystemTypeEntry::setNamespaceEnd(const QString &n)
+{
+ S_D(TypeSystemTypeEntry);
+ d->m_namespaceEnd = n;
+}
+
+TypeSystem::SnakeCase TypeSystemTypeEntry::snakeCase() const
+{
+ S_D(const TypeSystemTypeEntry);
+ return d->m_snakeCase;
+}
+
+void TypeSystemTypeEntry::setSnakeCase(TypeSystem::SnakeCase sc)
+{
+ S_D(TypeSystemTypeEntry);
+ d->m_snakeCase = sc;
+}
+
+// ----------------- VoidTypeEntry
+VoidTypeEntry::VoidTypeEntry() :
+ TypeEntry(u"void"_s, VoidType, QVersionNumber(0, 0), nullptr)
+{
+}
+
+VoidTypeEntry::VoidTypeEntry(TypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+TypeEntry *VoidTypeEntry::clone() const
+{
+ return new VoidTypeEntry(new TypeEntryPrivate(*d_func()));
+}
+
+VarargsTypeEntry::VarargsTypeEntry() :
+ TypeEntry(u"..."_s, VarargsType, QVersionNumber(0, 0), nullptr)
+{
+}
+
+// ----------------- VarargsTypeEntry
+TypeEntry *VarargsTypeEntry::clone() const
+{
+ return new VarargsTypeEntry(new TypeEntryPrivate(*d_func()));
+}
+
+VarargsTypeEntry::VarargsTypeEntry(TypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+// ----------------- TemplateArgumentEntry
+class TemplateArgumentEntryPrivate : public TypeEntryPrivate
+{
+public:
+ using TypeEntryPrivate::TypeEntryPrivate;
+
+ int m_ordinal = 0;
+};
+
+TemplateArgumentEntry::TemplateArgumentEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new TemplateArgumentEntryPrivate(entryName, TemplateArgumentType, vr, parent))
+{
+}
+
+int TemplateArgumentEntry::ordinal() const
+{
+ S_D(const TemplateArgumentEntry);
+ return d->m_ordinal;
+}
+
+void TemplateArgumentEntry::setOrdinal(int o)
+{
+ S_D(TemplateArgumentEntry);
+ d->m_ordinal = o;
+}
+
+TypeEntry *TemplateArgumentEntry::clone() const
+{
+ S_D(const TemplateArgumentEntry);
+ return new TemplateArgumentEntry(new TemplateArgumentEntryPrivate(*d));
+}
+
+TemplateArgumentEntry::TemplateArgumentEntry(TemplateArgumentEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+// ----------------- ArrayTypeEntry
+class ArrayTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ explicit ArrayTypeEntryPrivate(const TypeEntryCPtr &nested_type, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntryPrivate(u"Array"_s, TypeEntry::ArrayType, vr, parent),
+ m_nestedType(nested_type)
+ {
+ }
+
+ TypeEntryCPtr m_nestedType;
+};
+
+ArrayTypeEntry::ArrayTypeEntry(const TypeEntryCPtr &nested_type, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new ArrayTypeEntryPrivate(nested_type, vr, parent))
+{
+ Q_ASSERT(nested_type);
+}
+
+void ArrayTypeEntry::setNestedTypeEntry(const TypeEntryPtr &nested)
+{
+ S_D(ArrayTypeEntry);
+ d->m_nestedType = nested;
+}
+
+TypeEntryCPtr ArrayTypeEntry::nestedTypeEntry() const
+{
+ S_D(const ArrayTypeEntry);
+ return d->m_nestedType;
+}
+
+QString ArrayTypeEntry::buildTargetLangName() const
+{
+ S_D(const ArrayTypeEntry);
+ return d->m_nestedType->targetLangName() + u"[]"_s;
+}
+
+TypeEntry *ArrayTypeEntry::clone() const
+{
+ S_D(const ArrayTypeEntry);
+ return new ArrayTypeEntry(new ArrayTypeEntryPrivate(*d));
+}
+
+ArrayTypeEntry::ArrayTypeEntry(ArrayTypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+// ----------------- PrimitiveTypeEntry
+class PrimitiveTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ PrimitiveTypeEntryPrivate(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntryPrivate(entryName, TypeEntry::PrimitiveType, vr, parent),
+ m_preferredTargetLangType(true)
+ {
+ }
+
+ QString m_defaultConstructor;
+ CustomConversionPtr m_customConversion;
+ PrimitiveTypeEntryPtr m_referencedTypeEntry;
+ uint m_preferredTargetLangType : 1;
+};
+
+PrimitiveTypeEntry::PrimitiveTypeEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new PrimitiveTypeEntryPrivate(entryName, vr, parent))
+{
+}
+
+QString PrimitiveTypeEntry::defaultConstructor() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return d->m_defaultConstructor;
+}
+
+void PrimitiveTypeEntry::setDefaultConstructor(const QString &defaultConstructor)
+{
+ S_D(PrimitiveTypeEntry);
+ d->m_defaultConstructor = defaultConstructor;
+}
+
+bool PrimitiveTypeEntry::hasDefaultConstructor() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return !d->m_defaultConstructor.isEmpty();
+}
+
+PrimitiveTypeEntryPtr PrimitiveTypeEntry::referencedTypeEntry() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return d->m_referencedTypeEntry;
+}
+
+void PrimitiveTypeEntry::setReferencedTypeEntry(PrimitiveTypeEntryPtr referencedTypeEntry)
+{
+ S_D(PrimitiveTypeEntry);
+ d->m_referencedTypeEntry = referencedTypeEntry;
+}
+
+PrimitiveTypeEntryCPtr basicReferencedTypeEntry(const PrimitiveTypeEntryCPtr &e)
+{
+ auto result = e;
+ while (auto referenced = result->referencedTypeEntry())
+ result = referenced;
+ return result;
+}
+
+PrimitiveTypeEntryCPtr basicReferencedTypeEntry(const TypeEntryCPtr &e)
+{
+ Q_ASSERT(e->isPrimitive());
+ return basicReferencedTypeEntry(std::static_pointer_cast<const PrimitiveTypeEntry>(e));
+}
+
+PrimitiveTypeEntryCPtr basicReferencedNonBuiltinTypeEntry(const PrimitiveTypeEntryCPtr &e)
+{
+ auto result = e;
+ for (; result->referencedTypeEntry() ; result = result->referencedTypeEntry()) {
+ if (!result->isBuiltIn())
+ break;
+ }
+ return result;
+}
+
+bool PrimitiveTypeEntry::referencesType() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return d->m_referencedTypeEntry != nullptr;
+}
+
+bool PrimitiveTypeEntry::preferredTargetLangType() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return d->m_preferredTargetLangType;
+}
+
+void PrimitiveTypeEntry::setPreferredTargetLangType(bool b)
+{
+ S_D(PrimitiveTypeEntry);
+ d->m_preferredTargetLangType = b;
+}
+
+bool PrimitiveTypeEntry::hasCustomConversion() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return bool(d->m_customConversion);
+}
+
+void PrimitiveTypeEntry::setCustomConversion(const CustomConversionPtr &customConversion)
+{
+ S_D(PrimitiveTypeEntry);
+ d->m_customConversion = customConversion;
+}
+
+CustomConversionPtr PrimitiveTypeEntry::customConversion() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return d->m_customConversion;
+}
+
+TypeEntry *PrimitiveTypeEntry::clone() const
+{
+ S_D(const PrimitiveTypeEntry);
+ return new PrimitiveTypeEntry(new PrimitiveTypeEntryPrivate(*d));
+}
+
+PrimitiveTypeEntry::PrimitiveTypeEntry(PrimitiveTypeEntryPrivate *d)
+ : TypeEntry(d)
+{
+}
+
+// ----------------- ConfigurableTypeEntry
+
+class ConfigurableTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ using TypeEntryPrivate::TypeEntryPrivate;
+
+ QString m_configCondition;
+};
+
+ConfigurableTypeEntry::ConfigurableTypeEntry(const QString &entryName, Type t,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new ConfigurableTypeEntryPrivate(entryName, t, vr, parent))
+{
+}
+
+ConfigurableTypeEntry::ConfigurableTypeEntry(ConfigurableTypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+TypeEntry *ConfigurableTypeEntry::clone() const
+{
+ S_D(const ConfigurableTypeEntry);
+ return new ConfigurableTypeEntry(new ConfigurableTypeEntryPrivate(*d));
+}
+
+QString ConfigurableTypeEntry::configCondition() const
+{
+ S_D(const ConfigurableTypeEntry);
+ return d->m_configCondition;
+}
+
+void ConfigurableTypeEntry::setConfigCondition(const QString &c)
+{
+ S_D(ConfigurableTypeEntry);
+ d->m_configCondition = c;
+ if (!d->m_configCondition.startsWith(u'#'))
+ d->m_configCondition.prepend(u"#if ");
+}
+
+bool ConfigurableTypeEntry::hasConfigCondition() const
+{
+ S_D(const ConfigurableTypeEntry);
+ return !d->m_configCondition.isEmpty();
+}
+
+// ----------------- EnumTypeEntry
+class EnumTypeEntryPrivate : public ConfigurableTypeEntryPrivate
+{
+public:
+ using ConfigurableTypeEntryPrivate::ConfigurableTypeEntryPrivate;
+
+ EnumValueTypeEntryCPtr m_nullValue;
+ QStringList m_rejectedEnums;
+ FlagsTypeEntryPtr m_flags;
+ QString m_cppType;
+ QString m_docFile;
+ TypeSystem::PythonEnumType m_pythonEnumType = TypeSystem::PythonEnumType::Unspecified;
+};
+
+EnumTypeEntry::EnumTypeEntry(const QString &entryName,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ConfigurableTypeEntry(new EnumTypeEntryPrivate(entryName, EnumType, vr, parent))
+{
+}
+
+TypeSystem::PythonEnumType EnumTypeEntry::pythonEnumType() const
+{
+ S_D(const EnumTypeEntry);
+ return d->m_pythonEnumType;
+}
+
+void EnumTypeEntry::setPythonEnumType(TypeSystem::PythonEnumType t)
+{
+ S_D(EnumTypeEntry);
+ d->m_pythonEnumType = t;
+}
+
+QString EnumTypeEntry::targetLangQualifier() const
+{
+ const QString q = qualifier();
+ if (!q.isEmpty()) {
+ if (auto te = TypeDatabase::instance()->findType(q))
+ return te->targetLangName();
+ }
+ return q;
+}
+
+QString EnumTypeEntry::qualifier() const
+{
+ auto parentEntry = parent();
+ return parentEntry && parentEntry->type() != TypeEntry::TypeSystemType ?
+ parentEntry->name() : QString();
+}
+
+EnumValueTypeEntryCPtr EnumTypeEntry::nullValue() const
+{
+ S_D(const EnumTypeEntry);
+ return d->m_nullValue;
+}
+
+void EnumTypeEntry::setNullValue(const EnumValueTypeEntryCPtr &n)
+{
+ S_D(EnumTypeEntry);
+ d->m_nullValue = n;
+}
+
+void EnumTypeEntry::setFlags(const FlagsTypeEntryPtr &flags)
+{
+ S_D(EnumTypeEntry);
+ d->m_flags = flags;
+}
+
+FlagsTypeEntryPtr EnumTypeEntry::flags() const
+{
+ S_D(const EnumTypeEntry);
+ return d->m_flags;
+}
+
+QString EnumTypeEntry::cppType() const
+{
+ S_D(const EnumTypeEntry);
+ return d->m_cppType;
+}
+
+void EnumTypeEntry::setCppType(const QString &t)
+{
+ S_D(EnumTypeEntry);
+ d->m_cppType = t;
+}
+
+bool EnumTypeEntry::isEnumValueRejected(const QString &name) const
+{
+ S_D(const EnumTypeEntry);
+ return d->m_rejectedEnums.contains(name);
+}
+
+void EnumTypeEntry::addEnumValueRejection(const QString &name)
+{
+ S_D(EnumTypeEntry);
+ d->m_rejectedEnums << name;
+}
+
+QStringList EnumTypeEntry::enumValueRejections() const
+{
+ S_D(const EnumTypeEntry);
+ return d->m_rejectedEnums;
+}
+
+QString EnumTypeEntry::docFile() const
+{
+ S_D(const EnumTypeEntry);
+ return d->m_docFile;
+}
+
+void EnumTypeEntry::setDocFile(const QString &df)
+{
+ S_D(EnumTypeEntry);
+ d->m_docFile = df;
+}
+
+TypeEntry *EnumTypeEntry::clone() const
+{
+ S_D(const EnumTypeEntry);
+ return new EnumTypeEntry(new EnumTypeEntryPrivate(*d));
+}
+
+EnumTypeEntry::EnumTypeEntry(EnumTypeEntryPrivate *d) :
+ ConfigurableTypeEntry(d)
+{
+}
+
+// ----------------- EnumValueTypeEntryPrivate
+class EnumValueTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ EnumValueTypeEntryPrivate(const QString &name, const QString &value,
+ const EnumTypeEntryCPtr &enclosingEnum,
+ bool isScopedEnum,
+ const QVersionNumber &vr) :
+ TypeEntryPrivate(name, TypeEntry::EnumValue, vr,
+ isScopedEnum ? enclosingEnum : enclosingEnum->parent()),
+ m_value(value),
+ m_enclosingEnum(enclosingEnum)
+ {
+ }
+
+ QString m_value;
+ EnumTypeEntryCPtr m_enclosingEnum;
+};
+
+EnumValueTypeEntry::EnumValueTypeEntry(const QString &name, const QString &value,
+ const EnumTypeEntryCPtr &enclosingEnum,
+ bool isScopedEnum,
+ const QVersionNumber &vr) :
+ TypeEntry(new EnumValueTypeEntryPrivate(name, value, enclosingEnum, isScopedEnum, vr))
+{
+}
+
+QString EnumValueTypeEntry::value() const
+{
+ S_D(const EnumValueTypeEntry);
+ return d->m_value;
+}
+
+EnumTypeEntryCPtr EnumValueTypeEntry::enclosingEnum() const
+{
+ S_D(const EnumValueTypeEntry);
+ return d->m_enclosingEnum;
+}
+
+TypeEntry *EnumValueTypeEntry::clone() const
+{
+ S_D(const EnumValueTypeEntry);
+ return new EnumValueTypeEntry(new EnumValueTypeEntryPrivate(*d));
+}
+
+EnumValueTypeEntry::EnumValueTypeEntry(EnumValueTypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+// ----------------- FlagsTypeEntry
+class FlagsTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ using TypeEntryPrivate::TypeEntryPrivate;
+
+ QString m_originalName;
+ QString m_flagsName;
+ EnumTypeEntryPtr m_enum;
+};
+
+FlagsTypeEntry::FlagsTypeEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new FlagsTypeEntryPrivate(entryName, FlagsType, vr, parent))
+{
+}
+
+QString FlagsTypeEntry::buildTargetLangName() const
+{
+ S_D(const FlagsTypeEntry);
+ QString on = d->m_originalName;
+ on.replace(u"::"_s, u"."_s);
+ return on;
+}
+
+FlagsTypeEntry::FlagsTypeEntry(FlagsTypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+QString FlagsTypeEntry::originalName() const
+{
+ S_D(const FlagsTypeEntry);
+ return d->m_originalName;
+}
+
+void FlagsTypeEntry::setOriginalName(const QString &s)
+{
+ S_D(FlagsTypeEntry);
+ d->m_originalName = s;
+}
+
+QString FlagsTypeEntry::flagsName() const
+{
+ S_D(const FlagsTypeEntry);
+ return d->m_flagsName;
+}
+
+void FlagsTypeEntry::setFlagsName(const QString &name)
+{
+ S_D(FlagsTypeEntry);
+ d->m_flagsName = name;
+}
+
+EnumTypeEntryPtr FlagsTypeEntry::originator() const
+{
+ S_D(const FlagsTypeEntry);
+ return d->m_enum;
+}
+
+void FlagsTypeEntry::setOriginator(const EnumTypeEntryPtr &e)
+{
+ S_D(FlagsTypeEntry);
+ d->m_enum = e;
+}
+
+TypeEntry *FlagsTypeEntry::clone() const
+{
+ S_D(const FlagsTypeEntry);
+ return new FlagsTypeEntry(new FlagsTypeEntryPrivate(*d));
+}
+
+// ----------------- ConstantValueTypeEntry
+ConstantValueTypeEntry::ConstantValueTypeEntry(const QString& name,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(name, ConstantValueType, QVersionNumber(0, 0), parent)
+{
+}
+
+ConstantValueTypeEntry::ConstantValueTypeEntry(TypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+// ----------------- ComplexTypeEntry
+class ComplexTypeEntryPrivate : public ConfigurableTypeEntryPrivate
+{
+public:
+ ComplexTypeEntryPrivate(const QString &entryName, TypeEntry::Type t,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ConfigurableTypeEntryPrivate(entryName, t, vr, parent),
+ m_qualifiedCppName(buildName(entryName, parent)),
+ m_polymorphicBase(false),
+ m_genericClass(false),
+ m_deleteInMainThread(false)
+ {
+ }
+
+ AddedFunctionList m_addedFunctions;
+ FunctionModificationList m_functionMods;
+ CodeSnipList m_codeSnips;
+ DocModificationList m_docModifications;
+ DocModificationList m_functionDocModifications;
+ IncludeList m_argumentIncludes;
+ QSet<QString> m_generateFunctions;
+ FieldModificationList m_fieldMods;
+ QList<TypeSystemProperty> m_properties;
+ QList<TypeSystemPyMethodDefEntry> m_PyMethodDefEntrys;
+ 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_polymorphicNameFunction;
+ QString m_targetType;
+ ComplexTypeEntry::TypeFlags m_typeFlags;
+ ComplexTypeEntry::CopyableFlag m_copyableFlag = ComplexTypeEntry::Unknown;
+ QString m_hashFunction;
+
+ ComplexTypeEntryCPtr m_baseContainerType;
+ // For class functions
+ TypeSystem::ExceptionHandling m_exceptionHandling = TypeSystem::ExceptionHandling::Unspecified;
+ TypeSystem::AllowThread m_allowThread = TypeSystem::AllowThread::Unspecified;
+ TypeSystem::SnakeCase m_snakeCase = TypeSystem::SnakeCase::Unspecified;
+ TypeSystem::BoolCast m_operatorBoolMode = TypeSystem::BoolCast::Unspecified;
+ TypeSystem::BoolCast m_isNullMode = TypeSystem::BoolCast::Unspecified;
+ TypeSystem::QtMetaTypeRegistration m_qtMetaTypeRegistration =
+ TypeSystem::QtMetaTypeRegistration::Unspecified;
+ // Determined by AbstractMetaBuilder from the code model.
+ bool m_isValueTypeWithCopyConstructorOnly = false;
+};
+
+ComplexTypeEntry::ComplexTypeEntry(const QString &entryName, TypeEntry::Type t,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ConfigurableTypeEntry(new ComplexTypeEntryPrivate(entryName, t, vr, parent))
+{
+}
+
+bool ComplexTypeEntry::isComplex() const
+{
+ return true;
+}
+
+void ComplexTypeEntry::setTypeFlags(TypeFlags flags)
+{
+ S_D(ComplexTypeEntry);
+ d->m_typeFlags = flags;
+}
+
+TypeSystem::BoolCast ComplexTypeEntry::operatorBoolMode() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_operatorBoolMode;
+}
+
+void ComplexTypeEntry::setOperatorBoolMode(TypeSystem::BoolCast b)
+{
+ S_D(ComplexTypeEntry);
+ d->m_operatorBoolMode = b;
+}
+
+TypeSystem::BoolCast ComplexTypeEntry::isNullMode() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_isNullMode;
+}
+
+void ComplexTypeEntry::setIsNullMode(TypeSystem::BoolCast b)
+{
+ S_D(ComplexTypeEntry);
+ d->m_isNullMode = b;
+}
+
+ComplexTypeEntry::TypeFlags ComplexTypeEntry::typeFlags() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_typeFlags;
+}
+
+FunctionModificationList ComplexTypeEntry::functionModifications() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_functionMods;
+}
+
+void ComplexTypeEntry::setFunctionModifications(const FunctionModificationList &functionModifications)
+{
+ S_D(ComplexTypeEntry);
+ d->m_functionMods = functionModifications;
+}
+
+void ComplexTypeEntry::addFunctionModification(const FunctionModification &functionModification)
+{
+ S_D(ComplexTypeEntry);
+ d->m_functionMods << functionModification;
+}
+
+FunctionModificationList
+ ComplexTypeEntry::functionModifications(const QStringList &signatures) const
+{
+ S_D(const ComplexTypeEntry);
+ FunctionModificationList lst;
+ for (const auto &mod : std::as_const(d->m_functionMods)) {
+ if (mod.matches(signatures))
+ lst << mod;
+ }
+ return lst;
+}
+
+const CodeSnipList &ComplexTypeEntry::codeSnips() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_codeSnips;
+}
+
+CodeSnipList &ComplexTypeEntry::codeSnips()
+{
+ S_D(ComplexTypeEntry);
+ return d->m_codeSnips;
+}
+
+void ComplexTypeEntry::setCodeSnips(const CodeSnipList &codeSnips)
+{
+ S_D(ComplexTypeEntry);
+ d->m_codeSnips = codeSnips;
+}
+
+void ComplexTypeEntry::addCodeSnip(const CodeSnip &codeSnip)
+{
+ S_D(ComplexTypeEntry);
+ d->m_codeSnips << codeSnip;
+}
+
+void ComplexTypeEntry::setDocModification(const DocModificationList &docMods)
+{
+ S_D(ComplexTypeEntry);
+ for (const auto &m : docMods) {
+ if (m.signature().isEmpty())
+ d->m_docModifications << m;
+ else
+ d->m_functionDocModifications << m;
+ }
+}
+
+DocModificationList ComplexTypeEntry::docModifications() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_docModifications;
+}
+
+DocModificationList ComplexTypeEntry::functionDocModifications() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_functionDocModifications;
+}
+
+const IncludeList &ComplexTypeEntry::argumentIncludes() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_argumentIncludes;
+}
+
+void ComplexTypeEntry::addArgumentInclude(const Include &newInclude)
+{
+ S_D(ComplexTypeEntry);
+ IncludeGroup::appendInclude(newInclude, &d->m_argumentIncludes);
+}
+
+AddedFunctionList ComplexTypeEntry::addedFunctions() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_addedFunctions;
+}
+
+void ComplexTypeEntry::setAddedFunctions(const AddedFunctionList &addedFunctions)
+{
+ S_D(ComplexTypeEntry);
+ d->m_addedFunctions = addedFunctions;
+}
+
+void ComplexTypeEntry::addNewFunction(const AddedFunctionPtr &addedFunction)
+{
+ S_D(ComplexTypeEntry);
+ d->m_addedFunctions << addedFunction;
+}
+
+const QList<TypeSystemPyMethodDefEntry> &ComplexTypeEntry::addedPyMethodDefEntrys() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_PyMethodDefEntrys;
+}
+
+void ComplexTypeEntry::addPyMethodDef(const TypeSystemPyMethodDefEntry &p)
+{
+ S_D(ComplexTypeEntry);
+ d->m_PyMethodDefEntrys.append(p);
+}
+
+const QSet<QString> &ComplexTypeEntry::generateFunctions() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_generateFunctions;
+}
+
+void ComplexTypeEntry::setGenerateFunctions(const QSet<QString> &f)
+{
+ S_D(ComplexTypeEntry);
+ d->m_generateFunctions = f;
+}
+
+void ComplexTypeEntry::setFieldModifications(const FieldModificationList &mods)
+{
+ S_D(ComplexTypeEntry);
+ d->m_fieldMods = mods;
+}
+
+FieldModificationList ComplexTypeEntry::fieldModifications() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_fieldMods;
+}
+
+const QList<TypeSystemProperty> &ComplexTypeEntry::properties() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_properties;
+}
+
+void ComplexTypeEntry::addProperty(const TypeSystemProperty &p)
+{
+ S_D(ComplexTypeEntry);
+ d->m_properties.append(p);
+}
+
+QString ComplexTypeEntry::defaultSuperclass() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_defaultSuperclass;
+}
+
+void ComplexTypeEntry::setDefaultSuperclass(const QString &sc)
+{
+ S_D(ComplexTypeEntry);
+ d->m_defaultSuperclass = sc;
+}
+
+QString ComplexTypeEntry::qualifiedCppName() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_qualifiedCppName;
+}
+
+void ComplexTypeEntry::setIsPolymorphicBase(bool on)
+{
+ S_D(ComplexTypeEntry);
+ d->m_polymorphicBase = on;
+}
+
+bool ComplexTypeEntry::isPolymorphicBase() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_polymorphicBase;
+}
+
+void ComplexTypeEntry::setPolymorphicIdValue(const QString &value)
+{
+ S_D(ComplexTypeEntry);
+ d->m_polymorphicIdValue = value;
+}
+
+QString ComplexTypeEntry::polymorphicIdValue() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_polymorphicIdValue;
+}
+
+QString ComplexTypeEntry::polymorphicNameFunction() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_polymorphicNameFunction;
+}
+
+void ComplexTypeEntry::setPolymorphicNameFunction(const QString &n)
+{
+ S_D(ComplexTypeEntry);
+ d->m_polymorphicNameFunction = n;
+}
+
+QString ComplexTypeEntry::targetType() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_targetType;
+}
+
+void ComplexTypeEntry::setTargetType(const QString &code)
+{
+ S_D(ComplexTypeEntry);
+ d->m_targetType = code;
+}
+
+bool ComplexTypeEntry::isGenericClass() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_genericClass;
+}
+
+void ComplexTypeEntry::setGenericClass(bool isGeneric)
+{
+ S_D(ComplexTypeEntry);
+ d->m_genericClass = isGeneric;
+}
+
+bool ComplexTypeEntry::deleteInMainThread() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_deleteInMainThread;
+}
+
+void ComplexTypeEntry::setDeleteInMainThread(bool dmt)
+{
+ S_D(ComplexTypeEntry);
+ d->m_deleteInMainThread = dmt;
+}
+
+ComplexTypeEntry::CopyableFlag ComplexTypeEntry::copyable() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_copyableFlag;
+}
+
+void ComplexTypeEntry::setCopyable(ComplexTypeEntry::CopyableFlag flag)
+{
+ S_D(ComplexTypeEntry);
+ d->m_copyableFlag = flag;
+}
+
+TypeSystem::QtMetaTypeRegistration ComplexTypeEntry::qtMetaTypeRegistration() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_qtMetaTypeRegistration;
+}
+
+void ComplexTypeEntry::setQtMetaTypeRegistration(TypeSystem::QtMetaTypeRegistration r)
+{
+ S_D(ComplexTypeEntry);
+ d->m_qtMetaTypeRegistration = r;
+}
+
+QString ComplexTypeEntry::hashFunction() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_hashFunction;
+}
+
+void ComplexTypeEntry::setHashFunction(const QString &hashFunction)
+{
+ S_D(ComplexTypeEntry);
+ d->m_hashFunction = hashFunction;
+}
+
+void ComplexTypeEntry::setBaseContainerType(const ComplexTypeEntryCPtr &baseContainer)
+{
+ S_D(ComplexTypeEntry);
+ d->m_baseContainerType = baseContainer;
+}
+
+ComplexTypeEntryCPtr ComplexTypeEntry::baseContainerType() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_baseContainerType;
+}
+
+TypeSystem::ExceptionHandling ComplexTypeEntry::exceptionHandling() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_exceptionHandling;
+}
+
+void ComplexTypeEntry::setExceptionHandling(TypeSystem::ExceptionHandling e)
+{
+ S_D(ComplexTypeEntry);
+ d->m_exceptionHandling = e;
+}
+
+TypeSystem::AllowThread ComplexTypeEntry::allowThread() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_allowThread;
+}
+
+void ComplexTypeEntry::setAllowThread(TypeSystem::AllowThread allowThread)
+{
+ S_D(ComplexTypeEntry);
+ d->m_allowThread = allowThread;
+}
+
+void ComplexTypeEntry::setDefaultConstructor(const QString& defaultConstructor)
+{
+ S_D(ComplexTypeEntry);
+ d->m_defaultConstructor = defaultConstructor;
+}
+
+QString ComplexTypeEntry::defaultConstructor() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_defaultConstructor;
+}
+
+bool ComplexTypeEntry::hasDefaultConstructor() const
+{
+ S_D(const ComplexTypeEntry);
+ return !d->m_defaultConstructor.isEmpty();
+}
+
+TypeSystem::SnakeCase ComplexTypeEntry::snakeCase() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_snakeCase;
+}
+
+void ComplexTypeEntry::setSnakeCase(TypeSystem::SnakeCase sc)
+{
+ S_D(ComplexTypeEntry);
+ d->m_snakeCase = sc;
+}
+
+bool ComplexTypeEntry::isValueTypeWithCopyConstructorOnly() const
+{
+ S_D(const ComplexTypeEntry);
+ return d->m_isValueTypeWithCopyConstructorOnly;
+}
+
+void ComplexTypeEntry::setValueTypeWithCopyConstructorOnly(bool v)
+{
+ S_D(ComplexTypeEntry);
+ d->m_isValueTypeWithCopyConstructorOnly = v;
+}
+
+// FIXME PYSIDE 7: Remove this and make "true" the default
+static bool parentManagementEnabled = false;
+
+bool ComplexTypeEntry::isParentManagementEnabled()
+{
+ return parentManagementEnabled;
+}
+
+void ComplexTypeEntry::setParentManagementEnabled(bool e)
+{
+ parentManagementEnabled = e;
+}
+
+TypeEntry *ComplexTypeEntry::clone() const
+{
+ S_D(const ComplexTypeEntry);
+ return new ComplexTypeEntry(new ComplexTypeEntryPrivate(*d));
+}
+
+// Take over parameters relevant for typedefs
+void ComplexTypeEntry::useAsTypedef(const ComplexTypeEntryCPtr &source)
+{
+ S_D(ComplexTypeEntry);
+ TypeEntry::useAsTypedef(source);
+ d->m_qualifiedCppName = source->qualifiedCppName();
+ d->m_targetType = source->targetType();
+ d->m_typeFlags.setFlag(ComplexTypeEntry::Typedef);
+}
+
+ComplexTypeEntry::ComplexTypeEntry(ComplexTypeEntryPrivate *d) :
+ ConfigurableTypeEntry(d)
+{
+}
+
+TypeEntry *ConstantValueTypeEntry::clone() const
+{
+ return new ConstantValueTypeEntry(new TypeEntryPrivate(*d_func()));
+}
+
+
+// ----------------- TypedefEntry
+/* A typedef entry allows for specifying template specializations in the
+ * typesystem XML file. */
+class TypedefEntryPrivate : public ComplexTypeEntryPrivate
+{
+public:
+ TypedefEntryPrivate(const QString &entryName,
+ const QString &sourceType,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ComplexTypeEntryPrivate(entryName, TypeEntry::TypedefType,
+ vr, parent),
+ m_sourceType(sourceType)
+ {
+ }
+
+ QString m_sourceType;
+ ComplexTypeEntryCPtr m_source;
+ ComplexTypeEntryPtr m_target;
+};
+
+TypedefEntry::TypedefEntry(const QString &entryName, const QString &sourceType,
+ const QVersionNumber &vr, const TypeEntryCPtr &parent) :
+ ComplexTypeEntry(new TypedefEntryPrivate(entryName, sourceType, vr, parent))
+{
+}
+
+QString TypedefEntry::sourceType() const
+{
+ S_D(const TypedefEntry);
+ return d->m_sourceType;
+}
+
+void TypedefEntry::setSourceType(const QString &s)
+{
+ S_D(TypedefEntry);
+ d->m_sourceType =s;
+}
+
+TypeEntry *TypedefEntry::clone() const
+{
+ S_D(const TypedefEntry);
+ return new TypedefEntry(new TypedefEntryPrivate(*d));
+}
+
+ComplexTypeEntryCPtr TypedefEntry::source() const
+{
+ S_D(const TypedefEntry);
+ return d->m_source;
+}
+
+void TypedefEntry::setSource(const ComplexTypeEntryCPtr &source)
+{
+ S_D(TypedefEntry);
+ d->m_source = source;
+}
+
+ComplexTypeEntryPtr TypedefEntry::target() const
+{
+ S_D(const TypedefEntry);
+ return d->m_target;
+}
+
+void TypedefEntry::setTarget(ComplexTypeEntryPtr target)
+{
+ S_D(TypedefEntry);
+ d->m_target = target;
+}
+
+TypedefEntry::TypedefEntry(TypedefEntryPrivate *d) :
+ ComplexTypeEntry(d)
+{
+}
+
+// ----------------- ContainerTypeEntry
+class ContainerTypeEntryPrivate : public ComplexTypeEntryPrivate
+{
+public:
+ ContainerTypeEntryPrivate(const QString &entryName,
+ ContainerTypeEntry::ContainerKind containerKind,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ComplexTypeEntryPrivate(entryName, TypeEntry::ContainerType, vr, parent),
+ m_containerKind(containerKind)
+ {
+ }
+
+ OpaqueContainers::const_iterator findOpaqueContainer(const QStringList &instantiations) const
+ {
+ return std::find_if(m_opaqueContainers.cbegin(), m_opaqueContainers.cend(),
+ [&instantiations](const OpaqueContainer &r) {
+ return r.instantiations == instantiations;
+ });
+ }
+
+ OpaqueContainers m_opaqueContainers;
+ CustomConversionPtr m_customConversion;
+ ContainerTypeEntry::ContainerKind m_containerKind;
+};
+
+QString OpaqueContainer::templateParameters() const
+{
+ QString result;
+ result += u'<';
+ for (qsizetype i = 0, size = instantiations.size(); i < size; ++i) {
+ if (i)
+ result += u',';
+ result += instantiations.at(i);
+ }
+ result += u'>';
+ return result;
+}
+
+ContainerTypeEntry::ContainerTypeEntry(const QString &entryName, ContainerKind containerKind,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ComplexTypeEntry(new ContainerTypeEntryPrivate(entryName, containerKind, vr, parent))
+{
+ setCodeGeneration(GenerateForSubclass);
+}
+
+ContainerTypeEntry::ContainerKind ContainerTypeEntry::containerKind() const
+{
+ S_D(const ContainerTypeEntry);
+ return d->m_containerKind;
+}
+
+qsizetype ContainerTypeEntry::templateParameterCount() const
+{
+ S_D(const ContainerTypeEntry);
+ qsizetype result = 1;
+ switch (d->m_containerKind) {
+ case MapContainer:
+ case MultiMapContainer:
+ case PairContainer:
+ case SpanContainer:
+ result = 2;
+ break;
+ case ListContainer:
+ case SetContainer:
+ break;
+ }
+ return result;
+}
+
+const OpaqueContainers &ContainerTypeEntry::opaqueContainers() const
+{
+ S_D(const ContainerTypeEntry);
+ return d->m_opaqueContainers;
+}
+
+void ContainerTypeEntry::appendOpaqueContainers(const OpaqueContainers &l)
+{
+ S_D(ContainerTypeEntry);
+ d->m_opaqueContainers.append(l);
+}
+
+bool ContainerTypeEntry::generateOpaqueContainer(const QStringList &instantiations) const
+{
+ S_D(const ContainerTypeEntry);
+ return d->findOpaqueContainer(instantiations) != d->m_opaqueContainers.cend();
+}
+
+QString ContainerTypeEntry::opaqueContainerName(const QStringList &instantiations) const
+{
+ S_D(const ContainerTypeEntry);
+ const auto it = d->findOpaqueContainer(instantiations);
+ return it != d->m_opaqueContainers.cend() ? it->name : QString{};
+}
+
+bool ContainerTypeEntry::hasCustomConversion() const
+{
+ S_D(const ContainerTypeEntry);
+ return bool(d->m_customConversion);
+}
+
+void ContainerTypeEntry::setCustomConversion(const CustomConversionPtr &customConversion)
+{
+ S_D(ContainerTypeEntry);
+ d->m_customConversion = customConversion;
+}
+
+CustomConversionPtr ContainerTypeEntry::customConversion() const
+{
+ S_D(const ContainerTypeEntry);
+ return d->m_customConversion;
+}
+
+TypeEntry *ContainerTypeEntry::clone() const
+{
+ S_D(const ContainerTypeEntry);
+ return new ContainerTypeEntry(new ContainerTypeEntryPrivate(*d));
+}
+
+ContainerTypeEntry::ContainerTypeEntry(ContainerTypeEntryPrivate *d) :
+ ComplexTypeEntry(d)
+{
+}
+
+// ----------------- SmartPointerTypeEntry
+class SmartPointerTypeEntryPrivate : public ComplexTypeEntryPrivate
+{
+public:
+ SmartPointerTypeEntryPrivate(const QString &entryName,
+ const QString &getterName,
+ TypeSystem::SmartPointerType type,
+ const QString &refCountMethodName,
+ const QVersionNumber &vr, const TypeEntryCPtr &parent) :
+ ComplexTypeEntryPrivate(entryName, TypeEntry::SmartPointerType, vr, parent),
+ m_getterName(getterName),
+ m_refCountMethodName(refCountMethodName),
+ m_smartPointerType(type)
+ {
+ }
+
+ qsizetype instantiationIndex(const TypeEntryCPtr &t) const;
+
+ QString m_getterName;
+ QString m_refCountMethodName;
+ QString m_valueCheckMethod;
+ QString m_nullCheckMethod;
+ QString m_resetMethod;
+ SmartPointerTypeEntry::Instantiations m_instantiations;
+ TypeSystem::SmartPointerType m_smartPointerType;
+};
+
+qsizetype SmartPointerTypeEntryPrivate::instantiationIndex(const TypeEntryCPtr &t) const
+{
+ for (qsizetype i = 0, size = m_instantiations.size(); i < size; ++i) {
+ if (m_instantiations.at(i).typeEntry == t)
+ return i;
+ }
+ return -1;
+}
+
+SmartPointerTypeEntry::SmartPointerTypeEntry(const QString &entryName,
+ const QString &getterName,
+ TypeSystem::SmartPointerType smartPointerType,
+ const QString &refCountMethodName,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ComplexTypeEntry(new SmartPointerTypeEntryPrivate(entryName, getterName, smartPointerType,
+ refCountMethodName, vr, parent))
+{
+}
+
+TypeSystem::SmartPointerType SmartPointerTypeEntry::smartPointerType() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return d->m_smartPointerType;
+}
+
+QString SmartPointerTypeEntry::getter() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return d->m_getterName;
+}
+
+QString SmartPointerTypeEntry::refCountMethodName() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return d->m_refCountMethodName;
+}
+
+QString SmartPointerTypeEntry::valueCheckMethod() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return d->m_valueCheckMethod;
+}
+
+void SmartPointerTypeEntry::setValueCheckMethod(const QString &m)
+{
+ S_D(SmartPointerTypeEntry);
+ d->m_valueCheckMethod = m;
+}
+
+QString SmartPointerTypeEntry::nullCheckMethod() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return d->m_nullCheckMethod;
+}
+
+void SmartPointerTypeEntry::setNullCheckMethod(const QString &f)
+{
+ S_D(SmartPointerTypeEntry);
+ d->m_nullCheckMethod = f;
+}
+
+QString SmartPointerTypeEntry::resetMethod() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return d->m_resetMethod;
+}
+
+void SmartPointerTypeEntry::setResetMethod(const QString &f)
+{
+ S_D(SmartPointerTypeEntry);
+ d->m_resetMethod = f;
+}
+
+TypeEntry *SmartPointerTypeEntry::clone() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return new SmartPointerTypeEntry(new SmartPointerTypeEntryPrivate(*d));
+}
+
+const SmartPointerTypeEntry::Instantiations &SmartPointerTypeEntry::instantiations() const
+{
+ S_D(const SmartPointerTypeEntry);
+ return d->m_instantiations;
+}
+
+void SmartPointerTypeEntry::setInstantiations(const Instantiations &i)
+{
+ S_D(SmartPointerTypeEntry);
+ d->m_instantiations = i;
+}
+
+SmartPointerTypeEntry::SmartPointerTypeEntry(SmartPointerTypeEntryPrivate *d) :
+ ComplexTypeEntry(d)
+{
+}
+
+bool SmartPointerTypeEntry::matchesInstantiation(const TypeEntryCPtr &e) const
+{
+ S_D(const SmartPointerTypeEntry);
+ // No instantiations specified, or match
+ return d->m_instantiations.isEmpty() || d->instantiationIndex(e) != -1;
+}
+
+static QString fixSmartPointerName(QString name)
+{
+ name.replace(u"::"_s, u"_"_s);
+ name.replace(u'<', u'_');
+ name.remove(u'>');
+ name.remove(u' ');
+ return name;
+}
+
+QString SmartPointerTypeEntry::getTargetName(const AbstractMetaType &metaType) const
+{
+ S_D(const SmartPointerTypeEntry);
+ auto instantiatedTe = metaType.instantiations().constFirst().typeEntry();
+ const auto index = d->instantiationIndex(instantiatedTe);
+ if (index != -1 && !d->m_instantiations.at(index).name.isEmpty())
+ return d->m_instantiations.at(index).name;
+
+ QString name = metaType.cppSignature();
+ const auto templatePos = name.indexOf(u'<');
+ if (templatePos != -1) { // "std::shared_ptr<A::B>" -> "shared_ptr<A::B>"
+ const auto colonPos = name.lastIndexOf(u"::"_s, templatePos);
+ if (colonPos != -1)
+ name.remove(0, colonPos + 2);
+ }
+ return fixSmartPointerName(name);
+}
+
+// ----------------- NamespaceTypeEntry
+class NamespaceTypeEntryPrivate : public ComplexTypeEntryPrivate
+{
+public:
+ using ComplexTypeEntryPrivate::ComplexTypeEntryPrivate;
+
+ QRegularExpression m_filePattern;
+ NamespaceTypeEntryCPtr m_extends;
+ TypeSystem::Visibility m_visibility = TypeSystem::Visibility::Auto;
+ bool m_hasPattern = false;
+ bool m_inlineNamespace = false;
+ bool m_generateUsing = true; // Whether to generate "using namespace" into wrapper
+};
+
+NamespaceTypeEntry::NamespaceTypeEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ComplexTypeEntry(new NamespaceTypeEntryPrivate(entryName, NamespaceType, vr, parent))
+{
+}
+
+TypeEntry *NamespaceTypeEntry::clone() const
+{
+ S_D(const NamespaceTypeEntry);
+ return new NamespaceTypeEntry(new NamespaceTypeEntryPrivate(*d));
+}
+
+NamespaceTypeEntryCPtr NamespaceTypeEntry::extends() const
+{
+ S_D(const NamespaceTypeEntry);
+ return d->m_extends;
+}
+
+void NamespaceTypeEntry::setExtends(const NamespaceTypeEntryCPtr &e)
+{
+ S_D(NamespaceTypeEntry);
+ d->m_extends = e;
+}
+
+const QRegularExpression &NamespaceTypeEntry::filePattern() const
+{
+ S_D(const NamespaceTypeEntry);
+ return d->m_filePattern;
+}
+
+void NamespaceTypeEntry::setFilePattern(const QRegularExpression &r)
+{
+ S_D(NamespaceTypeEntry);
+ d->m_filePattern = r;
+ d->m_hasPattern = !d->m_filePattern.pattern().isEmpty();
+ if (d->m_hasPattern)
+ d->m_filePattern.optimize();
+}
+
+bool NamespaceTypeEntry::hasPattern() const
+{
+ S_D(const NamespaceTypeEntry);
+ return d->m_hasPattern;
+}
+
+NamespaceTypeEntry::NamespaceTypeEntry(NamespaceTypeEntryPrivate *d) :
+ ComplexTypeEntry(d)
+{
+}
+
+bool NamespaceTypeEntry::matchesFile(const QString &needle) const
+{
+ S_D(const NamespaceTypeEntry);
+ return d->m_filePattern.match(needle).hasMatch();
+}
+
+bool NamespaceTypeEntry::isVisible() const
+{
+ S_D(const NamespaceTypeEntry);
+ return d->m_visibility == TypeSystem::Visibility::Visible
+ || (d->m_visibility == TypeSystem::Visibility::Auto && !d->m_inlineNamespace);
+}
+
+void NamespaceTypeEntry::setVisibility(TypeSystem::Visibility v)
+{
+ S_D(NamespaceTypeEntry);
+ d->m_visibility = v;
+}
+
+bool NamespaceTypeEntry::isInlineNamespace() const
+{
+ S_D(const NamespaceTypeEntry);
+ return d->m_inlineNamespace;
+}
+
+void NamespaceTypeEntry::setInlineNamespace(bool i)
+{
+ S_D(NamespaceTypeEntry);
+ d->m_inlineNamespace = i;
+}
+
+bool NamespaceTypeEntry::isVisibleScope(const TypeEntryCPtr &e)
+{
+ return isVisibleScope(e.get());
+}
+
+bool NamespaceTypeEntry::isVisibleScope(const TypeEntry *e)
+{
+ return e->type() != TypeEntry::NamespaceType
+ || static_cast<const NamespaceTypeEntry *>(e)->isVisible();
+}
+
+bool NamespaceTypeEntry::generateUsing() const
+{
+ S_D(const NamespaceTypeEntry);
+ return d->m_generateUsing;
+}
+
+void NamespaceTypeEntry::setGenerateUsing(bool generateUsing)
+{
+ S_D(NamespaceTypeEntry);
+ d->m_generateUsing = generateUsing;
+}
+
+// ----------------- ValueTypeEntry
+
+class ValueTypeEntryPrivate : public ComplexTypeEntryPrivate
+{
+public:
+ using ComplexTypeEntryPrivate::ComplexTypeEntryPrivate;
+
+ QString m_targetConversionRule;
+ CustomConversionPtr m_customConversion;
+};
+
+ValueTypeEntry::ValueTypeEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ComplexTypeEntry(new ValueTypeEntryPrivate(entryName, BasicValueType, vr, parent))
+{
+}
+
+bool ValueTypeEntry::hasCustomConversion() const
+{
+ S_D(const ValueTypeEntry);
+ return bool(d->m_customConversion);
+}
+
+void ValueTypeEntry::setCustomConversion(const CustomConversionPtr &customConversion)
+{
+ S_D(ValueTypeEntry);
+ d->m_customConversion = customConversion;
+}
+
+CustomConversionPtr ValueTypeEntry::customConversion() const
+{
+ S_D(const ValueTypeEntry);
+ return d->m_customConversion;
+}
+
+void ValueTypeEntry::setTargetConversionRule(const QString &conversionRule)
+{
+ S_D(ValueTypeEntry);
+ d->m_targetConversionRule = conversionRule;
+}
+
+QString ValueTypeEntry::targetConversionRule() const
+{
+ S_D(const ValueTypeEntry);
+ return d->m_targetConversionRule;
+}
+
+bool ValueTypeEntry::hasTargetConversionRule() const
+{
+ S_D(const ValueTypeEntry);
+ return !d->m_targetConversionRule.isEmpty();
+}
+
+bool ValueTypeEntry::isValue() const
+{
+ return true;
+}
+
+TypeEntry *ValueTypeEntry::clone() const
+{
+ S_D(const ValueTypeEntry);
+ return new ValueTypeEntry(new ValueTypeEntryPrivate(*d));
+}
+
+ValueTypeEntry::ValueTypeEntry(ComplexTypeEntryPrivate *d) :
+ ComplexTypeEntry(d)
+{
+}
+
+ValueTypeEntry::ValueTypeEntry(const QString &entryName, Type t, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ ComplexTypeEntry(entryName, t, vr, parent)
+{
+}
+
+// ----------------- FunctionTypeEntry
+class FunctionTypeEntryPrivate : public TypeEntryPrivate
+{
+public:
+ FunctionTypeEntryPrivate(const QString &entryName, const QString &signature,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntryPrivate(entryName, TypeEntry::FunctionType, vr, parent),
+ m_signatures(signature)
+ {
+ }
+
+ QStringList m_signatures;
+ QString m_docFile;
+};
+
+FunctionTypeEntry::FunctionTypeEntry(const QString &entryName, const QString &signature,
+ const QVersionNumber &vr,
+ const TypeEntryCPtr &parent) :
+ TypeEntry(new FunctionTypeEntryPrivate(entryName, signature, vr, parent))
+{
+}
+
+void FunctionTypeEntry::addSignature(const QString &signature)
+{
+ S_D(FunctionTypeEntry);
+ d->m_signatures << signature;
+}
+
+const QStringList &FunctionTypeEntry::signatures() const
+{
+ S_D(const FunctionTypeEntry);
+ return d->m_signatures;
+}
+
+bool FunctionTypeEntry::hasSignature(const QString &signature) const
+{
+ S_D(const FunctionTypeEntry);
+ return d->m_signatures.contains(signature);
+}
+
+QString FunctionTypeEntry::docFile() const
+{
+ S_D(const FunctionTypeEntry);
+ return d->m_docFile;
+}
+
+void FunctionTypeEntry::setDocFile(const QString &df)
+{
+ S_D(FunctionTypeEntry);
+ d->m_docFile = df;
+}
+
+TypeEntry *FunctionTypeEntry::clone() const
+{
+ S_D(const FunctionTypeEntry);
+ return new FunctionTypeEntry(new FunctionTypeEntryPrivate(*d));
+}
+
+FunctionTypeEntry::FunctionTypeEntry(FunctionTypeEntryPrivate *d) :
+ TypeEntry(d)
+{
+}
+
+// ----------------- ObjectTypeEntry
+ObjectTypeEntry::ObjectTypeEntry(const QString &entryName, const QVersionNumber &vr,
+ const TypeEntryCPtr &parent)
+ : ComplexTypeEntry(entryName, ObjectType, vr, parent)
+{
+}
+
+TypeEntry *ObjectTypeEntry::clone() const
+{
+ S_D(const ComplexTypeEntry);
+ return new ObjectTypeEntry(new ComplexTypeEntryPrivate(*d));
+}
+
+ObjectTypeEntry::ObjectTypeEntry(ComplexTypeEntryPrivate *d) :
+ ComplexTypeEntry(d)
+{
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+#define FORMAT_BOOL(name, var) \
+ if (var) \
+ debug << ", [" << name << ']';
+
+#define FORMAT_NONEMPTY_STRING(name, var) \
+ if (!var.isEmpty()) \
+ debug << ", " << name << "=\"" << var << '"';
+
+#define FORMAT_LIST_SIZE(name, var) \
+ if (!var.isEmpty()) \
+ debug << ", " << var.size() << ' ' << name;
+
+void TypeEntry::formatDebug(QDebug &debug) const
+{
+ const QString cppName = qualifiedCppName();
+ debug << '"' << m_d->m_name << '"';
+ if (m_d->m_name != cppName)
+ debug << "\", cppName=\"" << cppName << '"';
+ debug << ", type=" << m_d->m_type << ", codeGeneration="
+ << m_d->m_codeGeneration;
+ const QString &targetName = targetLangName();
+ if (m_d->m_name != targetName)
+ debug << ", target=\"" << targetLangName() << '"';
+ FORMAT_NONEMPTY_STRING("package", m_d->m_targetLangPackage)
+ FORMAT_BOOL("stream", m_d->m_stream)
+ FORMAT_BOOL("built-in", m_d->m_builtin)
+ if (m_d->m_viewOn)
+ debug << ", views=" << m_d->m_viewOn->name();
+ if (!m_d->m_version.isNull() && m_d->m_version > QVersionNumber(0, 0))
+ debug << ", version=" << m_d->m_version;
+ if (m_d->m_revision)
+ debug << ", revision=" << m_d->m_revision;
+ if (m_d->m_sbkIndex)
+ debug << ", sbkIndex=" << m_d->m_sbkIndex;
+ if (m_d->m_include.isValid())
+ debug << ", include=" << m_d->m_include;
+ if (m_d->m_private)
+ debug << ", [private]";
+ formatList(debug, "extraIncludes", m_d->m_extraIncludes, ", ");
+}
+
+void PrimitiveTypeEntry::formatDebug(QDebug &debug) const
+{
+ TypeEntry::formatDebug(debug);
+ if (auto e = referencedTypeEntry()) {
+ debug << ", references";
+ for (; e ; e = e->referencedTypeEntry())
+ debug << ":\"" << e->qualifiedCppName() <<'"';
+ }
+}
+
+void ComplexTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const ComplexTypeEntry);
+
+ TypeEntry::formatDebug(debug);
+ FORMAT_BOOL("polymorphicBase", d->m_polymorphicBase)
+ FORMAT_BOOL("genericClass", d->m_genericClass)
+ FORMAT_BOOL("deleteInMainThread", d->m_deleteInMainThread)
+ if (d->m_typeFlags != 0)
+ debug << ", typeFlags=" << d->m_typeFlags;
+ debug << ", copyableFlag=" << d->m_copyableFlag
+ << ", except=" << int(d->m_exceptionHandling)
+ << ", snakeCase=" << int(d->m_snakeCase);
+ FORMAT_NONEMPTY_STRING("defaultSuperclass", d->m_defaultSuperclass)
+ FORMAT_NONEMPTY_STRING("polymorphicIdValue", d->m_polymorphicIdValue)
+ FORMAT_NONEMPTY_STRING("targetType", d->m_targetType)
+ FORMAT_NONEMPTY_STRING("hash", d->m_hashFunction)
+ FORMAT_LIST_SIZE("addedFunctions", d->m_addedFunctions)
+ formatList(debug, "functionMods", d->m_functionMods, ", ");
+ FORMAT_LIST_SIZE("codeSnips", d->m_codeSnips)
+ FORMAT_LIST_SIZE("fieldMods", d->m_fieldMods)
+}
+
+void CustomTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const CustomTypeEntry);
+ TypeEntry::formatDebug(debug);
+ debug << ", checkFunction=" << d->m_checkFunction;
+}
+
+void PythonTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const PythonTypeEntry);
+
+ CustomTypeEntry::formatDebug(debug);
+ debug << ", type=" << int(d->m_cPythonType);
+}
+
+void FunctionTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const FunctionTypeEntry);
+
+ TypeEntry::formatDebug(debug);
+ debug << "signatures=" << d->m_signatures;
+}
+
+void TypedefEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const TypedefEntry);
+
+ ComplexTypeEntry::formatDebug(debug);
+ debug << ", sourceType=\"" << d->m_sourceType << '"'
+ << ", source=" << d->m_source << ", target=" << d->m_target;
+}
+
+void EnumTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const EnumTypeEntry);
+
+ TypeEntry::formatDebug(debug);
+ if (d->m_pythonEnumType != TypeSystem::PythonEnumType::Unspecified)
+ debug << ", python-type=" << int(d->m_pythonEnumType);
+ if (d->m_flags)
+ debug << ", flags=(" << d->m_flags << ')';
+}
+
+void NamespaceTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const NamespaceTypeEntry);
+
+ ComplexTypeEntry::formatDebug(debug);
+ auto pattern = d->m_filePattern.pattern();
+ FORMAT_NONEMPTY_STRING("pattern", pattern)
+ debug << ",visibility=" << d->m_visibility;
+ if (d->m_inlineNamespace)
+ debug << "[inline]";
+}
+
+QDebug operator<<(QDebug d, const OpaqueContainer &oc)
+{
+ QDebugStateSaver saver(d);
+ d.noquote();
+ d.nospace();
+ d << "OpaqueContainer(\"" << oc.name << "\": " << oc.templateParameters() << ')';
+ return d;
+}
+
+void ContainerTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const ContainerTypeEntry);
+
+ ComplexTypeEntry::formatDebug(debug);
+ debug << ", type=" << d->m_containerKind << '"';
+ if (!d->m_opaqueContainers.isEmpty())
+ debug << ", opaque-containers=[" << d->m_opaqueContainers << ']';
+}
+
+void SmartPointerTypeEntry::formatDebug(QDebug &debug) const
+{
+ S_D(const SmartPointerTypeEntry);
+
+ ComplexTypeEntry::formatDebug(debug);
+ if (!d->m_instantiations.isEmpty()) {
+ debug << "type=" << d->m_type << ", instantiations["
+ << d->m_instantiations.size() << "]=(";
+ for (const auto &i : d->m_instantiations) {
+ debug << i.typeEntry->name() << ',';
+ if (!i.name.isEmpty())
+ debug << "=\"" << i.name << '"';
+ }
+ debug << ')';
+ }
+}
+
+QDebug operator<<(QDebug d, const TypeEntry *te)
+{
+ QDebugStateSaver saver(d);
+ d.noquote();
+ d.nospace();
+ d << "TypeEntry(";
+ if (te)
+ te->formatDebug(d);
+ else
+ d << '0';
+ d << ')';
+ return d;
+}
+
+QDebug operator<<(QDebug d, const TypeEntryCPtr &te)
+{
+ d << te.get();
+ return d;
+}
+
+QDebug operator<<(QDebug d, const TemplateEntry *te)
+{
+ QDebugStateSaver saver(d);
+ d.noquote();
+ d.nospace();
+ d << "TemplateEntry(";
+ if (te) {
+ d << '"' << te->name() << '"';
+ } else {
+ d << '0';
+ }
+ d << ')';
+ return d;
+}
+
+QDebug operator<<(QDebug d, const TemplateEntryCPtr &te)
+{
+ d << te.get();
+ return d;
+}
+#endif // QT_NO_DEBUG_STREAM