1 /***************************************************************************
2 **
3 ** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the utilities of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #ifndef CODEGENERATOR_H
30 #define CODEGENERATOR_H
31 
32 #include "specparser.h"
33 
34 class QTextStream;
35 
36 class CodeGenerator
37 {
38 public:
39     explicit CodeGenerator();
40 
setParser(SpecParser * parser)41     void setParser(SpecParser *parser) {m_parser = parser;}
42 
43     void generateCoreClasses(const QString &baseFileName) const;
44 
45     void generateExtensionClasses(const QString &baseFileName) const;
46 
47 private:
48     // Generic support
49     enum ClassVisibility {
50         Public,
51         Private
52     };
53 
54     enum ClassComponent {
55         Declaration = 0,
56         Definition
57     };
58 
59     bool isLegacyVersion(Version v) const;
60     bool versionHasProfiles(Version v) const;
61 
62     FunctionCollection functionCollection( const VersionProfile& classVersionProfile ) const;
63 
64     void writePreamble(const QString &baseFileName, QTextStream &stream, const QString replacement = QString()) const;
65     void writePostamble(const QString &baseFileName, QTextStream &stream) const;
66 
67     QString passByType(const Argument &arg) const;
68     QString safeArgumentName(const QString& arg) const;
69 
70     // Core functionality support
71     QString coreClassFileName(const VersionProfile &versionProfile,
72                               const QString& fileExtension) const;
73     void writeCoreHelperClasses(const QString &fileName, ClassComponent component) const;
74     void writeCoreClasses(const QString &baseFileName) const;
75 
76     void writeCoreFactoryHeader(const QString &fileName) const;
77     void writeCoreFactoryImplementation(const QString &fileName) const;
78 
79     QString generateClassName(const VersionProfile &classVersion, ClassVisibility visibility = Public) const;
80 
81     void writeBackendClassDeclaration(QTextStream &stream,
82                                       const VersionProfile &versionProfile,
83                                       const QString &baseClass) const;
84     void writeBackendClassImplementation(QTextStream &stream,
85                                          const VersionProfile &versionProfile,
86                                          const QString &baseClass) const;
87 
88     void writePublicClassDeclaration(const QString &baseFileName,
89                                      const VersionProfile &versionProfile,
90                                      const QString &baseClass) const;
91     void writePublicClassImplementation(const QString &baseFileName,
92                                         const VersionProfile &versionProfile,
93                                         const QString& baseClass) const;
94 
95     void writeClassFunctionDeclarations(QTextStream &stream,
96                                         const FunctionCollection &functionSets,
97                                         ClassVisibility visibility) const;
98 
99     void writeFunctionDeclaration(QTextStream &stream, const Function &f, ClassVisibility visibility) const;
100 
101     void writeClassInlineFunctions(QTextStream &stream,
102                                    const QString &className,
103                                    const FunctionCollection &functionSet) const;
104 
105     void writeInlineFunction(QTextStream &stream, const QString &className,
106                              const QString &backendVar, const Function &f) const;
107 
108     void writeEntryPointResolutionCode(QTextStream &stream,
109                                        const FunctionCollection &functionSet) const;
110 
111     void writeEntryPointResolutionStatement(QTextStream &stream, const Function &f,
112                                             const QString &prefix = QString(), bool useGetProcAddress = false) const;
113 
114     QList<VersionProfile> backendsForFunctionCollection(const FunctionCollection &functionSet) const;
115     QString backendClassName(const VersionProfile &v) const;
116     QString backendVariableName(const VersionProfile &v) const;
117     void writeBackendVariableDeclarations(QTextStream &stream, const QList<VersionProfile> &backends) const;
118 
119 
120     // Extension class support
121     void writeExtensionHeader(const QString &fileName) const;
122     void writeExtensionImplementation(const QString &fileName) const;
123 
124     void writeExtensionClassDeclaration(QTextStream &stream,
125                                         const QString &extension,
126                                         ClassVisibility visibility = Public) const;
127     void writeExtensionClassImplementation(QTextStream &stream, const QString &extension) const;
128 
129     QString generateExtensionClassName(const QString &extension, ClassVisibility visibility = Public) const;
130     void writeExtensionInlineFunction(QTextStream &stream, const QString &className, const Function &f) const;
131 
132     SpecParser *m_parser;
133     mutable QMap<QString, int> m_extensionIds;
134 };
135 
136 #endif // CODEGENERATOR_H
137