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// Qt-Security score:significant
4
5#ifndef METATYPESJSONPROCESSOR_P_H
6#define METATYPESJSONPROCESSOR_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <private/qduplicatetracker_p.h>
20
21#include <QtCore/qcbormap.h>
22#include <QtCore/qhash.h>
23#include <QtCore/qstring.h>
24#include <QtCore/qtyperevision.h>
25#include <QtCore/qvarlengtharray.h>
26#include <QtCore/qvector.h>
27
28QT_BEGIN_NAMESPACE
29
30// With all the QAnyStringViews in this file we rely on the Cbor data to stay
31// in place if you don't change the Cbor contents. We assume that Cbor data
32// is implicitly shared so that merely copying const Cbor objects does not copy
33// the contents.
34
35enum class Access { Public, Protected, Private };
36
38{
40
41 BaseType() = default;
42 BaseType(const QCborMap &cbor);
43
46};
47
49{
51
52 ClassInfo() = default;
53 ClassInfo(const QCborMap &cbor);
54
57};
58
60{
62
63 Interface() = default;
64 Interface(const QCborValue &cbor);
65
67};
68
99
101{
103
104 Argument() = default;
105 Argument(const QCborMap &cbor);
106
109};
110
111struct Method
112{
114 static constexpr int InvalidIndex = std::numeric_limits<int>::min();
115
116 Method() = default;
117 Method(const QCborMap &cbor, bool isConstructor);
118
120
123
125 int lineNumber = 0;
126
128
130
131 bool isCloned = false;
133 bool isConstructor = false;
134 bool isConst = false;
135};
136
137struct Enum
138{
140
141 Enum() = default;
142 Enum(const QCborMap &cbor);
143
147
149
150 int lineNumber = 0;
151 bool isFlag = false;
152 bool isClass = false;
153};
154
189
191{
192public:
194
195 MetaType() = default;
196 MetaType(const QCborMap &cbor, const QString &inputFile, const QCborMap &hashes);
197
198 bool isEmpty() const { return d == &s_empty; }
199
200 QString inputFile() const { return d->inputFile; }
201 int lineNumber() const { return d->lineNumber; }
202 QAnyStringView className() const { return d->className; }
203 QAnyStringView qualifiedClassName() const { return d->qualifiedClassName; }
204 const BaseType::Container &superClasses() const { return d->superClasses; }
205 const ClassInfo::Container &classInfos() const { return d->classInfos; }
206 const Interface::Container &ifaces() const { return d->ifaces; }
207
208 const Property::Container &properties() const { return d->properties; }
209 const Method::Container &methods() const { return d->methods; }
210 const Method::Container &sigs() const { return d->sigs; }
211 const Method::Container &constructors() const { return d->constructors; }
212
213 const Enum::Container &enums() const { return d->enums; }
214
215 Kind kind() const { return d->kind; }
216
217 QAnyStringView metaObjectHash() const { return d->metaObjectHash; }
218
219private:
220 friend bool operator==(const MetaType &a, const MetaType &b) noexcept
221 {
222 return a.d == b.d;
223 }
224
225 friend bool operator!=(const MetaType &a, const MetaType &b) noexcept
226 {
227 return !(a == b);
228 }
229
230 static const MetaTypePrivate s_empty;
231 const MetaTypePrivate *d = &s_empty;
232};
233
237
238 bool isValid() const { return !alias.isEmpty() && !original.isEmpty(); }
239private:
240 friend bool comparesEqual(const UsingDeclaration &a, const UsingDeclaration &b) noexcept
241 {
242 return std::tie(a.alias, a.original) == std::tie(b.alias, b.original);
243 }
244
246 const UsingDeclaration &a, const UsingDeclaration &b) noexcept
247 {
248 return a.alias != b.alias
249 ? compareThreeWay(a.alias, b.alias)
250 : compareThreeWay(a.original, b.original);
251 }
253};
254
256{
257public:
258 static QList<QAnyStringView> namespaces(const MetaType &classDef);
259
260 MetaTypesJsonProcessor(bool privateIncludes) : m_privateIncludes(privateIncludes) {}
261
262 bool processTypes(const QStringList &files);
263
264 bool processForeignTypes(const QString &foreignTypesFile);
265 bool processForeignTypes(const QStringList &foreignTypesFiles);
266
267 void postProcessTypes();
269
270 QList<MetaType> types() const { return m_types; }
271 QList<MetaType> foreignTypes() const { return m_foreignTypes; }
272 QList<QAnyStringView> referencedTypes() const { return m_referencedTypes; }
273 QList<UsingDeclaration> usingDeclarations() const { return m_usingDeclarations; }
274 QList<QString> includes() const { return m_includes; }
276 {
277 return m_foreignTypeMetaObjectHashes;
278 }
279
281
282private:
283 enum RegistrationMode {
284 NoRegistration,
285 ObjectRegistration,
286 GadgetRegistration,
287 NamespaceRegistration
288 };
289
290 struct PreProcessResult {
291 QList<QAnyStringView> primitiveAliases;
292 UsingDeclaration usingDeclaration;
293 QAnyStringView foreignPrimitive;
294 RegistrationMode mode;
295 };
296
297 enum class PopulateMode { No, Yes };
298 static PreProcessResult preProcess(const MetaType &classDef, PopulateMode populateMode);
299 void addRelatedTypes();
300
301 void sortTypes(QList<MetaType> &types);
302 QString resolvedInclude(QAnyStringView include);
303 void processTypes(const QCborMap &types);
304 void processForeignTypes(const QCborMap &types);
305
306 bool isPrimitive(QAnyStringView type) const
307 {
308 return std::binary_search(m_primitiveTypes.begin(), m_primitiveTypes.end(), type);
309 }
310
311 QList<QString> m_includes;
312 QList<QAnyStringView> m_referencedTypes;
313 QList<QAnyStringView> m_primitiveTypes;
314 QList<UsingDeclaration> m_usingDeclarations;
315 QList<MetaType> m_types;
316 QList<MetaType> m_foreignTypes;
317 QDuplicateTracker<QString> m_seenMetaTypesFiles;
318 // Types declared as QML_FOREIGN(T) need to get the metaObject hash of the target T type.
319 // Hold it here until generation.
320 QHash<QAnyStringView, QAnyStringView> m_foreignTypeMetaObjectHashes;
321 bool m_privateIncludes = false;
322};
323
324QT_END_NAMESPACE
325
326#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
QAnyStringView metaObjectHash() const
const Property::Container & properties() const
MetaType(const QCborMap &cbor, const QString &inputFile, const QCborMap &hashes)
friend bool operator==(const MetaType &a, const MetaType &b) noexcept
QHash< QAnyStringView, QAnyStringView > foreignTypeMetaObjectHashses() const
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
QList< MetaType > types() const
QList< QAnyStringView > referencedTypes() const
QList< MetaType > foreignTypes() const
MetaTypesJsonProcessor(bool privateIncludes)
Combined button and popup list for selecting options.
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)
@ 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
ClassInfo::Container classInfos
BaseType::Container superClasses
MetaTypePrivate(const QCborMap &cbor, const QString &inputFile, const QCborMap &hashes)
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