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