Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qmetatypesjsonprocessor_p.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#ifndef METATYPESJSONPROCESSOR_P_H
5#define METATYPESJSONPROCESSOR_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <private/qduplicatetracker_p.h>
19
20#include <QtCore/qcbormap.h>
21#include <QtCore/qstring.h>
22#include <QtCore/qtyperevision.h>
23#include <QtCore/qvarlengtharray.h>
24#include <QtCore/qvector.h>
25
26QT_BEGIN_NAMESPACE
27
28// With all the QAnyStringViews in this file we rely on the Cbor data to stay
29// in place if you don't change the Cbor contents. We assume that Cbor data
30// is implicitly shared so that merely copying const Cbor objects does not copy
31// the contents.
32
33enum class Access { Public, Protected, Private };
34
36{
38
39 BaseType() = default;
40 BaseType(const QCborMap &cbor);
41
44};
45
47{
49
50 ClassInfo() = default;
51 ClassInfo(const QCborMap &cbor);
52
55};
56
58{
60
61 Interface() = default;
62 Interface(const QCborValue &cbor);
63
65};
66
95
97{
99
100 Argument() = default;
101 Argument(const QCborMap &cbor);
102
105};
106
107struct Method
108{
110 static constexpr int InvalidIndex = std::numeric_limits<int>::min();
111
112 Method() = default;
113 Method(const QCborMap &cbor, bool isConstructor);
114
116
119
121 int lineNumber = 0;
122
124
126
127 bool isCloned = false;
129 bool isConstructor = false;
130 bool isConst = false;
131};
132
133struct Enum
134{
136
137 Enum() = default;
138 Enum(const QCborMap &cbor);
139
143
145
146 int lineNumber = 0;
147 bool isFlag = false;
148 bool isClass = false;
149};
150
180
182{
183public:
185
186 MetaType() = default;
187 MetaType(const QCborMap &cbor, const QString &inputFile);
188
189 bool isEmpty() const { return d == &s_empty; }
190
191 QString inputFile() const { return d->inputFile; }
192 int lineNumber() const { return d->lineNumber; }
193 QAnyStringView className() const { return d->className; }
194 QAnyStringView qualifiedClassName() const { return d->qualifiedClassName; }
195 const BaseType::Container &superClasses() const { return d->superClasses; }
196 const ClassInfo::Container &classInfos() const { return d->classInfos; }
197 const Interface::Container &ifaces() const { return d->ifaces; }
198
199 const Property::Container &properties() const { return d->properties; }
200 const Method::Container &methods() const { return d->methods; }
201 const Method::Container &sigs() const { return d->sigs; }
202 const Method::Container &constructors() const { return d->constructors; }
203
204 const Enum::Container &enums() const { return d->enums; }
205
206 Kind kind() const { return d->kind; }
207
208private:
209 friend bool operator==(const MetaType &a, const MetaType &b) noexcept
210 {
211 return a.d == b.d;
212 }
213
214 friend bool operator!=(const MetaType &a, const MetaType &b) noexcept
215 {
216 return !(a == b);
217 }
218
219 static const MetaTypePrivate s_empty;
220 const MetaTypePrivate *d = &s_empty;
221};
222
226
227 bool isValid() const { return !alias.isEmpty() && !original.isEmpty(); }
228private:
229 friend bool comparesEqual(const UsingDeclaration &a, const UsingDeclaration &b) noexcept
230 {
231 return std::tie(a.alias, a.original) == std::tie(b.alias, b.original);
232 }
233
235 const UsingDeclaration &a, const UsingDeclaration &b) noexcept
236 {
237 return a.alias != b.alias
238 ? compareThreeWay(a.alias, b.alias)
239 : compareThreeWay(a.original, b.original);
240 }
242};
243
245{
246public:
247 static QList<QAnyStringView> namespaces(const MetaType &classDef);
248
249 MetaTypesJsonProcessor(bool privateIncludes) : m_privateIncludes(privateIncludes) {}
250
251 bool processTypes(const QStringList &files);
252
253 bool processForeignTypes(const QString &foreignTypesFile);
254 bool processForeignTypes(const QStringList &foreignTypesFiles);
255
256 void postProcessTypes();
258
259 QVector<MetaType> types() const { return m_types; }
260 QVector<MetaType> foreignTypes() const { return m_foreignTypes; }
261 QList<QAnyStringView> referencedTypes() const { return m_referencedTypes; }
262 QList<UsingDeclaration> usingDeclarations() const { return m_usingDeclarations; }
263 QList<QString> includes() const { return m_includes; }
264
266
267private:
268 enum RegistrationMode {
269 NoRegistration,
270 ObjectRegistration,
271 GadgetRegistration,
272 NamespaceRegistration
273 };
274
275 struct PreProcessResult {
276 QList<QAnyStringView> primitiveAliases;
277 UsingDeclaration usingDeclaration;
278 QAnyStringView foreignPrimitive;
279 RegistrationMode mode;
280 };
281
282 enum class PopulateMode { No, Yes };
283 static PreProcessResult preProcess(const MetaType &classDef, PopulateMode populateMode);
284 void addRelatedTypes();
285
286 void sortTypes(QVector<MetaType> &types);
287 QString resolvedInclude(QAnyStringView include);
288 void processTypes(const QCborMap &types);
289 void processForeignTypes(const QCborMap &types);
290
291 bool isPrimitive(QAnyStringView type) const
292 {
293 return std::binary_search(m_primitiveTypes.begin(), m_primitiveTypes.end(), type);
294 }
295
296 QList<QString> m_includes;
297 QList<QAnyStringView> m_referencedTypes;
298 QList<QAnyStringView> m_primitiveTypes;
299 QList<UsingDeclaration> m_usingDeclarations;
300 QVector<MetaType> m_types;
301 QVector<MetaType> m_foreignTypes;
302 QDuplicateTracker<QString> m_seenMetaTypesFiles;
303 bool m_privateIncludes = false;
304};
305
306QT_END_NAMESPACE
307
308#endif // METATYPESJSONPROCESSOR_P_H
Access
Definition access.h:11
const Method::Container & constructors() const
const Enum::Container & enums() const
QAnyStringView qualifiedClassName() const
const Method::Container & sigs() const
const Method::Container & methods() const
const ClassInfo::Container & classInfos() const
friend bool operator!=(const MetaType &a, const MetaType &b) noexcept
const BaseType::Container & superClasses() const
MetaType()=default
QAnyStringView className() const
QString inputFile() const
const Interface::Container & ifaces() const
const Property::Container & properties() const
MetaType(const QCborMap &cbor, const QString &inputFile)
friend bool operator==(const MetaType &a, const MetaType &b) noexcept
bool processForeignTypes(const QString &foreignTypesFile)
static QList< QAnyStringView > namespaces(const MetaType &classDef)
QList< QString > includes() const
bool processTypes(const QStringList &files)
QList< UsingDeclaration > usingDeclarations() const
QVector< MetaType > foreignTypes() const
QList< QAnyStringView > referencedTypes() const
QVector< MetaType > types() const
MetaTypesJsonProcessor(bool privateIncludes)
static Access getAccess(const QCborMap &cbor)
static QCborValue fromJson(const QByteArray &json, QJsonParseError *error)
static QLatin1StringView typeRelationString(TypeRelation relation)
static void sortStringList(QList< String > *list)
static QTypeRevision getRevision(const QCborMap &cbor)
static bool qualifiedClassNameLessThan(const MetaType &a, const MetaType &b)
static size_t qHash(QAnyStringView string, size_t seed=0)
@ Public
Definition access.h:11
@ Private
Definition access.h:11
@ Protected
Definition access.h:11
QDebug warning(const MetaType &classDef)
QAnyStringView name
Argument(const QCborMap &cbor)
Argument()=default
QAnyStringView type
BaseType()=default
QAnyStringView name
BaseType(const QCborMap &cbor)
ClassInfo()=default
QAnyStringView value
QAnyStringView name
ClassInfo(const QCborMap &cbor)
QAnyStringView alias
QAnyStringView name
QList< QAnyStringView > values
Enum(const QCborMap &cbor)
Enum()=default
QAnyStringView type
Interface(const QCborValue &cbor)
QAnyStringView className
Interface()=default
MetaTypePrivate()=default
MetaTypePrivate(const QCborMap &cbor, const QString &inputFile)
ClassInfo::Container classInfos
BaseType::Container superClasses
Property::Container properties
Interface::Container ifaces
QAnyStringView qualifiedClassName
Method::Container constructors
QAnyStringView name
Method()=default
QAnyStringView returnType
Argument::Container arguments
Method(const QCborMap &cbor, bool isConstructor)
QTypeRevision revision
static constexpr int InvalidIndex
QAnyStringView write
QAnyStringView notify
QAnyStringView read
QAnyStringView privateClass
Property(const QCborMap &cbor)
QAnyStringView name
QAnyStringView member
QAnyStringView type
Property()=default
QAnyStringView reset
QAnyStringView bindable
QTypeRevision revision
friend bool comparesEqual(const UsingDeclaration &a, const UsingDeclaration &b) noexcept
friend Qt::strong_ordering compareThreeWay(const UsingDeclaration &a, const UsingDeclaration &b) noexcept