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 PREPROCESSOR_H
5#define PREPROCESSOR_H
6
7#include "parser.h"
8#include <qlist.h>
9#include <qset.h>
10#include <stdio.h>
11
12QT_BEGIN_NAMESPACE
13
14struct Macro
15{
16 Macro() : isFunction(false), isVariadic(false) {}
17 bool isFunction;
18 bool isVariadic;
19 Symbols arguments;
20 Symbols symbols;
21};
22
23typedef SubArray MacroName;
24typedef QHash<MacroName, Macro> Macros;
25
26class QFile;
27
28class Preprocessor : public Parser
29{
30public:
31 Preprocessor(){}
32 static bool preprocessOnly;
33 QList<QByteArray> frameworks;
34 QSet<QByteArray> preprocessedIncludes;
35 QHash<QByteArray, QByteArray> nonlocalIncludePathResolutionCache;
36 Macros macros;
37 QByteArray resolveInclude(const QByteArray &filename, const QByteArray &relativeTo);
38 Symbols preprocessed(const QByteArray &filename, QFile *device);
39
40 void parseDefineArguments(Macro *m);
41
42 void skipUntilEndif();
43 bool skipBranch();
44
45 void substituteUntilNewline(Symbols &substituted);
46 static Symbols macroExpandIdentifier(Preprocessor *that, SymbolStack &symbols, int lineNum, QByteArray *macroName);
47 static void macroExpand(Symbols *into, Preprocessor *that, const Symbols &toExpand,
48 qsizetype &index, int lineNum, bool one,
49 const QSet<QByteArray> &excludeSymbols = QSet<QByteArray>());
50
51 int evaluateCondition();
52
53 enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine };
54 static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp);
55
56 void setDebugIncludes(bool value);
57
58private:
59 void until(Token);
60
61 void preprocess(const QByteArray &filename, Symbols &preprocessed);
62 bool debugIncludes = false;
63};
64
65QT_END_NAMESPACE
66
67#endif // PREPROCESSOR_H
68

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

source code of qtbase/src/tools/moc/preprocessor.h