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
moc.h
Go to the documentation of this file.
1// Copyright (C) 2016 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 MOC_H
5#define MOC_H
6
7#include "parser.h"
8#include <qstringlist.h>
9#include <qmap.h>
10#include <qjsondocument.h>
11#include <qjsonarray.h>
12#include <qjsonobject.h>
13#include <qtmocconstants.h>
14#include <qtyperevision.h>
15#include <stdio.h>
16
17#include <private/qtools_p.h>
18
19QT_BEGIN_NAMESPACE
20
21struct QMetaObject;
22
23enum class TypeTag : uchar {
25 HasStruct = 0x01,
26 HasClass = 0x02,
27 HasEnum = 0x04,
28};
29Q_DECLARE_FLAGS(TypeTags, TypeTag)
30Q_DECLARE_OPERATORS_FOR_FLAGS(TypeTags)
31
32struct Type
33{
34 enum ReferenceType { NoReference, Reference, RValueReference, Pointer };
35
36 inline Type() : isVolatile(false), isScoped(false), firstToken(NOTOKEN), referenceType(NoReference) {}
37 inline explicit Type(const QByteArray &_name)
38 : name(_name), rawName(name), isVolatile(false), isScoped(false), firstToken(NOTOKEN), referenceType(NoReference) {}
39 QByteArray name;
40 //When used as a return type, the type name may be modified to remove the references.
41 // rawName is the type as found in the function signature
42 QByteArray rawName;
43 uint isVolatile : 1;
44 uint isScoped : 1;
45 TypeTags typeTag;
46 Token firstToken;
47 ReferenceType referenceType;
48};
50
51struct ClassDef;
64
66{
67 ArgumentDef() : isDefault(false) {}
71
72 QJsonObject toJson() const;
73};
75
77{
84
87 int revision = 0;
88 int lineNumber = 0;
89
90 bool isConst = false;
91 bool isVirtual = false;
92 bool isStatic = false;
93 bool inlineCode = false;
94 bool wasCloned = false;
95
97
98 bool isCompat = false;
99 bool isInvokable = false;
100 bool isScriptable = false;
101 bool isSlot = false;
102 bool isSignal = false;
103 bool isPrivateSignal = false;
104 bool isConstructor = false;
105 bool isDestructor = false;
106 bool isAbstract = false;
107 bool isRawSlot = false;
108
109 QJsonObject toJson(int index) const;
110 static void accessToJson(QJsonObject *obj, Access acs);
111};
113
115{
116 bool stdCppSet() const {
117 if (name.isEmpty())
118 return false;
119 QByteArray s("set");
120 s += QtMiscUtils::toAsciiUpper(name[0]);
121 s += name.mid(1);
122 return (s == write);
123 }
124
126 int notifyId = -1; // -1 means no notifyId, >= 0 means signal defined in this class, < -1 means signal not defined in this class
129 int revision = 0;
131 bool constant = false;
132 bool final = false;
133 bool required = false;
134 int relativeIndex = -1; // property index in current metaobject
135 int lineNumber = 0;
136
137 qsizetype location = -1; // token index, used for error reporting
138
139 QJsonObject toJson() const;
140};
142
152
159
171
178
215
217 bool hasQNamespace = false;
218 bool doGenerate = false;
219};
221
222class Moc : public Parser
223{
224public:
226
228 : noInclude(false), mustIncludeQPluginH(false), requireCompleteTypes(false)
229 {}
230
232
241 // map from class name to fully qualified name
244 QMap<QString, QJsonArray> metaArgs;
246
247 void parse();
249 void generate(FILE *out, FILE *jsonOutput);
250
251 bool parseClassHead(ClassDef *def);
252 inline bool inClass(const ClassDef *def) const {
253 return index > def->begin && index < def->end - 1;
254 }
255
256 inline bool inNamespace(const NamespaceDef *def) const {
257 return index > def->begin && index < def->end - 1;
258 }
259
260 const QByteArray &toFullyQualified(const QByteArray &name) const noexcept;
261
262 void prependNamespaces(BaseDef &def, const QList<NamespaceDef> &namespaceList) const;
263
264 Type parseType();
265
266 bool parseEnum(EnumDef *def, ClassDef *containingClass);
267
268 bool parseFunction(FunctionDef *def, bool inMacro = false);
269 bool parseMaybeFunction(const ClassDef *cdef, FunctionDef *def);
270
271 void parseSlots(ClassDef *def, FunctionDef::Access access);
272 void parseSignals(ClassDef *def);
273 void parseProperty(ClassDef *def, PropertyMode mode);
274 void parsePluginData(ClassDef *def);
275
276 void createPropertyDef(PropertyDef &def, int propertyIndex, PropertyMode mode);
277
280 void parseFlag(BaseDef *def);
283 void parseClassInfo(ClassDef *def);
284 void parseInterfaces(ClassDef *def);
287 void parseMocInclude();
288 void parseSlotInPrivate(ClassDef *def, FunctionDef::Access access);
291
293
294 QByteArray lexemUntil(Token);
295 bool until(Token);
296
297 // test for Q_INVOKABLE, Q_SCRIPTABLE, etc. and set the flags
298 // in FunctionDef accordingly
300 bool testFunctionAttribute(Token tok, FunctionDef *def);
303
304 bool skipCxxAttributes();
305
306 void checkSuperClasses(ClassDef *def);
307 void checkProperties(ClassDef* cdef);
309
310 void checkListSizes(const ClassDef &def);
311};
312
313inline QByteArray noRef(const QByteArray &type)
314{
315 if (type.endsWith('&')) {
316 if (type.endsWith("&&"))
317 return type.left(type.size()-2);
318 return type.left(type.size()-1);
319 }
320 return type;
321}
322
323QT_END_NAMESPACE
324
325#endif // MOC_H
Definition moc.h:223
bool testFunctionAttribute(Token tok, FunctionDef *def)
Definition moc.cpp:355
void parseEnumOrFlag(BaseDef *def, QtMocConstants::EnumFlags flags)
Definition moc.cpp:1651
void checkSuperClasses(ClassDef *def)
Definition moc.cpp:1919
Moc()
Definition moc.h:227
void parse()
Definition moc.cpp:677
bool parseEnum(EnumDef *def, ClassDef *containingClass)
Definition moc.cpp:246
void parseProperty(ClassDef *def, PropertyMode mode)
Definition moc.cpp:1546
QByteArray lexemUntil(Token)
Definition moc.cpp:1819
EncounteredQmlMacro parseClassInfo(BaseDef *def)
Definition moc.cpp:1690
bool until(Token)
Definition moc.cpp:1839
QList< QByteArray > includeFiles
Definition moc.h:237
bool requireCompleteTypes
Definition moc.h:235
QHash< QByteArray, QByteArray > knownQObjectClasses
Definition moc.h:242
void createPropertyDef(PropertyDef &def, int propertyIndex, PropertyMode mode)
Definition moc.cpp:1370
void parseClassInfo(ClassDef *def)
Definition moc.cpp:1717
QByteArrayView strippedFileName() const
Definition moc.cpp:1113
bool parseClassHead(ClassDef *def)
Definition moc.cpp:39
void parsePrivateProperty(ClassDef *def, PropertyMode mode)
Definition moc.cpp:1638
QByteArray includePath
Definition moc.h:236
QByteArray filename
Definition moc.h:231
void parseFlag(BaseDef *def)
Definition moc.cpp:1666
void parseSignals(ClassDef *def)
Definition moc.cpp:1326
void parseDeclareMetatype()
Definition moc.cpp:1779
void parsePropertyAttributes(PropertyDef &propDef)
Definition moc.cpp:1409
void parseInterfaces(ClassDef *def)
Definition moc.cpp:1723
bool testFunctionRevision(FunctionDef *def)
Definition moc.cpp:418
bool testFunctionAttribute(FunctionDef *def)
Definition moc.cpp:346
void prependNamespaces(BaseDef &def, const QList< NamespaceDef > &namespaceList) const
Definition moc.cpp:631
QHash< QByteArray, QByteArray > knownGadgets
Definition moc.h:243
QList< QByteArray > metaTypes
Definition moc.h:240
bool parseFunction(FunctionDef *def, bool inMacro=false)
Definition moc.cpp:430
QByteArray parsePropertyAccessor()
Definition moc.cpp:1620
QMap< QString, QJsonArray > metaArgs
Definition moc.h:244
bool testForFunctionModifiers(FunctionDef *def)
Definition moc.cpp:534
const QByteArray & toFullyQualified(const QByteArray &name) const noexcept
Definition moc.cpp:30
void parseSlots(ClassDef *def, FunctionDef::Access access)
Definition moc.cpp:1284
void parseDeclareInterface()
Definition moc.cpp:1756
void checkListSizes(const ClassDef &def)
Definition moc.cpp:641
QTypeRevision parseRevision()
Definition moc.cpp:387
void parseMocInclude()
Definition moc.cpp:1788
QList< QString > parsedPluginMetadataFiles
Definition moc.h:245
bool skipCxxAttributes()
Definition moc.cpp:378
PropertyMode
Definition moc.h:225
@ Anonymous
Definition moc.h:225
@ Named
Definition moc.h:225
bool mustIncludeQPluginH
Definition moc.h:234
bool parseMaybeFunction(const ClassDef *cdef, FunctionDef *def)
Definition moc.cpp:542
void checkProperties(ClassDef *cdef)
Definition moc.cpp:1977
Type parseType()
Definition moc.cpp:126
void parseFunctionArguments(FunctionDef *def)
Definition moc.cpp:306
void parseSlotInPrivate(ClassDef *def, FunctionDef::Access access)
Definition moc.cpp:1798
bool inClass(const ClassDef *def) const
Definition moc.h:252
void parsePluginData(ClassDef *def)
Definition moc.cpp:1556
void generate(FILE *out, FILE *jsonOutput)
Definition moc.cpp:1190
QMap< QByteArray, QByteArray > interface2IdMap
Definition moc.h:239
bool noInclude
Definition moc.h:233
EncounteredQmlMacro
Definition moc.h:281
bool inNamespace(const NamespaceDef *def) const
Definition moc.h:256
QList< ClassDef > classList
Definition moc.h:238
int evaluateCondition()
void setDebugIncludes(bool value)
void parseDefineArguments(Macro *m)
void skipUntilEndif()
QHash< QByteArray, QByteArray > nonlocalIncludePathResolutionCache
Symbols preprocessed(const QByteArray &filename, QFile *device)
void substituteUntilNewline(Symbols &substituted)
QList< QByteArray > frameworks
static bool preprocessOnly
static Symbols macroExpandIdentifier(Preprocessor *that, SymbolStack &symbols, int lineNum, QByteArray *macroName)
QByteArray resolveInclude(const QByteArray &filename, const QByteArray &relativeTo)
static Symbols tokenize(const QByteArray &input, int lineNum=1, TokenizeMode mode=TokenizeCpp)
static void macroExpand(Symbols *into, Preprocessor *that, const Symbols &toExpand, qsizetype &index, int lineNum, bool one, const QSet< QByteArray > &excludeSymbols=QSet< QByteArray >())
@ PreparePreprocessorStatement
@ TokenizePreprocessorStatement
The QCommandLineOption class defines a possible command-line option. \inmodule QtCore.
The QCommandLineParser class provides a means for handling the command line options.
Definition qlist.h:80
Definition qmap.h:189
\inmodule QtCore
QByteArray unquotedLexem()
Definition symbols.h:105
const Symbol & symbol() const
Definition symbols.h:102
Token token()
Definition symbols.h:103
bool dontReplaceSymbol(const QByteArray &name) const
Definition symbols.h:125
bool hasNext()
Definition symbols.h:89
QByteArray lexem() const
Definition symbols.h:104
Token next()
Definition symbols.h:94
const SafeSymbols & constTop() const
Definition symbols.h:88
bool test(Token)
Definition symbols.h:111
Q_DECLARE_TYPEINFO(EnumDef, Q_RELOCATABLE_TYPE)
QByteArray noRef(const QByteArray &type)
Definition moc.h:313
Q_DECLARE_TYPEINFO(PropertyDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(NamespaceDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ClassDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ClassInfoDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ClassDef::Interface, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(SuperClass, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ArgumentDef, Q_RELOCATABLE_TYPE)
TypeTag
Definition moc.h:23
@ HasEnum
Definition moc.h:27
@ HasClass
Definition moc.h:26
@ None
Definition moc.h:24
@ HasStruct
Definition moc.h:25
Q_DECLARE_TYPEINFO(PrivateQPropertyDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(FunctionDef, Q_RELOCATABLE_TYPE)
QHash< MacroName, Macro > Macros
SubArray MacroName
Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE)
#define qPrintable(string)
Definition qstring.h:1685
#define QStringLiteral(str)
Definition qstring.h:1826
static QByteArray combinePath(const QString &infile, const QString &outfile)
Definition main.cpp:40
static bool hasNext(const Symbols &symbols, int i)
Definition main.cpp:78
static const Symbol & next(const Symbols &symbols, int &i)
Definition main.cpp:81
int runMoc(int argc, char **argv)
Definition main.cpp:170
static auto openFileForWriting(const QString &name)
Definition main.cpp:62
void error(const char *msg="Invalid argument")
Definition main.cpp:56
static QStringList argumentsFromCommandLineAndFile(const QStringList &arguments, bool &hasOptionFiles)
Definition main.cpp:138
QByteArray composePreprocessorOutput(const Symbols &symbols)
Definition main.cpp:85
int main(int argc, char *argv[])
[ctor_close]
QByteArray rightType
Definition moc.h:69
QByteArray normalizedType
Definition moc.h:69
QJsonObject toJson() const
Definition moc.cpp:2182
QByteArray name
Definition moc.h:69
ArgumentDef()
Definition moc.h:67
bool isDefault
Definition moc.h:70
Type type
Definition moc.h:68
Definition moc.h:160
qsizetype end
Definition moc.h:168
qsizetype begin
Definition moc.h:167
QMap< QByteArray, QByteArray > flagAliases
Definition moc.h:166
QByteArray qualified
Definition moc.h:162
qsizetype lineNumber
Definition moc.h:169
QByteArray classname
Definition moc.h:161
QList< ClassInfoDef > classInfoList
Definition moc.h:163
QList< EnumDef > enumList
Definition moc.h:165
Interface(const QByteArray &_className)
Definition moc.h:185
QByteArray className
Definition moc.h:187
QByteArray interfaceId
Definition moc.h:188
QMap< QString, QJsonArray > metaArgs
Definition moc.h:195
QJsonDocument metaData
Definition moc.h:196
QByteArray uri
Definition moc.h:194
QByteArray iid
Definition moc.h:193
bool hasQObject
Definition moc.h:206
QList< QList< Interface > > interfaceList
Definition moc.h:190
QList< FunctionDef > publicList
Definition moc.h:200
QList< FunctionDef > methodList
Definition moc.h:200
QList< PropertyDef > propertyList
Definition moc.h:202
QList< FunctionDef > constructorList
Definition moc.h:199
bool hasQGadget
Definition moc.h:207
QList< SuperClass > superclassList
Definition moc.h:180
bool requireCompleteMethodTypes
Definition moc.h:209
bool hasQNamespace
Definition moc.h:208
QList< FunctionDef > slotList
Definition moc.h:200
QList< FunctionDef > signalList
Definition moc.h:200
int revisionedMethods
Definition moc.h:204
QJsonObject toJson() const
Definition moc.cpp:2052
QList< QByteArray > nonClassSignalList
Definition moc.h:201
QByteArray name
Definition moc.h:155
QByteArray value
Definition moc.h:156
Definition moc.h:53
QByteArray enumName
Definition moc.h:55
QFlags< QtMocConstants::EnumFlags > flags
Definition moc.h:58
QByteArray qualifiedType(const ClassDef *cdef) const
Definition moc.cpp:2259
QJsonObject toJson(const ClassDef &cdef) const
Definition moc.cpp:2237
QList< QByteArray > values
Definition moc.h:57
QByteArray name
Definition moc.h:54
QByteArray type
Definition moc.h:56
int lineNumber
Definition moc.h:61
bool isVirtual
Definition moc.h:91
bool isScriptable
Definition moc.h:100
bool wasCloned
Definition moc.h:94
QByteArray normalizedType
Definition moc.h:80
QJsonObject toJson(int index) const
Definition moc.cpp:2143
bool isCompat
Definition moc.h:98
bool inlineCode
Definition moc.h:93
Type type
Definition moc.h:78
bool isRawSlot
Definition moc.h:107
static void accessToJson(QJsonObject *obj, Access acs)
Definition moc.cpp:2173
Access access
Definition moc.h:86
bool isSignal
Definition moc.h:102
bool isSlot
Definition moc.h:101
bool isInvokable
Definition moc.h:99
QByteArray name
Definition moc.h:82
QByteArray inPrivateClass
Definition moc.h:83
bool isConst
Definition moc.h:90
QList< ArgumentDef > arguments
Definition moc.h:79
int lineNumber
Definition moc.h:88
int revision
Definition moc.h:87
bool returnTypeIsVolatile
Definition moc.h:96
bool isAbstract
Definition moc.h:106
bool isPrivateSignal
Definition moc.h:103
bool isDestructor
Definition moc.h:105
@ Public
Definition moc.h:85
@ Protected
Definition moc.h:85
@ Private
Definition moc.h:85
bool isConstructor
Definition moc.h:104
bool isStatic
Definition moc.h:92
QByteArray tag
Definition moc.h:81
Simple structure used by the Doc and DocParser classes.
Symbols symbols
bool isVariadic
bool isFunction
Symbols arguments
bool doGenerate
Definition moc.h:218
bool hasQNamespace
Definition moc.h:217
QByteArray name
Definition moc.h:146
QByteArray storage
Definition moc.h:149
QByteArray accessor
Definition moc.h:148
QByteArray setter
Definition moc.h:147
QByteArray scriptable
Definition moc.h:125
QByteArray member
Definition moc.h:125
QByteArray notify
Definition moc.h:125
QByteArray write
Definition moc.h:125
int lineNumber
Definition moc.h:135
QByteArray inPrivateClass
Definition moc.h:125
int notifyId
Definition moc.h:126
bool final
Definition moc.h:132
QJsonObject toJson() const
Definition moc.cpp:2191
bool constant
Definition moc.h:131
Specification gspec
Definition moc.h:128
Specification
Definition moc.h:127
@ ReferenceSpec
Definition moc.h:127
@ ValueSpec
Definition moc.h:127
@ PointerSpec
Definition moc.h:127
bool stdCppSet() const
Definition moc.h:116
QByteArray user
Definition moc.h:125
TypeTags typeTag
Definition moc.h:130
QByteArray read
Definition moc.h:125
qsizetype location
Definition moc.h:137
int revision
Definition moc.h:129
QByteArray bind
Definition moc.h:125
int relativeIndex
Definition moc.h:134
QByteArray designable
Definition moc.h:125
bool required
Definition moc.h:133
QByteArray stored
Definition moc.h:125
QByteArray name
Definition moc.h:125
QByteArray reset
Definition moc.h:125
QByteArray type
Definition moc.h:125
qsizetype index
Definition symbols.h:81
Symbols symbols
Definition symbols.h:78
QByteArray expandedMacro
Definition symbols.h:79
QByteArray array
Definition symbols.h:26
SubArray(const char *s)
Definition symbols.h:21
qsizetype len
Definition symbols.h:28
bool operator==(const SubArray &other) const
Definition symbols.h:29
qsizetype from
Definition symbols.h:27
SubArray()=default
SubArray(const QByteArray &a)
Definition symbols.h:20
SubArray(const QByteArray &a, qsizetype from, qsizetype len)
Definition symbols.h:22
QByteArray qualified
Definition moc.h:174
FunctionDef::Access access
Definition moc.h:175
QByteArray classname
Definition moc.h:173
qsizetype from
Definition symbols.h:70
QByteArrayView unquotedLexemView() const
Definition symbols.h:62
Symbol(int lineNum, Token token)
Definition symbols.h:48
operator SubArray() const
Definition symbols.h:64
QByteArrayView lexemView() const
Definition symbols.h:61
Token token
Definition symbols.h:58
void mergeStringLiteral(const Symbol &next)
bool operator==(const Symbol &o) const
Definition symbols.h:65
int lineNum
Definition symbols.h:57
Symbol()=default
Symbol(int lineNum, Token token, const QByteArray &lexem, qsizetype from, qsizetype len)
Definition symbols.h:53
QByteArray lexem() const
Definition symbols.h:59
QByteArray lex
Definition symbols.h:69
QByteArray unquotedLexem() const
Definition symbols.h:60
qsizetype len
Definition symbols.h:71
Symbol(int lineNum, Token token, const QByteArray &lexem)
Definition symbols.h:49
size_t qHash(const SubArray &key, size_t seed=0)
Definition symbols.h:39
Q_DECLARE_TYPEINFO(Symbol, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(SafeSymbols, Q_RELOCATABLE_TYPE)
QList< Symbol > Symbols
Definition symbols.h:75
#define FOR_ALL_TOKENS(F)
Definition token.h:11
Token PP_Token
Definition token.h:252