annotate generator/generator.h @ 282:256ab6cb8e85

Signals look-up andNew syntax for connect. The old one will not work from now on. This will allow for the signals overload. Although changes are done for both D1 and D2 versions, D1 won't work because of compiler bugs. I am tired of waiting for fixes.
author eldar
date Fri, 16 Oct 2009 02:43:59 +0000
parents 49bfc86ff583
children 9784459f0750
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /****************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
2 **
e78566595089 initial import
mandel
parents:
diff changeset
3 ** Copyright (C) 1992-2008 Nokia. All rights reserved.
e78566595089 initial import
mandel
parents:
diff changeset
4 **
e78566595089 initial import
mandel
parents:
diff changeset
5 ** This file is part of Qt Jambi.
e78566595089 initial import
mandel
parents:
diff changeset
6 **
e78566595089 initial import
mandel
parents:
diff changeset
7 ** * Commercial Usage
e78566595089 initial import
mandel
parents:
diff changeset
8 * Licensees holding valid Qt Commercial licenses may use this file in
e78566595089 initial import
mandel
parents:
diff changeset
9 * accordance with the Qt Commercial License Agreement provided with the
e78566595089 initial import
mandel
parents:
diff changeset
10 * Software or, alternatively, in accordance with the terms contained in
e78566595089 initial import
mandel
parents:
diff changeset
11 * a written agreement between you and Nokia.
e78566595089 initial import
mandel
parents:
diff changeset
12 *
e78566595089 initial import
mandel
parents:
diff changeset
13 *
e78566595089 initial import
mandel
parents:
diff changeset
14 * GNU General Public License Usage
e78566595089 initial import
mandel
parents:
diff changeset
15 * Alternatively, this file may be used under the terms of the GNU
e78566595089 initial import
mandel
parents:
diff changeset
16 * General Public License versions 2.0 or 3.0 as published by the Free
e78566595089 initial import
mandel
parents:
diff changeset
17 * Software Foundation and appearing in the file LICENSE.GPL included in
e78566595089 initial import
mandel
parents:
diff changeset
18 * the packaging of this file. Please review the following information
e78566595089 initial import
mandel
parents:
diff changeset
19 * to ensure GNU General Public Licensing requirements will be met:
e78566595089 initial import
mandel
parents:
diff changeset
20 * http://www.fsf.org/licensing/licenses/info/GPLv2.html and
e78566595089 initial import
mandel
parents:
diff changeset
21 * http://www.gnu.org/copyleft/gpl.html. In addition, as a special
e78566595089 initial import
mandel
parents:
diff changeset
22 * exception, Nokia gives you certain additional rights. These rights
e78566595089 initial import
mandel
parents:
diff changeset
23 * are described in the Nokia Qt GPL Exception version 1.2, included in
e78566595089 initial import
mandel
parents:
diff changeset
24 * the file GPL_EXCEPTION.txt in this package.
e78566595089 initial import
mandel
parents:
diff changeset
25 *
e78566595089 initial import
mandel
parents:
diff changeset
26 * Qt for Windows(R) Licensees
e78566595089 initial import
mandel
parents:
diff changeset
27 * As a special exception, Nokia, as the sole copyright holder for Qt
e78566595089 initial import
mandel
parents:
diff changeset
28 * Designer, grants users of the Qt/Eclipse Integration plug-in the
e78566595089 initial import
mandel
parents:
diff changeset
29 * right for the Qt/Eclipse Integration to link to functionality
e78566595089 initial import
mandel
parents:
diff changeset
30 * provided by Qt Designer and its related libraries.
e78566595089 initial import
mandel
parents:
diff changeset
31 *
e78566595089 initial import
mandel
parents:
diff changeset
32 *
e78566595089 initial import
mandel
parents:
diff changeset
33 * If you are unsure which license is appropriate for your use, please
e78566595089 initial import
mandel
parents:
diff changeset
34 * contact the sales department at qt-sales@nokia.com.
e78566595089 initial import
mandel
parents:
diff changeset
35
e78566595089 initial import
mandel
parents:
diff changeset
36 **
e78566595089 initial import
mandel
parents:
diff changeset
37 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
e78566595089 initial import
mandel
parents:
diff changeset
38 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e78566595089 initial import
mandel
parents:
diff changeset
39 **
e78566595089 initial import
mandel
parents:
diff changeset
40 ****************************************************************************/
e78566595089 initial import
mandel
parents:
diff changeset
41
e78566595089 initial import
mandel
parents:
diff changeset
42 #ifndef GENERATOR_H
e78566595089 initial import
mandel
parents:
diff changeset
43 #define GENERATOR_H
e78566595089 initial import
mandel
parents:
diff changeset
44
e78566595089 initial import
mandel
parents:
diff changeset
45 #include "metajava.h"
e78566595089 initial import
mandel
parents:
diff changeset
46 #include "typesystem.h"
e78566595089 initial import
mandel
parents:
diff changeset
47
e78566595089 initial import
mandel
parents:
diff changeset
48 #include "codemodel.h"
e78566595089 initial import
mandel
parents:
diff changeset
49
e78566595089 initial import
mandel
parents:
diff changeset
50 #include <QObject>
e78566595089 initial import
mandel
parents:
diff changeset
51 #include <QFile>
e78566595089 initial import
mandel
parents:
diff changeset
52
e78566595089 initial import
mandel
parents:
diff changeset
53 extern bool cpp_shared;
e78566595089 initial import
mandel
parents:
diff changeset
54 extern bool dPhobos;
e78566595089 initial import
mandel
parents:
diff changeset
55 extern int dVersion;
e78566595089 initial import
mandel
parents:
diff changeset
56
e78566595089 initial import
mandel
parents:
diff changeset
57 class Generator : public QObject
e78566595089 initial import
mandel
parents:
diff changeset
58 {
e78566595089 initial import
mandel
parents:
diff changeset
59 Q_OBJECT
e78566595089 initial import
mandel
parents:
diff changeset
60
e78566595089 initial import
mandel
parents:
diff changeset
61 Q_PROPERTY(QString outputDirectory READ outputDirectory WRITE setOutputDirectory);
e78566595089 initial import
mandel
parents:
diff changeset
62
e78566595089 initial import
mandel
parents:
diff changeset
63 public:
e78566595089 initial import
mandel
parents:
diff changeset
64 enum Option {
e78566595089 initial import
mandel
parents:
diff changeset
65 NoOption = 0x00000000,
e78566595089 initial import
mandel
parents:
diff changeset
66 BoxedPrimitive = 0x00000001,
e78566595089 initial import
mandel
parents:
diff changeset
67 ExcludeConst = 0x00000002,
e78566595089 initial import
mandel
parents:
diff changeset
68 ExcludeReference = 0x00000004,
e78566595089 initial import
mandel
parents:
diff changeset
69 UseNativeIds = 0x00000008,
e78566595089 initial import
mandel
parents:
diff changeset
70
e78566595089 initial import
mandel
parents:
diff changeset
71 EnumAsInts = 0x00000010,
e78566595089 initial import
mandel
parents:
diff changeset
72 SkipName = 0x00000020,
e78566595089 initial import
mandel
parents:
diff changeset
73 NoCasts = 0x00000040,
e78566595089 initial import
mandel
parents:
diff changeset
74 SkipReturnType = 0x00000080,
e78566595089 initial import
mandel
parents:
diff changeset
75 OriginalName = 0x00000100,
e78566595089 initial import
mandel
parents:
diff changeset
76 ShowStatic = 0x00000200,
e78566595089 initial import
mandel
parents:
diff changeset
77 UnderscoreSpaces = 0x00000400,
e78566595089 initial import
mandel
parents:
diff changeset
78 ForceEnumCast = 0x00000800,
e78566595089 initial import
mandel
parents:
diff changeset
79 ArrayAsPointer = 0x00001000,
e78566595089 initial import
mandel
parents:
diff changeset
80 VirtualCall = 0x00002000,
e78566595089 initial import
mandel
parents:
diff changeset
81 SkipTemplateParameters = 0x00004000,
e78566595089 initial import
mandel
parents:
diff changeset
82 SkipAttributes = 0x00008000,
e78566595089 initial import
mandel
parents:
diff changeset
83 OriginalTypeDescription = 0x00010000,
e78566595089 initial import
mandel
parents:
diff changeset
84 SkipRemovedArguments = 0x00020000,
e78566595089 initial import
mandel
parents:
diff changeset
85 IncludeDefaultExpression = 0x00040000,
e78566595089 initial import
mandel
parents:
diff changeset
86 NoReturnStatement = 0x00080000,
e78566595089 initial import
mandel
parents:
diff changeset
87 NoBlockedSlot = 0x00100000,
e78566595089 initial import
mandel
parents:
diff changeset
88 NormalizeAndFixTypeSignature = 0x00200000,
e78566595089 initial import
mandel
parents:
diff changeset
89 SuperCall = 0x00400000,
e78566595089 initial import
mandel
parents:
diff changeset
90 GlobalRefJObject = 0x00800000,
e78566595089 initial import
mandel
parents:
diff changeset
91 ExternC = 0x01000000,
e78566595089 initial import
mandel
parents:
diff changeset
92 VirtualDispatch = 0x02000000,
e78566595089 initial import
mandel
parents:
diff changeset
93 ForcePointer = 0x10000000,
e78566595089 initial import
mandel
parents:
diff changeset
94
e78566595089 initial import
mandel
parents:
diff changeset
95 ForceValueType = ExcludeReference | ExcludeConst
e78566595089 initial import
mandel
parents:
diff changeset
96 };
e78566595089 initial import
mandel
parents:
diff changeset
97
e78566595089 initial import
mandel
parents:
diff changeset
98 Generator();
e78566595089 initial import
mandel
parents:
diff changeset
99
e78566595089 initial import
mandel
parents:
diff changeset
100 void setClasses(const AbstractMetaClassList &classes) { m_classes = classes; }
e78566595089 initial import
mandel
parents:
diff changeset
101 AbstractMetaClassList classes() const { return m_classes; }
e78566595089 initial import
mandel
parents:
diff changeset
102
e78566595089 initial import
mandel
parents:
diff changeset
103 QString outputDirectory() const { return m_out_dir; }
e78566595089 initial import
mandel
parents:
diff changeset
104 void setOutputDirectory(const QString &outDir) { m_out_dir = outDir; }
e78566595089 initial import
mandel
parents:
diff changeset
105 virtual void generate();
e78566595089 initial import
mandel
parents:
diff changeset
106 void printClasses();
e78566595089 initial import
mandel
parents:
diff changeset
107
e78566595089 initial import
mandel
parents:
diff changeset
108 int numGenerated() { return m_num_generated; }
e78566595089 initial import
mandel
parents:
diff changeset
109 int numGeneratedAndWritten() { return m_num_generated_written; }
e78566595089 initial import
mandel
parents:
diff changeset
110
e78566595089 initial import
mandel
parents:
diff changeset
111 virtual bool shouldGenerate(const AbstractMetaClass *) const { return true; }
e78566595089 initial import
mandel
parents:
diff changeset
112 virtual QString subDirectoryForClass(const AbstractMetaClass *java_class) const;
e78566595089 initial import
mandel
parents:
diff changeset
113 virtual QString fileNameForClass(const AbstractMetaClass *java_class) const;
e78566595089 initial import
mandel
parents:
diff changeset
114 virtual void write(QTextStream &s, const AbstractMetaClass *java_class);
e78566595089 initial import
mandel
parents:
diff changeset
115
e78566595089 initial import
mandel
parents:
diff changeset
116 bool hasDefaultConstructor(const AbstractMetaType *type);
e78566595089 initial import
mandel
parents:
diff changeset
117
e78566595089 initial import
mandel
parents:
diff changeset
118 protected:
e78566595089 initial import
mandel
parents:
diff changeset
119 void verifyDirectoryFor(const QFile &file);
e78566595089 initial import
mandel
parents:
diff changeset
120
e78566595089 initial import
mandel
parents:
diff changeset
121 AbstractMetaClassList m_classes;
e78566595089 initial import
mandel
parents:
diff changeset
122 int m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
123 int m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
124 QString m_out_dir;
e78566595089 initial import
mandel
parents:
diff changeset
125 };
e78566595089 initial import
mandel
parents:
diff changeset
126
e78566595089 initial import
mandel
parents:
diff changeset
127 class Indentor {
e78566595089 initial import
mandel
parents:
diff changeset
128 public:
e78566595089 initial import
mandel
parents:
diff changeset
129 Indentor():
e78566595089 initial import
mandel
parents:
diff changeset
130 indent(0)
e78566595089 initial import
mandel
parents:
diff changeset
131 {}
e78566595089 initial import
mandel
parents:
diff changeset
132 int indent;
e78566595089 initial import
mandel
parents:
diff changeset
133 };
e78566595089 initial import
mandel
parents:
diff changeset
134
e78566595089 initial import
mandel
parents:
diff changeset
135 class Indentation {
e78566595089 initial import
mandel
parents:
diff changeset
136 public:
e78566595089 initial import
mandel
parents:
diff changeset
137 Indentation(Indentor &indentor):
e78566595089 initial import
mandel
parents:
diff changeset
138 indentor(indentor)
e78566595089 initial import
mandel
parents:
diff changeset
139 {
e78566595089 initial import
mandel
parents:
diff changeset
140 indentor.indent++;
e78566595089 initial import
mandel
parents:
diff changeset
141 }
e78566595089 initial import
mandel
parents:
diff changeset
142 ~Indentation()
e78566595089 initial import
mandel
parents:
diff changeset
143 {
e78566595089 initial import
mandel
parents:
diff changeset
144 indentor.indent--;
e78566595089 initial import
mandel
parents:
diff changeset
145 }
e78566595089 initial import
mandel
parents:
diff changeset
146
e78566595089 initial import
mandel
parents:
diff changeset
147 private:
e78566595089 initial import
mandel
parents:
diff changeset
148 Indentor &indentor;
e78566595089 initial import
mandel
parents:
diff changeset
149 };
e78566595089 initial import
mandel
parents:
diff changeset
150
e78566595089 initial import
mandel
parents:
diff changeset
151 inline QTextStream &operator <<(QTextStream &s, const Indentor &indentor)
e78566595089 initial import
mandel
parents:
diff changeset
152 {
e78566595089 initial import
mandel
parents:
diff changeset
153 for (int i=0; i<indentor.indent; ++i)
e78566595089 initial import
mandel
parents:
diff changeset
154 s << " ";
e78566595089 initial import
mandel
parents:
diff changeset
155 return s;
e78566595089 initial import
mandel
parents:
diff changeset
156 }
e78566595089 initial import
mandel
parents:
diff changeset
157
e78566595089 initial import
mandel
parents:
diff changeset
158 inline QString signalExternName(const AbstractMetaClass *cls, const AbstractMetaFunction* signal)
e78566595089 initial import
mandel
parents:
diff changeset
159 {
e78566595089 initial import
mandel
parents:
diff changeset
160 return "qtd_" + cls->name() + "_" + signal->name();
e78566595089 initial import
mandel
parents:
diff changeset
161 }
e78566595089 initial import
mandel
parents:
diff changeset
162
270
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
163 enum ConversionFunction
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
164 {
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
165 FromCpp,
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
166 ToCpp
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
167 };
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
168
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
169 inline QString cppContainerConversionName(const AbstractMetaClass *cls, const AbstractMetaType *type, ConversionFunction func)
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 1
diff changeset
170 {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 1
diff changeset
171 QString package = cls->package().replace(".", "_");
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 1
diff changeset
172 const TypeEntry *te = type->instantiations().first()->typeEntry();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 1
diff changeset
173
270
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
174 QString word;
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
175 if (func == FromCpp)
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
176 word = "_fromcpp_";
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
177 else
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
178 word = "_tocpp_";
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
179
49bfc86ff583 true emit of Qt signals.
eldar
parents: 253
diff changeset
180 return "qtd_" + package + "_" + te->targetLangName() + word + type->typeEntry()->qualifiedCppName();
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 1
diff changeset
181 }
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 1
diff changeset
182
1
e78566595089 initial import
mandel
parents:
diff changeset
183 bool notWrappedYet(const AbstractMetaFunction *java_function);
e78566595089 initial import
mandel
parents:
diff changeset
184 bool isLinearContainer(const ContainerTypeEntry *type);
253
073b9153ed8a Rev. 264 done right.
maxter
parents: 167
diff changeset
185 AbstractMetaFunctionList signalFunctions(const AbstractMetaClass *cls, bool includeBase = true);
1
e78566595089 initial import
mandel
parents:
diff changeset
186
e78566595089 initial import
mandel
parents:
diff changeset
187 #endif // GENERATOR_H