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