1 /* 2 SPDX-License-Identifier: GPL-2.0-or-later 3 4 SPDX-FileCopyrightText: 2003 Brian Thomas 5 <brian.thomas@gsfc.nasa.gov> 6 SPDX-FileCopyrightText: 2004-2021 Umbrello UML Modeller Authors 7 <umbrello-devel@kde.org> 8 */ 9 10 #ifndef CPPWRITER_H 11 #define CPPWRITER_H 12 13 #include "simplecodegenerator.h" 14 #include "cppcodegenerationpolicy.h" 15 #include "umloperationlist.h" 16 #include "umlattributelist.h" 17 #include "umlassociationlist.h" 18 19 class QFile; 20 21 /** 22 * Class CppWriter is a code generator for UMLClassifier objects. 23 * Create an instance of this class, and feed it a UMLClassifier when 24 * calling writeClass and it will generate both a header (.h) and 25 * source (.cpp) file for that classifier. 26 * Note: 27 * This is the "old" code generator that does not support code editing 28 * in the Modeller but uses significantly less file space because the 29 * source code is not replicated in the XMI file. 30 */ 31 class CppWriter : public SimpleCodeGenerator 32 { 33 public: 34 35 CppWriter(); 36 virtual ~CppWriter(); 37 38 virtual void writeClass(UMLClassifier *c); 39 40 virtual Uml::ProgrammingLanguage::Enum language() const; 41 42 QStringList defaultDatatypes() const; 43 44 virtual QStringList reservedKeywords() const; 45 46 private: 47 void writeIncludes(UMLClassifier *c, QTextStream &cpp); 48 void writeClassDecl(UMLClassifier *c, QTextStream &cpp); 49 void writeConstructorDecls(QTextStream &h); 50 void writeConstructorMethods(UMLClassifier * c, QTextStream &cpp); 51 52 // /** 53 // * Write all field declarations, for both attributes and associations for the 54 // * given permitted scope. 55 // */ 56 // void writeFieldDecl(UMLClassifier *c, Uml::Visibility::Enum permitScope, QTextStream &stream); 57 58 // /** 59 // * Write all method declarations, for attributes and associations 60 // * for the given permitted scope. 61 // */ 62 // void writeAccessorMethodDecl(UMLClassifier *c, Uml::Visibility::Enum permitScope, QTextStream &stream); 63 64 void writeOperations(UMLClassifier *c, bool isHeaderMethod, Uml::Visibility::Enum permitScope, QTextStream &cpp); 65 void writeOperations(UMLClassifier *c, UMLOperationList &oplist, bool isHeaderMethod, QTextStream &cpp); 66 67 // /** 68 // * Write all attributes for a given class. 69 // * @param c the class for which we are generating code 70 // * @param j the stream associated with the output file 71 // */ 72 // void writeAttributes(UMLClassifier *c, QTextStream &j); 73 74 void writeAttributeDecls(UMLClassifier *c, Uml::Visibility::Enum visibility, bool writeStatic, QTextStream &stream); 75 76 void writeHeaderFieldDecl(UMLClassifier *c, Uml::Visibility::Enum permitVisibility, QTextStream &stream); 77 78 void writeHeaderAttributeAccessorMethods(UMLClassifier *c, Uml::Visibility::Enum visibility, bool writeStatic, QTextStream &stream); 79 80 void writeHeaderAttributeAccessorMethodDecls(UMLClassifier *c, Uml::Visibility::Enum permitVisibility, QTextStream &stream); 81 void writeHeaderAccessorMethodDecl(UMLClassifier *c, Uml::Visibility::Enum permitScope, QTextStream &stream); 82 83 void writeAssociationDecls(UMLAssociationList associations, Uml::Visibility::Enum permit, Uml::ID::Type id, QTextStream &stream); 84 85 void writeAssociationRoleDecl(QString fieldClassName, QString roleName, QString multi, 86 QString doc, QTextStream &stream); 87 88 void writeAttributeMethods(UMLAttributeList attribs, Uml::Visibility::Enum visib, bool isHeaderMethod, 89 bool isStatic, 90 bool writeMethodBody, QTextStream &stream); 91 92 void writeAssociationMethods(UMLAssociationList associations, Uml::Visibility::Enum permitVisib, 93 bool isHeaderMethod, 94 bool writeMethodBody, bool writePointerVar, Uml::ID::Type id, QTextStream &stream); 95 96 void writeAssociationRoleMethod(const QString &fieldClassName, bool isHeaderMethod, bool writeMethodBody, 97 const QString &roleName, const QString &multi, 98 const QString &description, Uml::Changeability::Enum change, 99 QTextStream &stream); 100 101 void writeSingleAttributeAccessorMethods( 102 const QString &fieldClassName, const QString &Name, 103 const QString &fieldName, const QString &description, 104 Uml::Changeability::Enum change, 105 bool isHeaderMethod, 106 bool isStatic, bool writeMethodBody, QTextStream &cpp); 107 108 void writeVectorAttributeAccessorMethods( 109 const QString &fieldClassName, const QString &fieldVarName, 110 const QString &fieldName, const QString &description, 111 Uml::Changeability::Enum change, 112 bool isHeaderMethod, 113 bool writeMethodBody, 114 QTextStream &stream); 115 116 void writeComment(const QString &text, const QString &indent, QTextStream &cpp); 117 void writeDocumentation(QString header, QString body, QString end, QTextStream &cpp); 118 119 void writeHeaderFile(UMLClassifier *c, QFile &file); 120 void writeSourceFile(UMLClassifier *c, QFile &file); 121 122 void printTextAsSeparateLinesWithIndent (const QString &text, const QString &indent, 123 QTextStream &stream); 124 125 void printAssociationIncludeDecl(UMLAssociationList list, Uml::ID::Type this_id, QTextStream &stream); 126 127 void writeInitAttributeMethod(UMLClassifier * c, QTextStream &stream); 128 void writeInitAttributeDecl(UMLClassifier * c, QTextStream &stream); 129 void writeDataTypes(UMLClassifier *c, Uml::Visibility::Enum permitScope, QTextStream &stream); 130 131 QString umlObjectName(UMLObject *obj); 132 133 QString fixTypeName(const QString &string); 134 QString fixInitialStringDeclValue(const QString &value, const QString &type); 135 136 QString getAttributeVariableName(UMLAttribute *at); 137 QString getAttributeMethodBaseName(const QString &fieldName); 138 139 void writeBlankLine(QTextStream &stream); 140 141 CPPCodeGenerationPolicy *policyExt(); 142 143 QString VECTOR_METHOD_APPEND; 144 QString VECTOR_METHOD_REMOVE; 145 QString VECTOR_METHOD_INIT; 146 QString OBJECT_METHOD_INIT; 147 148 /** 149 * Create association methods for class attributes/associations/operations as inline decl in header. 150 */ 151 bool INLINE_ASSOCIATION_METHODS; 152 153 QStringList ObjectFieldVariables; 154 QStringList VectorFieldVariables; 155 bool m_stringIncludeRequired; 156 }; 157 158 159 #endif // CPPWRITER_H 160