annotate generator/cppgenerator.cpp @ 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 cf8a415f3f32
children 17b5e13364b7 08c1ca7975ab
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 #include "cppgenerator.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "reporthandler.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
e78566595089 initial import
mandel
parents:
diff changeset
47 // ### There's a bug in Qt causing it to fail at normalizing signatures
e78566595089 initial import
mandel
parents:
diff changeset
48 // on the form FooBar<T> const&, which is the form the C++ parser uses
e78566595089 initial import
mandel
parents:
diff changeset
49 // for all types, so connections between Java and C++ with const& templates
e78566595089 initial import
mandel
parents:
diff changeset
50 // will fail. This is a work around which is only needed until that bug is fixed.
e78566595089 initial import
mandel
parents:
diff changeset
51 // Since Qt works correctly with const FooBar<T> &, we simply change the
e78566595089 initial import
mandel
parents:
diff changeset
52 // signature to that.
e78566595089 initial import
mandel
parents:
diff changeset
53 QString CppGenerator::fixNormalizedSignatureForQt(const QString &signature)
e78566595089 initial import
mandel
parents:
diff changeset
54 {
e78566595089 initial import
mandel
parents:
diff changeset
55 QString ret = signature;
e78566595089 initial import
mandel
parents:
diff changeset
56 if (signature.contains("<") && signature.endsWith("const&")) {
e78566595089 initial import
mandel
parents:
diff changeset
57 ret = "const "
e78566595089 initial import
mandel
parents:
diff changeset
58 + signature.mid(0, signature.size() - 6)
e78566595089 initial import
mandel
parents:
diff changeset
59 + "&";
e78566595089 initial import
mandel
parents:
diff changeset
60 }
e78566595089 initial import
mandel
parents:
diff changeset
61 return ret;
e78566595089 initial import
mandel
parents:
diff changeset
62 }
e78566595089 initial import
mandel
parents:
diff changeset
63
e78566595089 initial import
mandel
parents:
diff changeset
64 void CppGenerator::writeTypeInfo(QTextStream &s, const AbstractMetaType *type, Option options)
e78566595089 initial import
mandel
parents:
diff changeset
65 {
e78566595089 initial import
mandel
parents:
diff changeset
66 if ((options & OriginalTypeDescription) && !type->originalTypeDescription().isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
67 QString originalTypeDescription = type->originalTypeDescription();
e78566595089 initial import
mandel
parents:
diff changeset
68
e78566595089 initial import
mandel
parents:
diff changeset
69 if (options & NormalizeAndFixTypeSignature) {
e78566595089 initial import
mandel
parents:
diff changeset
70 originalTypeDescription = QMetaObject::normalizedSignature(originalTypeDescription.toLatin1().constData());
e78566595089 initial import
mandel
parents:
diff changeset
71 originalTypeDescription = fixNormalizedSignatureForQt(originalTypeDescription);
e78566595089 initial import
mandel
parents:
diff changeset
72 }
e78566595089 initial import
mandel
parents:
diff changeset
73
e78566595089 initial import
mandel
parents:
diff changeset
74 s << originalTypeDescription;
e78566595089 initial import
mandel
parents:
diff changeset
75 return;
e78566595089 initial import
mandel
parents:
diff changeset
76 }
e78566595089 initial import
mandel
parents:
diff changeset
77
e78566595089 initial import
mandel
parents:
diff changeset
78 if (type->isArray()) {
e78566595089 initial import
mandel
parents:
diff changeset
79 writeTypeInfo(s, type->arrayElementType(), options);
e78566595089 initial import
mandel
parents:
diff changeset
80 if (options & ArrayAsPointer) {
e78566595089 initial import
mandel
parents:
diff changeset
81 s << "*";
e78566595089 initial import
mandel
parents:
diff changeset
82 } else {
e78566595089 initial import
mandel
parents:
diff changeset
83 s << "[" << type->arrayElementCount() << "]";
e78566595089 initial import
mandel
parents:
diff changeset
84 }
e78566595089 initial import
mandel
parents:
diff changeset
85 return;
e78566595089 initial import
mandel
parents:
diff changeset
86 }
e78566595089 initial import
mandel
parents:
diff changeset
87
e78566595089 initial import
mandel
parents:
diff changeset
88 const TypeEntry *te = type->typeEntry();
e78566595089 initial import
mandel
parents:
diff changeset
89
e78566595089 initial import
mandel
parents:
diff changeset
90 if (type->isConstant() && !(options & ExcludeConst))
e78566595089 initial import
mandel
parents:
diff changeset
91 s << "const ";
e78566595089 initial import
mandel
parents:
diff changeset
92
e78566595089 initial import
mandel
parents:
diff changeset
93 if ((options & EnumAsInts) && (te->isEnum() || te->isFlags())) {
e78566595089 initial import
mandel
parents:
diff changeset
94 s << "int";
e78566595089 initial import
mandel
parents:
diff changeset
95 } else if (te->isFlags()) {
e78566595089 initial import
mandel
parents:
diff changeset
96 s << ((FlagsTypeEntry *) te)->originalName();
e78566595089 initial import
mandel
parents:
diff changeset
97 } else {
e78566595089 initial import
mandel
parents:
diff changeset
98 if (options & VirtualDispatch && te->name() == "QModelIndex")
e78566595089 initial import
mandel
parents:
diff changeset
99 s << "QModelIndexAccessor";
e78566595089 initial import
mandel
parents:
diff changeset
100 else
e78566595089 initial import
mandel
parents:
diff changeset
101 s << fixCppTypeName(te->qualifiedCppName());
e78566595089 initial import
mandel
parents:
diff changeset
102 }
e78566595089 initial import
mandel
parents:
diff changeset
103
e78566595089 initial import
mandel
parents:
diff changeset
104 if (type->instantiations().size() > 0
e78566595089 initial import
mandel
parents:
diff changeset
105 && (!type->isContainer()
e78566595089 initial import
mandel
parents:
diff changeset
106 || (static_cast<const ContainerTypeEntry *>(te))->type() != ContainerTypeEntry::StringListContainer)) {
e78566595089 initial import
mandel
parents:
diff changeset
107 s << '<';
e78566595089 initial import
mandel
parents:
diff changeset
108 QList<AbstractMetaType *> args = type->instantiations();
e78566595089 initial import
mandel
parents:
diff changeset
109 bool nested_template = false;
e78566595089 initial import
mandel
parents:
diff changeset
110 for (int i=0; i<args.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
111 if (i != 0)
e78566595089 initial import
mandel
parents:
diff changeset
112 s << ", ";
e78566595089 initial import
mandel
parents:
diff changeset
113 nested_template |= args.at(i)->isContainer();
e78566595089 initial import
mandel
parents:
diff changeset
114 writeTypeInfo(s, args.at(i));
e78566595089 initial import
mandel
parents:
diff changeset
115 }
e78566595089 initial import
mandel
parents:
diff changeset
116 if (nested_template)
e78566595089 initial import
mandel
parents:
diff changeset
117 s << ' ';
e78566595089 initial import
mandel
parents:
diff changeset
118 s << '>';
e78566595089 initial import
mandel
parents:
diff changeset
119 }
e78566595089 initial import
mandel
parents:
diff changeset
120
e78566595089 initial import
mandel
parents:
diff changeset
121 int actual_indirections = type->indirections();
e78566595089 initial import
mandel
parents:
diff changeset
122 // for getting C++ elements from array we want pointers even if elements are
e78566595089 initial import
mandel
parents:
diff changeset
123 // values because wrapper actually contains pointers
e78566595089 initial import
mandel
parents:
diff changeset
124 if ((options & ForcePointer) && actual_indirections == 0
e78566595089 initial import
mandel
parents:
diff changeset
125 && !type->isPrimitive() && !type->typeEntry()->isStructInD()
33
cf8a415f3f32 gui package is fully wrapped now. lots of fixes in the generator
eldar
parents: 1
diff changeset
126 && type->name() != "QModelIndex" && !type->isEnum())
1
e78566595089 initial import
mandel
parents:
diff changeset
127 actual_indirections = 1;
e78566595089 initial import
mandel
parents:
diff changeset
128
e78566595089 initial import
mandel
parents:
diff changeset
129 s << QString(actual_indirections, '*');
e78566595089 initial import
mandel
parents:
diff changeset
130
e78566595089 initial import
mandel
parents:
diff changeset
131 if (type->isReference() && !(options & ExcludeReference))
e78566595089 initial import
mandel
parents:
diff changeset
132 s << "&";
e78566595089 initial import
mandel
parents:
diff changeset
133
e78566595089 initial import
mandel
parents:
diff changeset
134 if (!(options & SkipName))
e78566595089 initial import
mandel
parents:
diff changeset
135 s << ' ';
e78566595089 initial import
mandel
parents:
diff changeset
136 }
e78566595089 initial import
mandel
parents:
diff changeset
137
e78566595089 initial import
mandel
parents:
diff changeset
138
e78566595089 initial import
mandel
parents:
diff changeset
139 void CppGenerator::writeFunctionArguments(QTextStream &s,
e78566595089 initial import
mandel
parents:
diff changeset
140 const AbstractMetaArgumentList &arguments,
e78566595089 initial import
mandel
parents:
diff changeset
141 Option option,
e78566595089 initial import
mandel
parents:
diff changeset
142 int numArguments)
e78566595089 initial import
mandel
parents:
diff changeset
143 {
e78566595089 initial import
mandel
parents:
diff changeset
144 if (numArguments < 0) numArguments = arguments.size();
e78566595089 initial import
mandel
parents:
diff changeset
145
e78566595089 initial import
mandel
parents:
diff changeset
146 for (int i=0; i<numArguments; ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
147 if (i != 0)
e78566595089 initial import
mandel
parents:
diff changeset
148 s << ", ";
e78566595089 initial import
mandel
parents:
diff changeset
149 AbstractMetaArgument *arg = arguments.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
150 writeTypeInfo(s, arg->type(), option);
e78566595089 initial import
mandel
parents:
diff changeset
151 if (!(option & SkipName))
e78566595089 initial import
mandel
parents:
diff changeset
152 s << " " << arg->indexedName();
e78566595089 initial import
mandel
parents:
diff changeset
153 if ((option & IncludeDefaultExpression) && !arg->originalDefaultValueExpression().isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
154 s << " = ";
e78566595089 initial import
mandel
parents:
diff changeset
155
e78566595089 initial import
mandel
parents:
diff changeset
156 QString expr = arg->originalDefaultValueExpression();
e78566595089 initial import
mandel
parents:
diff changeset
157 if (arg->type()->typeEntry()->isEnum() && expr.indexOf("::") < 0)
e78566595089 initial import
mandel
parents:
diff changeset
158 s << ((EnumTypeEntry *)arg->type()->typeEntry())->qualifier() << "::";
e78566595089 initial import
mandel
parents:
diff changeset
159
e78566595089 initial import
mandel
parents:
diff changeset
160 s << expr;
e78566595089 initial import
mandel
parents:
diff changeset
161 }
e78566595089 initial import
mandel
parents:
diff changeset
162 }
e78566595089 initial import
mandel
parents:
diff changeset
163 }
e78566595089 initial import
mandel
parents:
diff changeset
164
e78566595089 initial import
mandel
parents:
diff changeset
165 /*!
e78566595089 initial import
mandel
parents:
diff changeset
166 * Writes the function \a java_function signature to the textstream \a s.
e78566595089 initial import
mandel
parents:
diff changeset
167 *
e78566595089 initial import
mandel
parents:
diff changeset
168 * The \a name_prefix can be used to give the function name a prefix,
e78566595089 initial import
mandel
parents:
diff changeset
169 * like "__public_" or "__override_" and \a classname_prefix can
e78566595089 initial import
mandel
parents:
diff changeset
170 * be used to give the class name a prefix.
e78566595089 initial import
mandel
parents:
diff changeset
171 *
e78566595089 initial import
mandel
parents:
diff changeset
172 * The \a option flags can be used to tweak various parameters, such as
e78566595089 initial import
mandel
parents:
diff changeset
173 * showing static, original vs renamed name, underscores for space etc.
e78566595089 initial import
mandel
parents:
diff changeset
174 *
e78566595089 initial import
mandel
parents:
diff changeset
175 * The \a extra_arguments list is a list of extra arguments on the
e78566595089 initial import
mandel
parents:
diff changeset
176 * form "bool static_call".
e78566595089 initial import
mandel
parents:
diff changeset
177 */
e78566595089 initial import
mandel
parents:
diff changeset
178
e78566595089 initial import
mandel
parents:
diff changeset
179 void CppGenerator::writeFunctionSignature(QTextStream &s,
e78566595089 initial import
mandel
parents:
diff changeset
180 const AbstractMetaFunction *java_function,
e78566595089 initial import
mandel
parents:
diff changeset
181 const AbstractMetaClass *implementor,
e78566595089 initial import
mandel
parents:
diff changeset
182 const QString &name_prefix,
e78566595089 initial import
mandel
parents:
diff changeset
183 Option option,
e78566595089 initial import
mandel
parents:
diff changeset
184 const QString &classname_prefix,
e78566595089 initial import
mandel
parents:
diff changeset
185 const QStringList &extra_arguments,
e78566595089 initial import
mandel
parents:
diff changeset
186 int numArguments)
e78566595089 initial import
mandel
parents:
diff changeset
187 {
e78566595089 initial import
mandel
parents:
diff changeset
188 // ### remove the implementor
e78566595089 initial import
mandel
parents:
diff changeset
189 AbstractMetaType *function_type = java_function->type();
e78566595089 initial import
mandel
parents:
diff changeset
190
e78566595089 initial import
mandel
parents:
diff changeset
191 if (java_function->isStatic() && (option & ShowStatic))
e78566595089 initial import
mandel
parents:
diff changeset
192 s << "static ";
e78566595089 initial import
mandel
parents:
diff changeset
193
e78566595089 initial import
mandel
parents:
diff changeset
194 if ((option & SkipReturnType) == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
195 if (function_type) {
e78566595089 initial import
mandel
parents:
diff changeset
196 writeTypeInfo(s, function_type, option);
e78566595089 initial import
mandel
parents:
diff changeset
197 s << " ";
e78566595089 initial import
mandel
parents:
diff changeset
198 } else if (!java_function->isConstructor()) {
e78566595089 initial import
mandel
parents:
diff changeset
199 s << "void ";
e78566595089 initial import
mandel
parents:
diff changeset
200 }
e78566595089 initial import
mandel
parents:
diff changeset
201 }
e78566595089 initial import
mandel
parents:
diff changeset
202
e78566595089 initial import
mandel
parents:
diff changeset
203 if (implementor) {
e78566595089 initial import
mandel
parents:
diff changeset
204 if (classname_prefix.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
205 s << shellClassName(implementor) << "::";
e78566595089 initial import
mandel
parents:
diff changeset
206 else
e78566595089 initial import
mandel
parents:
diff changeset
207 s << classname_prefix << implementor->name() << "::";
e78566595089 initial import
mandel
parents:
diff changeset
208 }
e78566595089 initial import
mandel
parents:
diff changeset
209
e78566595089 initial import
mandel
parents:
diff changeset
210
e78566595089 initial import
mandel
parents:
diff changeset
211 QString function_name;
e78566595089 initial import
mandel
parents:
diff changeset
212 if (option & OriginalName)
e78566595089 initial import
mandel
parents:
diff changeset
213 function_name = java_function->originalName();
e78566595089 initial import
mandel
parents:
diff changeset
214 else
e78566595089 initial import
mandel
parents:
diff changeset
215 function_name = java_function->name();
e78566595089 initial import
mandel
parents:
diff changeset
216
e78566595089 initial import
mandel
parents:
diff changeset
217 if (option & UnderscoreSpaces)
e78566595089 initial import
mandel
parents:
diff changeset
218 function_name = function_name.replace(' ', '_');
e78566595089 initial import
mandel
parents:
diff changeset
219
e78566595089 initial import
mandel
parents:
diff changeset
220 if (java_function->isConstructor())
e78566595089 initial import
mandel
parents:
diff changeset
221 function_name = shellClassName(java_function->ownerClass());
e78566595089 initial import
mandel
parents:
diff changeset
222
e78566595089 initial import
mandel
parents:
diff changeset
223 s << name_prefix << function_name;
e78566595089 initial import
mandel
parents:
diff changeset
224
e78566595089 initial import
mandel
parents:
diff changeset
225 if (java_function->attributes() & AbstractMetaAttributes::SetterFunction)
e78566595089 initial import
mandel
parents:
diff changeset
226 s << "_setter";
e78566595089 initial import
mandel
parents:
diff changeset
227 else if (java_function->attributes() & AbstractMetaAttributes::GetterFunction)
e78566595089 initial import
mandel
parents:
diff changeset
228 s << "_getter";
e78566595089 initial import
mandel
parents:
diff changeset
229
e78566595089 initial import
mandel
parents:
diff changeset
230 s << "(";
e78566595089 initial import
mandel
parents:
diff changeset
231 const AbstractMetaClass *owner = java_function->ownerClass();
e78566595089 initial import
mandel
parents:
diff changeset
232
e78566595089 initial import
mandel
parents:
diff changeset
233 bool has_d_ptr = java_function->isConstructor() && owner && (owner->hasVirtualFunctions()/* || owner->typeEntry()->isObject()*/ );
e78566595089 initial import
mandel
parents:
diff changeset
234 const AbstractMetaArgumentList arg_list = java_function->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
235 if (has_d_ptr) {
e78566595089 initial import
mandel
parents:
diff changeset
236 s << "void *d_ptr";
e78566595089 initial import
mandel
parents:
diff changeset
237 if (arg_list.size() > 0)
e78566595089 initial import
mandel
parents:
diff changeset
238 s << ", ";
e78566595089 initial import
mandel
parents:
diff changeset
239 }
e78566595089 initial import
mandel
parents:
diff changeset
240 writeFunctionArguments(s, arg_list, option, numArguments);
e78566595089 initial import
mandel
parents:
diff changeset
241
e78566595089 initial import
mandel
parents:
diff changeset
242 // The extra arguments...
e78566595089 initial import
mandel
parents:
diff changeset
243 for (int i=0; i<extra_arguments.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
244 if (i > 0 || java_function->arguments().size() != 0)
e78566595089 initial import
mandel
parents:
diff changeset
245 s << ", ";
e78566595089 initial import
mandel
parents:
diff changeset
246 s << extra_arguments.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
247 }
e78566595089 initial import
mandel
parents:
diff changeset
248
e78566595089 initial import
mandel
parents:
diff changeset
249 s << ")";
e78566595089 initial import
mandel
parents:
diff changeset
250 if (java_function->isConstant())
e78566595089 initial import
mandel
parents:
diff changeset
251 s << " const";
e78566595089 initial import
mandel
parents:
diff changeset
252 }