aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmltyperegistrar/qmetatypesjsonprocessor_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmltyperegistrar/qmetatypesjsonprocessor_p.h')
-rw-r--r--src/qmltyperegistrar/qmetatypesjsonprocessor_p.h296
1 files changed, 296 insertions, 0 deletions
diff --git a/src/qmltyperegistrar/qmetatypesjsonprocessor_p.h b/src/qmltyperegistrar/qmetatypesjsonprocessor_p.h
new file mode 100644
index 0000000000..f582cf7a1e
--- /dev/null
+++ b/src/qmltyperegistrar/qmetatypesjsonprocessor_p.h
@@ -0,0 +1,296 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#ifndef METATYPESJSONPROCESSOR_P_H
+#define METATYPESJSONPROCESSOR_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qcbormap.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qtyperevision.h>
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qvector.h>
+
+QT_BEGIN_NAMESPACE
+
+// With all the QAnyStringViews in this file we rely on the Cbor data to stay
+// in place if you don't change the Cbor contents. We assume that Cbor data
+// is implicitly shared so that merely copying const Cbor objects does not copy
+// the contents.
+
+enum class Access { Public, Protected, Private };
+
+struct BaseType
+{
+ using Container = QVarLengthArray<BaseType, 1>;
+
+ BaseType() = default;
+ BaseType(const QCborMap &cbor);
+
+ QAnyStringView name;
+ Access access;
+};
+
+struct ClassInfo
+{
+ using Container = std::vector<ClassInfo>;
+
+ ClassInfo() = default;
+ ClassInfo(const QCborMap &cbor);
+
+ QAnyStringView name;
+ QAnyStringView value;
+};
+
+struct Interface
+{
+ using Container = QVarLengthArray<Interface, 1>;
+
+ Interface() = default;
+ Interface(const QCborValue &cbor);
+
+ QAnyStringView className;
+};
+
+struct Property
+{
+ using Container = std::vector<Property>;
+
+ Property() = default;
+ Property(const QCborMap &cbor);
+
+ QAnyStringView name;
+ QAnyStringView type;
+
+ QAnyStringView member;
+ QAnyStringView read;
+ QAnyStringView write;
+ QAnyStringView reset;
+ QAnyStringView notify;
+ QAnyStringView bindable;
+
+ QAnyStringView privateClass;
+
+ int index = -1;
+
+ QTypeRevision revision;
+
+ bool isFinal = false;
+ bool isConstant = false;
+ bool isRequired = false;
+};
+
+struct Argument
+{
+ using Container = std::vector<Argument>;
+
+ Argument() = default;
+ Argument(const QCborMap &cbor);
+
+ QAnyStringView name;
+ QAnyStringView type;
+};
+
+struct Method
+{
+ using Container = std::vector<Method>;
+
+ Method() = default;
+ Method(const QCborMap &cbor, bool isConstructor);
+
+ QAnyStringView name;
+
+ Argument::Container arguments;
+ QAnyStringView returnType;
+
+ QTypeRevision revision;
+
+ Access access = Access::Public;
+
+ bool isCloned = false;
+ bool isJavaScriptFunction = false;
+ bool isConstructor = false;
+};
+
+struct Enum
+{
+ using Container = std::vector<Enum>;
+
+ Enum() = default;
+ Enum(const QCborMap &cbor);
+
+ QAnyStringView name;
+ QAnyStringView alias;
+ QAnyStringView type;
+
+ QList<QAnyStringView> values;
+
+ bool isFlag = false;
+ bool isClass = false;
+};
+
+struct MetaTypePrivate
+{
+ Q_DISABLE_COPY_MOVE(MetaTypePrivate)
+
+ enum Kind : quint8 { Object, Gadget, Namespace, Unknown };
+
+ MetaTypePrivate() = default;
+ MetaTypePrivate(const QCborMap &cbor, const QString &inputFile);
+
+ const QCborMap cbor; // need to keep this to hold on to the strings
+ const QString inputFile;
+
+ QAnyStringView className;
+ QAnyStringView qualifiedClassName;
+ BaseType::Container superClasses;
+ ClassInfo::Container classInfos;
+ Interface::Container ifaces;
+
+ Property::Container properties;
+
+ Method::Container methods;
+ Method::Container sigs;
+ Method::Container constructors;
+
+ Enum::Container enums;
+
+ Kind kind = Unknown;
+};
+
+class MetaType
+{
+public:
+ using Kind = MetaTypePrivate::Kind;
+
+ MetaType() = default;
+ MetaType(const QCborMap &cbor, const QString &inputFile);
+
+ bool isEmpty() const { return d == &s_empty; }
+
+ QString inputFile() const { return d->inputFile; }
+ QAnyStringView className() const { return d->className; }
+ QAnyStringView qualifiedClassName() const { return d->qualifiedClassName; }
+ const BaseType::Container &superClasses() const { return d->superClasses; }
+ const ClassInfo::Container &classInfos() const { return d->classInfos; }
+ const Interface::Container &ifaces() const { return d->ifaces; }
+
+ const Property::Container &properties() const { return d->properties; }
+ const Method::Container &methods() const { return d->methods; }
+ const Method::Container &sigs() const { return d->sigs; }
+ const Method::Container &constructors() const { return d->constructors; }
+
+ const Enum::Container &enums() const { return d->enums; }
+
+ Kind kind() const { return d->kind; }
+
+private:
+ friend bool operator==(const MetaType &a, const MetaType &b) noexcept
+ {
+ return a.d == b.d;
+ }
+
+ friend bool operator!=(const MetaType &a, const MetaType &b) noexcept
+ {
+ return !(a == b);
+ }
+
+ static const MetaTypePrivate s_empty;
+ const MetaTypePrivate *d = &s_empty;
+};
+
+struct UsingDeclaration {
+ QAnyStringView alias;
+ QAnyStringView original;
+
+ bool isValid() const { return !alias.isEmpty() && !original.isEmpty(); }
+private:
+ friend bool comparesEqual(const UsingDeclaration &a, const UsingDeclaration &b) noexcept
+ {
+ return std::tie(a.alias, a.original) == std::tie(b.alias, b.original);
+ }
+
+ friend Qt::strong_ordering compareThreeWay(
+ const UsingDeclaration &a, const UsingDeclaration &b) noexcept
+ {
+ return a.alias != b.alias
+ ? compareThreeWay(a.alias, b.alias)
+ : compareThreeWay(a.original, b.original);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(UsingDeclaration);
+};
+
+class MetaTypesJsonProcessor
+{
+public:
+ static QList<QAnyStringView> namespaces(const MetaType &classDef);
+
+ MetaTypesJsonProcessor(bool privateIncludes) : m_privateIncludes(privateIncludes) {}
+
+ bool processTypes(const QStringList &files);
+
+ bool processForeignTypes(const QString &foreignTypesFile);
+ bool processForeignTypes(const QStringList &foreignTypesFiles);
+
+ void postProcessTypes();
+ void postProcessForeignTypes();
+
+ QVector<MetaType> types() const { return m_types; }
+ QVector<MetaType> foreignTypes() const { return m_foreignTypes; }
+ QList<QAnyStringView> referencedTypes() const { return m_referencedTypes; }
+ QList<UsingDeclaration> usingDeclarations() const { return m_usingDeclarations; }
+ QList<QString> includes() const { return m_includes; }
+
+ QString extractRegisteredTypes() const;
+
+private:
+ enum RegistrationMode {
+ NoRegistration,
+ ObjectRegistration,
+ GadgetRegistration,
+ NamespaceRegistration
+ };
+
+ struct PreProcessResult {
+ QList<QAnyStringView> primitiveAliases;
+ UsingDeclaration usingDeclaration;
+ QAnyStringView foreignPrimitive;
+ RegistrationMode mode;
+ };
+
+ enum class PopulateMode { No, Yes };
+ static PreProcessResult preProcess(const MetaType &classDef, PopulateMode populateMode);
+ void addRelatedTypes();
+
+ void sortTypes(QVector<MetaType> &types);
+ QString resolvedInclude(QAnyStringView include);
+ void processTypes(const QCborMap &types);
+ void processForeignTypes(const QCborMap &types);
+
+ bool isPrimitive(QAnyStringView type) const
+ {
+ return std::binary_search(m_primitiveTypes.begin(), m_primitiveTypes.end(), type);
+ }
+
+ QList<QString> m_includes;
+ QList<QAnyStringView> m_referencedTypes;
+ QList<QAnyStringView> m_primitiveTypes;
+ QList<UsingDeclaration> m_usingDeclarations;
+ QVector<MetaType> m_types;
+ QVector<MetaType> m_foreignTypes;
+ bool m_privateIncludes = false;
+};
+
+QT_END_NAMESPACE
+
+#endif // METATYPESJSONPROCESSOR_P_H