annotate generator/metainfogenerator.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 1349940724eb
children
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 "metainfogenerator.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "reporthandler.h"
e78566595089 initial import
mandel
parents:
diff changeset
44 #include "cppimplgenerator.h"
e78566595089 initial import
mandel
parents:
diff changeset
45 #include "fileout.h"
e78566595089 initial import
mandel
parents:
diff changeset
46
e78566595089 initial import
mandel
parents:
diff changeset
47 #include <QDir>
e78566595089 initial import
mandel
parents:
diff changeset
48 #include <QMetaType>
e78566595089 initial import
mandel
parents:
diff changeset
49
e78566595089 initial import
mandel
parents:
diff changeset
50 MetaInfoGenerator::MetaInfoGenerator(PriGenerator *pri):
e78566595089 initial import
mandel
parents:
diff changeset
51 DGenerator(),
e78566595089 initial import
mandel
parents:
diff changeset
52 priGenerator(pri)
e78566595089 initial import
mandel
parents:
diff changeset
53
e78566595089 initial import
mandel
parents:
diff changeset
54 {
e78566595089 initial import
mandel
parents:
diff changeset
55 setFilenameStub("metainfo");
e78566595089 initial import
mandel
parents:
diff changeset
56 }
e78566595089 initial import
mandel
parents:
diff changeset
57
e78566595089 initial import
mandel
parents:
diff changeset
58 QString MetaInfoGenerator::subDirectoryForPackage(const QString &package, OutputDirectoryType type) const
e78566595089 initial import
mandel
parents:
diff changeset
59 {
e78566595089 initial import
mandel
parents:
diff changeset
60 switch (type) {
e78566595089 initial import
mandel
parents:
diff changeset
61 case CppDirectory:
e78566595089 initial import
mandel
parents:
diff changeset
62 return "cpp/" + QString(package).replace(".", "_") + "/";
e78566595089 initial import
mandel
parents:
diff changeset
63 case JavaDirectory:
e78566595089 initial import
mandel
parents:
diff changeset
64 return QString(package).replace(".", "/");
e78566595089 initial import
mandel
parents:
diff changeset
65 default:
e78566595089 initial import
mandel
parents:
diff changeset
66 return QString(); // kill nonsense warnings
e78566595089 initial import
mandel
parents:
diff changeset
67 }
e78566595089 initial import
mandel
parents:
diff changeset
68 }
e78566595089 initial import
mandel
parents:
diff changeset
69
e78566595089 initial import
mandel
parents:
diff changeset
70 QString MetaInfoGenerator::subDirectoryForClass(const AbstractMetaClass *cls, OutputDirectoryType type) const
e78566595089 initial import
mandel
parents:
diff changeset
71 {
e78566595089 initial import
mandel
parents:
diff changeset
72 Q_ASSERT(cls);
e78566595089 initial import
mandel
parents:
diff changeset
73 return subDirectoryForPackage(cls->package(), type);
e78566595089 initial import
mandel
parents:
diff changeset
74 }
e78566595089 initial import
mandel
parents:
diff changeset
75
e78566595089 initial import
mandel
parents:
diff changeset
76 void MetaInfoGenerator::generate()
e78566595089 initial import
mandel
parents:
diff changeset
77 {
e78566595089 initial import
mandel
parents:
diff changeset
78 buildSkipList();
e78566595089 initial import
mandel
parents:
diff changeset
79 writeCppFile();
e78566595089 initial import
mandel
parents:
diff changeset
80 writeHeaderFile();
e78566595089 initial import
mandel
parents:
diff changeset
81 writeLibraryInitializers();
e78566595089 initial import
mandel
parents:
diff changeset
82 }
e78566595089 initial import
mandel
parents:
diff changeset
83
e78566595089 initial import
mandel
parents:
diff changeset
84 bool MetaInfoGenerator::shouldGenerate(const TypeEntry *entry) const
e78566595089 initial import
mandel
parents:
diff changeset
85 {
e78566595089 initial import
mandel
parents:
diff changeset
86 return entry != 0 && !entry->isNamespace() && !entry->isEnum() && (entry->codeGeneration() & TypeEntry::GenerateCpp);
e78566595089 initial import
mandel
parents:
diff changeset
87 }
e78566595089 initial import
mandel
parents:
diff changeset
88
e78566595089 initial import
mandel
parents:
diff changeset
89 bool MetaInfoGenerator::shouldGenerate(const AbstractMetaClass *cls) const
e78566595089 initial import
mandel
parents:
diff changeset
90 {
e78566595089 initial import
mandel
parents:
diff changeset
91 return (!cls->isInterface() && cls->typeEntry()->isValue() && !cls->isNamespace()
e78566595089 initial import
mandel
parents:
diff changeset
92 && !cls->isAbstract() && (cls->typeEntry()->codeGeneration() & TypeEntry::GenerateCpp));
e78566595089 initial import
mandel
parents:
diff changeset
93 }
e78566595089 initial import
mandel
parents:
diff changeset
94
e78566595089 initial import
mandel
parents:
diff changeset
95 QString MetaInfoGenerator::fileNameForClass(const AbstractMetaClass *) const
e78566595089 initial import
mandel
parents:
diff changeset
96 {
e78566595089 initial import
mandel
parents:
diff changeset
97 return filenameStub() + ".cpp";
e78566595089 initial import
mandel
parents:
diff changeset
98 }
e78566595089 initial import
mandel
parents:
diff changeset
99
e78566595089 initial import
mandel
parents:
diff changeset
100 void MetaInfoGenerator::write(QTextStream &, const AbstractMetaClass *)
e78566595089 initial import
mandel
parents:
diff changeset
101 {
e78566595089 initial import
mandel
parents:
diff changeset
102 // not used
e78566595089 initial import
mandel
parents:
diff changeset
103 }
e78566595089 initial import
mandel
parents:
diff changeset
104
e78566595089 initial import
mandel
parents:
diff changeset
105 bool MetaInfoGenerator::generated(const AbstractMetaClass *cls) const
e78566595089 initial import
mandel
parents:
diff changeset
106 {
e78566595089 initial import
mandel
parents:
diff changeset
107 return generatedMetaInfo(cls->package());
e78566595089 initial import
mandel
parents:
diff changeset
108 }
e78566595089 initial import
mandel
parents:
diff changeset
109
e78566595089 initial import
mandel
parents:
diff changeset
110 bool MetaInfoGenerator::generatedMetaInfo(const QString &package) const
e78566595089 initial import
mandel
parents:
diff changeset
111 {
e78566595089 initial import
mandel
parents:
diff changeset
112 return (m_skip_list.value(package, 0x0) & GeneratedMetaInfo);
e78566595089 initial import
mandel
parents:
diff changeset
113 }
e78566595089 initial import
mandel
parents:
diff changeset
114
e78566595089 initial import
mandel
parents:
diff changeset
115 bool MetaInfoGenerator::generatedJavaClasses(const QString &package) const
e78566595089 initial import
mandel
parents:
diff changeset
116 {
e78566595089 initial import
mandel
parents:
diff changeset
117 return (m_skip_list.value(package, 0x0) & GeneratedJavaClasses);
e78566595089 initial import
mandel
parents:
diff changeset
118 }
e78566595089 initial import
mandel
parents:
diff changeset
119
e78566595089 initial import
mandel
parents:
diff changeset
120 static void metainfo_write_name_list(QTextStream &s, const char *var_name, const QList<QString> &strs,
e78566595089 initial import
mandel
parents:
diff changeset
121 int offset, int skip)
e78566595089 initial import
mandel
parents:
diff changeset
122 {
e78566595089 initial import
mandel
parents:
diff changeset
123 s << "static const char *" << var_name << "[] = {" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
124 for (int i=offset; i<strs.size(); i += skip) {
e78566595089 initial import
mandel
parents:
diff changeset
125 s << " \"" << strs.at(i).toLatin1() << "\"";
e78566595089 initial import
mandel
parents:
diff changeset
126 if (i < strs.size() - 1)
e78566595089 initial import
mandel
parents:
diff changeset
127 s << ",";
e78566595089 initial import
mandel
parents:
diff changeset
128 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
129 }
e78566595089 initial import
mandel
parents:
diff changeset
130 s << "};" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
131 }
e78566595089 initial import
mandel
parents:
diff changeset
132
e78566595089 initial import
mandel
parents:
diff changeset
133 void MetaInfoGenerator::writeEnums(QTextStream &s, const QString &package)
e78566595089 initial import
mandel
parents:
diff changeset
134 {
e78566595089 initial import
mandel
parents:
diff changeset
135 TypeEntryHash entries = TypeDatabase::instance()->allEntries();
e78566595089 initial import
mandel
parents:
diff changeset
136 TypeEntryHash::iterator it;
e78566595089 initial import
mandel
parents:
diff changeset
137
e78566595089 initial import
mandel
parents:
diff changeset
138 QList<QString> strs;
e78566595089 initial import
mandel
parents:
diff changeset
139 for (it=entries.begin(); it!=entries.end(); ++it) {
e78566595089 initial import
mandel
parents:
diff changeset
140 QList<TypeEntry *> entries = it.value();
e78566595089 initial import
mandel
parents:
diff changeset
141 foreach (TypeEntry *entry, entries) {
e78566595089 initial import
mandel
parents:
diff changeset
142 if ((entry->isFlags() || entry->isEnum()) && entry->javaPackage() == package) {
e78566595089 initial import
mandel
parents:
diff changeset
143 EnumTypeEntry *eentry = entry->isEnum() ? static_cast<EnumTypeEntry *>(entry) : static_cast<FlagsTypeEntry *>(entry)->originator();
e78566595089 initial import
mandel
parents:
diff changeset
144
e78566595089 initial import
mandel
parents:
diff changeset
145 // The Qt flags names should map to the enum names, this is
e78566595089 initial import
mandel
parents:
diff changeset
146 // required for the designer plugin to find the enum type of
e78566595089 initial import
mandel
parents:
diff changeset
147 // a flags type since this functionality is not available in
e78566595089 initial import
mandel
parents:
diff changeset
148 // Qt. This may be a little bit inconsistent, but it saves
e78566595089 initial import
mandel
parents:
diff changeset
149 // us making yet another hash table for lookups. If it causes
e78566595089 initial import
mandel
parents:
diff changeset
150 // problems, make a new one for this particular purpose.
e78566595089 initial import
mandel
parents:
diff changeset
151 strs.append((eentry->javaPackage().isEmpty() ? QString() : eentry->javaPackage().replace('.', '/') + "/")
e78566595089 initial import
mandel
parents:
diff changeset
152 + eentry->javaQualifier() + "$" + eentry->targetLangName());
e78566595089 initial import
mandel
parents:
diff changeset
153 strs.append(entry->isFlags() ? static_cast<FlagsTypeEntry *>(entry)->originalName() : entry->qualifiedCppName());
e78566595089 initial import
mandel
parents:
diff changeset
154 }
e78566595089 initial import
mandel
parents:
diff changeset
155 }
e78566595089 initial import
mandel
parents:
diff changeset
156 }
e78566595089 initial import
mandel
parents:
diff changeset
157
e78566595089 initial import
mandel
parents:
diff changeset
158 Q_ASSERT(strs.size() % 2 == 0);
e78566595089 initial import
mandel
parents:
diff changeset
159
e78566595089 initial import
mandel
parents:
diff changeset
160 s << "static int enum_count = " << (strs.size() / 2) << ";" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
161 if (strs.size() > 0) {
e78566595089 initial import
mandel
parents:
diff changeset
162 metainfo_write_name_list(s, "enumJavaNames", strs, 0, 2);
e78566595089 initial import
mandel
parents:
diff changeset
163 metainfo_write_name_list(s, "enumCppNames", strs, 1, 2);
e78566595089 initial import
mandel
parents:
diff changeset
164 } else {
e78566595089 initial import
mandel
parents:
diff changeset
165 s << "static const char **enumCppNames = 0;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
166 << "static const char **enumJavaNames = 0;" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
167 }
e78566595089 initial import
mandel
parents:
diff changeset
168 }
e78566595089 initial import
mandel
parents:
diff changeset
169
e78566595089 initial import
mandel
parents:
diff changeset
170 void MetaInfoGenerator::writeSignalsAndSlots(QTextStream &s, const QString &package)
e78566595089 initial import
mandel
parents:
diff changeset
171 {
e78566595089 initial import
mandel
parents:
diff changeset
172 AbstractMetaClassList classes = this->classes();
e78566595089 initial import
mandel
parents:
diff changeset
173
e78566595089 initial import
mandel
parents:
diff changeset
174 QList<QString> strs;
e78566595089 initial import
mandel
parents:
diff changeset
175 foreach (AbstractMetaClass *cls, classes) {
e78566595089 initial import
mandel
parents:
diff changeset
176 if (cls->package() == package) {
e78566595089 initial import
mandel
parents:
diff changeset
177 AbstractMetaFunctionList functions = cls->functions();
e78566595089 initial import
mandel
parents:
diff changeset
178 foreach (AbstractMetaFunction *f, functions) {
e78566595089 initial import
mandel
parents:
diff changeset
179 if (f->implementingClass() == cls && (f->isSignal() || f->isSlot())) {
e78566595089 initial import
mandel
parents:
diff changeset
180
e78566595089 initial import
mandel
parents:
diff changeset
181 AbstractMetaArgumentList arguments = f->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
182 int numOverloads = arguments.size();
e78566595089 initial import
mandel
parents:
diff changeset
183 for (int i=arguments.size()-1; i>=0; --i) {
e78566595089 initial import
mandel
parents:
diff changeset
184 if (arguments.at(i)->defaultValueExpression().isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
185 numOverloads = arguments.size() - i - 1;
e78566595089 initial import
mandel
parents:
diff changeset
186 break;
e78566595089 initial import
mandel
parents:
diff changeset
187 }
e78566595089 initial import
mandel
parents:
diff changeset
188 }
e78566595089 initial import
mandel
parents:
diff changeset
189
e78566595089 initial import
mandel
parents:
diff changeset
190 for (int i=0; i<=numOverloads; ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
191 Option option = Option(SkipAttributes | SkipReturnType | SkipName);
e78566595089 initial import
mandel
parents:
diff changeset
192 QString qtName;
e78566595089 initial import
mandel
parents:
diff changeset
193 {
e78566595089 initial import
mandel
parents:
diff changeset
194
e78566595089 initial import
mandel
parents:
diff changeset
195 QTextStream qtNameStream(&qtName);
e78566595089 initial import
mandel
parents:
diff changeset
196 CppGenerator::writeFunctionSignature(qtNameStream, f, 0, QString(),
e78566595089 initial import
mandel
parents:
diff changeset
197 Option(option | OriginalName | NormalizeAndFixTypeSignature | OriginalTypeDescription),
e78566595089 initial import
mandel
parents:
diff changeset
198 QString(), QStringList(), arguments.size() - i);
e78566595089 initial import
mandel
parents:
diff changeset
199 }
e78566595089 initial import
mandel
parents:
diff changeset
200 qtName = f->implementingClass()->qualifiedCppName() + "::" + qtName;
e78566595089 initial import
mandel
parents:
diff changeset
201 qtName = QMetaObject::normalizedSignature(qtName.toLatin1().constData());
e78566595089 initial import
mandel
parents:
diff changeset
202
e78566595089 initial import
mandel
parents:
diff changeset
203 QString javaFunctionName = functionSignature(f, 0, 0, option, arguments.size() - (f->isSignal() ? 0 : i));
e78566595089 initial import
mandel
parents:
diff changeset
204 QString javaObjectName = f->isSignal()
e78566595089 initial import
mandel
parents:
diff changeset
205 ? f->name()
e78566595089 initial import
mandel
parents:
diff changeset
206 : javaFunctionName;
e78566595089 initial import
mandel
parents:
diff changeset
207
e78566595089 initial import
mandel
parents:
diff changeset
208 javaFunctionName = f->implementingClass()->fullName() + "." + javaFunctionName;
e78566595089 initial import
mandel
parents:
diff changeset
209 javaObjectName = f->implementingClass()->fullName() + "." + javaObjectName;
e78566595089 initial import
mandel
parents:
diff changeset
210
e78566595089 initial import
mandel
parents:
diff changeset
211 QString javaSignature = "(";
e78566595089 initial import
mandel
parents:
diff changeset
212 for (int j=0; j < (arguments.size() - (f->isSignal() ? 0 : i)); ++j) {
e78566595089 initial import
mandel
parents:
diff changeset
213 AbstractMetaArgument *arg = arguments.at(j);
e78566595089 initial import
mandel
parents:
diff changeset
214 javaSignature += jni_signature(arg->type(), SlashesAndStuff);
e78566595089 initial import
mandel
parents:
diff changeset
215 }
e78566595089 initial import
mandel
parents:
diff changeset
216 javaSignature += ")" + jni_signature(f->type(), SlashesAndStuff);
e78566595089 initial import
mandel
parents:
diff changeset
217
e78566595089 initial import
mandel
parents:
diff changeset
218 strs.append(qtName);
e78566595089 initial import
mandel
parents:
diff changeset
219 strs.append(javaFunctionName);
e78566595089 initial import
mandel
parents:
diff changeset
220 strs.append(javaObjectName);
e78566595089 initial import
mandel
parents:
diff changeset
221 strs.append(javaSignature);
e78566595089 initial import
mandel
parents:
diff changeset
222 }
e78566595089 initial import
mandel
parents:
diff changeset
223 }
e78566595089 initial import
mandel
parents:
diff changeset
224 }
e78566595089 initial import
mandel
parents:
diff changeset
225 }
e78566595089 initial import
mandel
parents:
diff changeset
226 }
e78566595089 initial import
mandel
parents:
diff changeset
227
e78566595089 initial import
mandel
parents:
diff changeset
228 Q_ASSERT(strs.size() % 4 == 0);
e78566595089 initial import
mandel
parents:
diff changeset
229
e78566595089 initial import
mandel
parents:
diff changeset
230 s << "static int sns_count = " << (strs.size() / 4) << ";" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
231 if (strs.size() > 0) {
e78566595089 initial import
mandel
parents:
diff changeset
232 metainfo_write_name_list(s, "qtNames", strs, 0, 4);
e78566595089 initial import
mandel
parents:
diff changeset
233 metainfo_write_name_list(s, "javaFunctionNames", strs, 1, 4);
e78566595089 initial import
mandel
parents:
diff changeset
234 metainfo_write_name_list(s, "javaObjectNames", strs, 2, 4);
e78566595089 initial import
mandel
parents:
diff changeset
235 metainfo_write_name_list(s, "javaSignatures", strs, 3, 4);
e78566595089 initial import
mandel
parents:
diff changeset
236 } else {
e78566595089 initial import
mandel
parents:
diff changeset
237 s << "static const char **qtNames = 0;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
238 << "static const char **javaFunctionNames = 0;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
239 << "static const char **javaObjectNames = 0;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
240 << "static const char **javaSignatures = 0;" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
241 }
e78566595089 initial import
mandel
parents:
diff changeset
242 }
e78566595089 initial import
mandel
parents:
diff changeset
243
e78566595089 initial import
mandel
parents:
diff changeset
244 void MetaInfoGenerator::writeRegisterSignalsAndSlots(QTextStream &s)
e78566595089 initial import
mandel
parents:
diff changeset
245 {
e78566595089 initial import
mandel
parents:
diff changeset
246 s << " for (int i=0;i<sns_count; ++i) {" << endl
e78566595089 initial import
mandel
parents:
diff changeset
247 << " registerQtToJava(qtNames[i], javaFunctionNames[i]);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
248 << " if (getQtName(javaObjectNames[i]).length() < QByteArray(qtNames[i]).size())" << endl
e78566595089 initial import
mandel
parents:
diff changeset
249 << " registerJavaToQt(javaObjectNames[i], qtNames[i]);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
250 << " registerJavaSignature(qtNames[i], javaSignatures[i]);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
251 << " }" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
252 }
e78566595089 initial import
mandel
parents:
diff changeset
253
e78566595089 initial import
mandel
parents:
diff changeset
254 void MetaInfoGenerator::writeRegisterEnums(QTextStream &s)
e78566595089 initial import
mandel
parents:
diff changeset
255 {
e78566595089 initial import
mandel
parents:
diff changeset
256 s << " for (int i=0;i<enum_count; ++i) {" << endl
e78566595089 initial import
mandel
parents:
diff changeset
257 << " registerQtToJava(enumCppNames[i], enumJavaNames[i]);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
258 << " registerJavaToQt(enumJavaNames[i], enumCppNames[i]);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
259 << " }" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
260 }
e78566595089 initial import
mandel
parents:
diff changeset
261
e78566595089 initial import
mandel
parents:
diff changeset
262 void MetaInfoGenerator::buildSkipList()
e78566595089 initial import
mandel
parents:
diff changeset
263 {
e78566595089 initial import
mandel
parents:
diff changeset
264 AbstractMetaClassList classList = classes();
e78566595089 initial import
mandel
parents:
diff changeset
265 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
266 if (!m_skip_list.contains(cls->package()))
e78566595089 initial import
mandel
parents:
diff changeset
267 m_skip_list[cls->package()] = 0x0;
e78566595089 initial import
mandel
parents:
diff changeset
268
e78566595089 initial import
mandel
parents:
diff changeset
269 if (cls->typeEntry()->codeGeneration() & TypeEntry::GenerateCpp)
e78566595089 initial import
mandel
parents:
diff changeset
270 m_skip_list[cls->package()] |= GeneratedMetaInfo;
e78566595089 initial import
mandel
parents:
diff changeset
271
e78566595089 initial import
mandel
parents:
diff changeset
272 if (cls->typeEntry()->codeGeneration() & TypeEntry::GenerateTargetLang)
e78566595089 initial import
mandel
parents:
diff changeset
273 m_skip_list[cls->package()] |= GeneratedJavaClasses;
e78566595089 initial import
mandel
parents:
diff changeset
274 }
e78566595089 initial import
mandel
parents:
diff changeset
275 }
e78566595089 initial import
mandel
parents:
diff changeset
276
e78566595089 initial import
mandel
parents:
diff changeset
277 QStringList MetaInfoGenerator::writePolymorphicHandler(QTextStream &s, const QString &package,
e78566595089 initial import
mandel
parents:
diff changeset
278 const AbstractMetaClassList &classes)
e78566595089 initial import
mandel
parents:
diff changeset
279 {
e78566595089 initial import
mandel
parents:
diff changeset
280 QStringList handlers;
e78566595089 initial import
mandel
parents:
diff changeset
281 foreach (AbstractMetaClass *cls, classes) {
e78566595089 initial import
mandel
parents:
diff changeset
282 const ComplexTypeEntry *centry = cls->typeEntry();
e78566595089 initial import
mandel
parents:
diff changeset
283 if (!centry->isPolymorphicBase())
e78566595089 initial import
mandel
parents:
diff changeset
284 continue;
e78566595089 initial import
mandel
parents:
diff changeset
285
e78566595089 initial import
mandel
parents:
diff changeset
286 AbstractMetaClassList classList = this->classes();
e78566595089 initial import
mandel
parents:
diff changeset
287 bool first = true;
e78566595089 initial import
mandel
parents:
diff changeset
288 foreach (AbstractMetaClass *clazz, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
289 if (clazz->package() == package && clazz->inheritsFrom(cls)) {
e78566595089 initial import
mandel
parents:
diff changeset
290 if (!clazz->typeEntry()->polymorphicIdValue().isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
291 // On first find, open the function
e78566595089 initial import
mandel
parents:
diff changeset
292 if (first) {
e78566595089 initial import
mandel
parents:
diff changeset
293 first = false;
e78566595089 initial import
mandel
parents:
diff changeset
294
e78566595089 initial import
mandel
parents:
diff changeset
295 QString handler = jni_signature(cls->fullName(), Underscores);
e78566595089 initial import
mandel
parents:
diff changeset
296 handlers.append(handler);
e78566595089 initial import
mandel
parents:
diff changeset
297
e78566595089 initial import
mandel
parents:
diff changeset
298 s << "static bool polymorphichandler_" << handler
e78566595089 initial import
mandel
parents:
diff changeset
299 << "(const void *ptr, char **class_name, char **package)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
300 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
301 << " Q_ASSERT(ptr != 0);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
302 << " " << cls->qualifiedCppName() << " *object = ("
e78566595089 initial import
mandel
parents:
diff changeset
303 << cls->qualifiedCppName() << " *)ptr;" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
304 }
e78566595089 initial import
mandel
parents:
diff changeset
305
e78566595089 initial import
mandel
parents:
diff changeset
306 // For each, add case label
e78566595089 initial import
mandel
parents:
diff changeset
307 s << " if ("
e78566595089 initial import
mandel
parents:
diff changeset
308 << clazz->typeEntry()->polymorphicIdValue().replace("%1", "object")
e78566595089 initial import
mandel
parents:
diff changeset
309 << ") {" << endl
e78566595089 initial import
mandel
parents:
diff changeset
310 << " *class_name = \"" << clazz->name() << "\";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
311 << " *package = \"" << clazz->package().replace(".", "/") << "/\";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
312 << " return true;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
313 << " }" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
314 } else {
e78566595089 initial import
mandel
parents:
diff changeset
315 QString warning = QString("class '%1' inherits from polymorphic class '%2', but has no polymorphic id set")
e78566595089 initial import
mandel
parents:
diff changeset
316 .arg(clazz->name())
e78566595089 initial import
mandel
parents:
diff changeset
317 .arg(cls->name());
e78566595089 initial import
mandel
parents:
diff changeset
318
e78566595089 initial import
mandel
parents:
diff changeset
319 ReportHandler::warning(warning);
e78566595089 initial import
mandel
parents:
diff changeset
320 }
e78566595089 initial import
mandel
parents:
diff changeset
321 }
e78566595089 initial import
mandel
parents:
diff changeset
322 }
e78566595089 initial import
mandel
parents:
diff changeset
323
e78566595089 initial import
mandel
parents:
diff changeset
324 // Close the function if it has been opened
e78566595089 initial import
mandel
parents:
diff changeset
325 if (!first) {
e78566595089 initial import
mandel
parents:
diff changeset
326 s << " return false;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
327 << "}" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
328 }
e78566595089 initial import
mandel
parents:
diff changeset
329 }
e78566595089 initial import
mandel
parents:
diff changeset
330
e78566595089 initial import
mandel
parents:
diff changeset
331 return handlers;
e78566595089 initial import
mandel
parents:
diff changeset
332 }
e78566595089 initial import
mandel
parents:
diff changeset
333
e78566595089 initial import
mandel
parents:
diff changeset
334 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
335 void MetaInfoGenerator::writeNameLiteral(QTextStream &s, const TypeEntry *entry, const QString &fileName)
e78566595089 initial import
mandel
parents:
diff changeset
336 {
e78566595089 initial import
mandel
parents:
diff changeset
337 static QSet<QString> used;
e78566595089 initial import
mandel
parents:
diff changeset
338
e78566595089 initial import
mandel
parents:
diff changeset
339 if (!used.contains(fileName + ":" + entry->name())) {
e78566595089 initial import
mandel
parents:
diff changeset
340 s << "char __name_" << QString(entry->name()).replace(':', '_').replace(' ', '_') << "[] = \"" << entry->name() << "\";" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
341 used.insert(fileName + ":" + entry->name());
e78566595089 initial import
mandel
parents:
diff changeset
342 }
e78566595089 initial import
mandel
parents:
diff changeset
343 }
e78566595089 initial import
mandel
parents:
diff changeset
344 #endif
e78566595089 initial import
mandel
parents:
diff changeset
345
e78566595089 initial import
mandel
parents:
diff changeset
346 void MetaInfoGenerator::writeCppFile()
e78566595089 initial import
mandel
parents:
diff changeset
347 {
e78566595089 initial import
mandel
parents:
diff changeset
348 TypeEntryHash entries = TypeDatabase::instance()->allEntries();
e78566595089 initial import
mandel
parents:
diff changeset
349 TypeEntryHash::iterator it;
e78566595089 initial import
mandel
parents:
diff changeset
350
e78566595089 initial import
mandel
parents:
diff changeset
351 AbstractMetaClassList classes_with_polymorphic_id;
e78566595089 initial import
mandel
parents:
diff changeset
352 AbstractMetaClassList classList = classes();
e78566595089 initial import
mandel
parents:
diff changeset
353 QHash<QString, FileOut *> fileHash;
e78566595089 initial import
mandel
parents:
diff changeset
354
e78566595089 initial import
mandel
parents:
diff changeset
355 // Seems continue is not supported by our foreach loop, so
e78566595089 initial import
mandel
parents:
diff changeset
356 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
357
e78566595089 initial import
mandel
parents:
diff changeset
358 FileOut *f = fileHash.value(cls->package(), 0);
e78566595089 initial import
mandel
parents:
diff changeset
359 if (f == 0 && generated(cls)) {
e78566595089 initial import
mandel
parents:
diff changeset
360 f = new FileOut(outputDirectory() + "/" + subDirectoryForClass(cls, CppDirectory) + "/" + cppFilename());
e78566595089 initial import
mandel
parents:
diff changeset
361
e78566595089 initial import
mandel
parents:
diff changeset
362 writeIncludeStatements(f->stream, classList, cls->package());
e78566595089 initial import
mandel
parents:
diff changeset
363 f->stream << endl;
e78566595089 initial import
mandel
parents:
diff changeset
364
e78566595089 initial import
mandel
parents:
diff changeset
365 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
366 // Write the generic destructors and constructors
e78566595089 initial import
mandel
parents:
diff changeset
367 f->stream << "template <typename T, const char *NAME>" << endl
e78566595089 initial import
mandel
parents:
diff changeset
368 << "void genericDestructor(void *t)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
369 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
370 << " delete (T *) t;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
371 << " qtjambi_increase_destructorFunctionCalledCount(QString::fromLatin1(NAME));" << endl
e78566595089 initial import
mandel
parents:
diff changeset
372 << "}" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
373 << "template <typename T>" << endl
e78566595089 initial import
mandel
parents:
diff changeset
374 << "void *genericConstructor(const void *t)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
375 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
376 << " if (!t)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
377 << " return new T;" << endl
e78566595089 initial import
mandel
parents:
diff changeset
378 << " return new T(*reinterpret_cast<const T *>(t));" << endl
e78566595089 initial import
mandel
parents:
diff changeset
379 << "}" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
380 #endif
e78566595089 initial import
mandel
parents:
diff changeset
381
e78566595089 initial import
mandel
parents:
diff changeset
382
e78566595089 initial import
mandel
parents:
diff changeset
383 fileHash.insert(cls->package(), f);
e78566595089 initial import
mandel
parents:
diff changeset
384
238
1349940724eb Generate a classes list for cmake.
SokoL_SD
parents: 1
diff changeset
385 priGenerator->addSource(cls->package(), cppFilename());
1
e78566595089 initial import
mandel
parents:
diff changeset
386 }
e78566595089 initial import
mandel
parents:
diff changeset
387
e78566595089 initial import
mandel
parents:
diff changeset
388 if (!(cls->attributes() & AbstractMetaAttributes::Fake)) {
e78566595089 initial import
mandel
parents:
diff changeset
389 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
390 if (cls->typeEntry()->isObject()
e78566595089 initial import
mandel
parents:
diff changeset
391 && !cls->typeEntry()->isQObject()
e78566595089 initial import
mandel
parents:
diff changeset
392 && !cls->isInterface()) {
e78566595089 initial import
mandel
parents:
diff changeset
393 writeDestructors(f->stream, cls);
e78566595089 initial import
mandel
parents:
diff changeset
394 }
e78566595089 initial import
mandel
parents:
diff changeset
395 writeCustomStructors(f->stream, cls->typeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
396 }
e78566595089 initial import
mandel
parents:
diff changeset
397
e78566595089 initial import
mandel
parents:
diff changeset
398 if (cls->typeEntry()->isPolymorphicBase())
e78566595089 initial import
mandel
parents:
diff changeset
399 classes_with_polymorphic_id.append(cls);
e78566595089 initial import
mandel
parents:
diff changeset
400 }
e78566595089 initial import
mandel
parents:
diff changeset
401
e78566595089 initial import
mandel
parents:
diff changeset
402 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
403 if (cls->typeEntry()->isValue() && shouldGenerate(cls->typeEntry()))
e78566595089 initial import
mandel
parents:
diff changeset
404 writeNameLiteral(f->stream, cls->typeEntry(), f->name());
e78566595089 initial import
mandel
parents:
diff changeset
405 #endif
e78566595089 initial import
mandel
parents:
diff changeset
406 }
e78566595089 initial import
mandel
parents:
diff changeset
407
e78566595089 initial import
mandel
parents:
diff changeset
408 QHash<QString, QStringList> handlers_to_register;
e78566595089 initial import
mandel
parents:
diff changeset
409 foreach (QString package, fileHash.keys()) {
e78566595089 initial import
mandel
parents:
diff changeset
410 FileOut *f = fileHash.value(package, 0);
e78566595089 initial import
mandel
parents:
diff changeset
411 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
412 writeSignalsAndSlots(f->stream, package);
e78566595089 initial import
mandel
parents:
diff changeset
413 writeEnums(f->stream, package);
e78566595089 initial import
mandel
parents:
diff changeset
414 handlers_to_register[package] = writePolymorphicHandler(f->stream, package, classes_with_polymorphic_id);
e78566595089 initial import
mandel
parents:
diff changeset
415 }
e78566595089 initial import
mandel
parents:
diff changeset
416 }
e78566595089 initial import
mandel
parents:
diff changeset
417
e78566595089 initial import
mandel
parents:
diff changeset
418 // Primitive types must be added to all packages, in case the other packages are
e78566595089 initial import
mandel
parents:
diff changeset
419 // not referenced from the generated code.
e78566595089 initial import
mandel
parents:
diff changeset
420 foreach (FileOut *f, fileHash.values()) {
e78566595089 initial import
mandel
parents:
diff changeset
421 for (it=entries.begin(); it!=entries.end(); ++it) {
e78566595089 initial import
mandel
parents:
diff changeset
422 QList<TypeEntry *> entries = it.value();
e78566595089 initial import
mandel
parents:
diff changeset
423 foreach (TypeEntry *entry, entries) {
e78566595089 initial import
mandel
parents:
diff changeset
424 if (shouldGenerate(entry) && entry->isPrimitive()) {
e78566595089 initial import
mandel
parents:
diff changeset
425 writeCustomStructors(f->stream, entry);
e78566595089 initial import
mandel
parents:
diff changeset
426 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
427 writeNameLiteral(f->stream, entry, f->name());
e78566595089 initial import
mandel
parents:
diff changeset
428 #endif
e78566595089 initial import
mandel
parents:
diff changeset
429 }
e78566595089 initial import
mandel
parents:
diff changeset
430 }
e78566595089 initial import
mandel
parents:
diff changeset
431 }
e78566595089 initial import
mandel
parents:
diff changeset
432
e78566595089 initial import
mandel
parents:
diff changeset
433 // Initialization function: Registers meta types
e78566595089 initial import
mandel
parents:
diff changeset
434 writeInitializationFunctionName(f->stream, fileHash.key(f, ""), true);
e78566595089 initial import
mandel
parents:
diff changeset
435 f->stream << endl << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
436 for (it=entries.begin(); it!=entries.end(); ++it) {
e78566595089 initial import
mandel
parents:
diff changeset
437 QList<TypeEntry *> entries = it.value();
e78566595089 initial import
mandel
parents:
diff changeset
438 foreach (TypeEntry *entry, entries) {
e78566595089 initial import
mandel
parents:
diff changeset
439 if (entry &&
e78566595089 initial import
mandel
parents:
diff changeset
440 ( (shouldGenerate(entry) && entry->isPrimitive())
e78566595089 initial import
mandel
parents:
diff changeset
441 || entry->isString()
e78566595089 initial import
mandel
parents:
diff changeset
442 || entry->isChar())) {
e78566595089 initial import
mandel
parents:
diff changeset
443 writeInitialization(f->stream, entry, 0);
e78566595089 initial import
mandel
parents:
diff changeset
444 }
e78566595089 initial import
mandel
parents:
diff changeset
445 }
e78566595089 initial import
mandel
parents:
diff changeset
446 }
e78566595089 initial import
mandel
parents:
diff changeset
447 writeRegisterSignalsAndSlots(f->stream);
e78566595089 initial import
mandel
parents:
diff changeset
448 writeRegisterEnums(f->stream);
e78566595089 initial import
mandel
parents:
diff changeset
449 }
e78566595089 initial import
mandel
parents:
diff changeset
450
e78566595089 initial import
mandel
parents:
diff changeset
451 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
452 FileOut *f = fileHash.value(cls->package(), 0);
e78566595089 initial import
mandel
parents:
diff changeset
453
e78566595089 initial import
mandel
parents:
diff changeset
454 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
455 writeInitialization(f->stream, cls->typeEntry(), cls, shouldGenerate(cls));
e78566595089 initial import
mandel
parents:
diff changeset
456 }
e78566595089 initial import
mandel
parents:
diff changeset
457 }
e78566595089 initial import
mandel
parents:
diff changeset
458
e78566595089 initial import
mandel
parents:
diff changeset
459 foreach (QString package, fileHash.keys()) {
e78566595089 initial import
mandel
parents:
diff changeset
460 FileOut *f = fileHash.value(package, 0);
e78566595089 initial import
mandel
parents:
diff changeset
461 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
462 foreach (QString handler, handlers_to_register.value(package, QStringList())) {
e78566595089 initial import
mandel
parents:
diff changeset
463 f->stream << " qtjambi_register_polymorphic_id(\"" << handler << "\","
e78566595089 initial import
mandel
parents:
diff changeset
464 << "polymorphichandler_" << handler << ");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
465 }
e78566595089 initial import
mandel
parents:
diff changeset
466
e78566595089 initial import
mandel
parents:
diff changeset
467 f->stream << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
468 if( f->done() )
e78566595089 initial import
mandel
parents:
diff changeset
469 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
470 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
471
e78566595089 initial import
mandel
parents:
diff changeset
472 delete f;
e78566595089 initial import
mandel
parents:
diff changeset
473 }
e78566595089 initial import
mandel
parents:
diff changeset
474 }
e78566595089 initial import
mandel
parents:
diff changeset
475 }
e78566595089 initial import
mandel
parents:
diff changeset
476
e78566595089 initial import
mandel
parents:
diff changeset
477 void MetaInfoGenerator::writeHeaderFile()
e78566595089 initial import
mandel
parents:
diff changeset
478 {
e78566595089 initial import
mandel
parents:
diff changeset
479 AbstractMetaClassList classList = classes();
e78566595089 initial import
mandel
parents:
diff changeset
480 QHash<QString, bool> fileHash;
e78566595089 initial import
mandel
parents:
diff changeset
481
e78566595089 initial import
mandel
parents:
diff changeset
482 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
483 bool hasGenerated = fileHash.value(cls->package(), false);
e78566595089 initial import
mandel
parents:
diff changeset
484 if (!hasGenerated && generated(cls)) {
e78566595089 initial import
mandel
parents:
diff changeset
485 FileOut file(outputDirectory() + "/" + subDirectoryForClass(cls, CppDirectory) + "/" + headerFilename());
e78566595089 initial import
mandel
parents:
diff changeset
486 file.stream << "#ifndef " << filenameStub().toUpper() << "_H" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
487 file.stream << "#define " << filenameStub().toUpper() << "_H" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
488 writeInitializationFunctionName(file.stream, cls->package(), true);
e78566595089 initial import
mandel
parents:
diff changeset
489 file.stream << ";" << endl << "#endif" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
490
e78566595089 initial import
mandel
parents:
diff changeset
491 fileHash.insert(cls->package(), true);
e78566595089 initial import
mandel
parents:
diff changeset
492
238
1349940724eb Generate a classes list for cmake.
SokoL_SD
parents: 1
diff changeset
493 priGenerator->addHeader(cls->package(), headerFilename());
1
e78566595089 initial import
mandel
parents:
diff changeset
494
e78566595089 initial import
mandel
parents:
diff changeset
495 if( file.done() )
e78566595089 initial import
mandel
parents:
diff changeset
496 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
497 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
498 }
e78566595089 initial import
mandel
parents:
diff changeset
499 }
e78566595089 initial import
mandel
parents:
diff changeset
500 }
e78566595089 initial import
mandel
parents:
diff changeset
501
e78566595089 initial import
mandel
parents:
diff changeset
502 void MetaInfoGenerator::writeCodeBlock(QTextStream &s, const QString &code)
e78566595089 initial import
mandel
parents:
diff changeset
503 {
e78566595089 initial import
mandel
parents:
diff changeset
504 QStringList lines = code.split('\n');
e78566595089 initial import
mandel
parents:
diff changeset
505 QString indent;
e78566595089 initial import
mandel
parents:
diff changeset
506 foreach (QString str, lines) {
e78566595089 initial import
mandel
parents:
diff changeset
507 s << " " << indent << str.trimmed() << endl;
e78566595089 initial import
mandel
parents:
diff changeset
508 if (!str.trimmed().endsWith(";") && !str.trimmed().isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
509 indent = " ";
e78566595089 initial import
mandel
parents:
diff changeset
510 else
e78566595089 initial import
mandel
parents:
diff changeset
511 indent = "";
e78566595089 initial import
mandel
parents:
diff changeset
512 }
e78566595089 initial import
mandel
parents:
diff changeset
513 }
e78566595089 initial import
mandel
parents:
diff changeset
514
e78566595089 initial import
mandel
parents:
diff changeset
515 const AbstractMetaClass* MetaInfoGenerator::lookupClassWithPublicDestructor(const AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
516 {
e78566595089 initial import
mandel
parents:
diff changeset
517 while (cls != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
518 if (cls->hasPublicDestructor()) {
e78566595089 initial import
mandel
parents:
diff changeset
519 return cls;
e78566595089 initial import
mandel
parents:
diff changeset
520 } else {
e78566595089 initial import
mandel
parents:
diff changeset
521 cls = cls->baseClass();
e78566595089 initial import
mandel
parents:
diff changeset
522 }
e78566595089 initial import
mandel
parents:
diff changeset
523 }
e78566595089 initial import
mandel
parents:
diff changeset
524 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
525 }
e78566595089 initial import
mandel
parents:
diff changeset
526
e78566595089 initial import
mandel
parents:
diff changeset
527 void MetaInfoGenerator::writeDestructors(QTextStream &s, const AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
528 {
e78566595089 initial import
mandel
parents:
diff changeset
529 // We can only delete classes with public destructors
e78566595089 initial import
mandel
parents:
diff changeset
530 const AbstractMetaClass *clsWithPublicDestructor = lookupClassWithPublicDestructor(cls);
e78566595089 initial import
mandel
parents:
diff changeset
531 if(clsWithPublicDestructor != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
532 const ComplexTypeEntry *entry = cls->typeEntry();
e78566595089 initial import
mandel
parents:
diff changeset
533 if ((entry->codeGeneration() & TypeEntry::GenerateCode) != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
534 s << "void destructor_" << entry->javaPackage().replace(".", "_") << "_"
e78566595089 initial import
mandel
parents:
diff changeset
535 << entry->lookupName().replace(".", "_").replace("$", "_") << "(void *ptr)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
536 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
537 << " delete reinterpret_cast<" << clsWithPublicDestructor->qualifiedCppName() << " *>(ptr);" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
538
e78566595089 initial import
mandel
parents:
diff changeset
539 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
540 s << " qtjambi_increase_destructorFunctionCalledCount(QString::fromLatin1(\"" << cls->name() << "\"));" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
541 #endif
e78566595089 initial import
mandel
parents:
diff changeset
542
e78566595089 initial import
mandel
parents:
diff changeset
543 s << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
544 }
e78566595089 initial import
mandel
parents:
diff changeset
545 }
e78566595089 initial import
mandel
parents:
diff changeset
546 }
e78566595089 initial import
mandel
parents:
diff changeset
547
e78566595089 initial import
mandel
parents:
diff changeset
548 void MetaInfoGenerator::writeCustomStructors(QTextStream &s, const TypeEntry *entry)
e78566595089 initial import
mandel
parents:
diff changeset
549 {
e78566595089 initial import
mandel
parents:
diff changeset
550 if (!entry->preferredConversion())
e78566595089 initial import
mandel
parents:
diff changeset
551 return ;
e78566595089 initial import
mandel
parents:
diff changeset
552
e78566595089 initial import
mandel
parents:
diff changeset
553 CustomFunction customConstructor = entry->customConstructor();
e78566595089 initial import
mandel
parents:
diff changeset
554 CustomFunction customDestructor = entry->customDestructor();
e78566595089 initial import
mandel
parents:
diff changeset
555
e78566595089 initial import
mandel
parents:
diff changeset
556 if (!customConstructor.name.isEmpty() && !customDestructor.name.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
557 s << "// Custom constructor and destructor for " << entry->qualifiedCppName() << endl
e78566595089 initial import
mandel
parents:
diff changeset
558 << "static void *" << customConstructor.name << "("
e78566595089 initial import
mandel
parents:
diff changeset
559 << "const " << entry->qualifiedCppName() << " *" << customConstructor.param_name
e78566595089 initial import
mandel
parents:
diff changeset
560 << ")" << endl
e78566595089 initial import
mandel
parents:
diff changeset
561 << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
562 writeCodeBlock(s, customConstructor.code());
e78566595089 initial import
mandel
parents:
diff changeset
563 s << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
564
e78566595089 initial import
mandel
parents:
diff changeset
565 s << "static void " << customDestructor.name << "("
e78566595089 initial import
mandel
parents:
diff changeset
566 << "const " << entry->qualifiedCppName() << " *" << customDestructor.param_name
e78566595089 initial import
mandel
parents:
diff changeset
567 << ")" << endl
e78566595089 initial import
mandel
parents:
diff changeset
568 << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
569 writeCodeBlock(s, customDestructor.code());
e78566595089 initial import
mandel
parents:
diff changeset
570 s << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
571 }
e78566595089 initial import
mandel
parents:
diff changeset
572 }
e78566595089 initial import
mandel
parents:
diff changeset
573
e78566595089 initial import
mandel
parents:
diff changeset
574 static void generateInitializer(QTextStream &s, const QString &package, CodeSnip::Position pos)
e78566595089 initial import
mandel
parents:
diff changeset
575 {
e78566595089 initial import
mandel
parents:
diff changeset
576 QList<CodeSnip> snips =
e78566595089 initial import
mandel
parents:
diff changeset
577 ((TypeSystemTypeEntry *) TypeDatabase::instance()->findType(package))->snips;
e78566595089 initial import
mandel
parents:
diff changeset
578
e78566595089 initial import
mandel
parents:
diff changeset
579 foreach (const CodeSnip &snip, snips)
e78566595089 initial import
mandel
parents:
diff changeset
580 if (snip.position == pos)
e78566595089 initial import
mandel
parents:
diff changeset
581 s << snip.code();
e78566595089 initial import
mandel
parents:
diff changeset
582 }
e78566595089 initial import
mandel
parents:
diff changeset
583
e78566595089 initial import
mandel
parents:
diff changeset
584 void MetaInfoGenerator::writeLibraryInitializers()
e78566595089 initial import
mandel
parents:
diff changeset
585 {
e78566595089 initial import
mandel
parents:
diff changeset
586 // from cppimplgenerator.cpp
e78566595089 initial import
mandel
parents:
diff changeset
587 extern QString jni_function_signature(QString package,
e78566595089 initial import
mandel
parents:
diff changeset
588 QString class_name,
e78566595089 initial import
mandel
parents:
diff changeset
589 const QString &function_name,
e78566595089 initial import
mandel
parents:
diff changeset
590 const QString &return_type,
e78566595089 initial import
mandel
parents:
diff changeset
591 const QString &mangled_arguments = QString(),
e78566595089 initial import
mandel
parents:
diff changeset
592 uint options = CppImplGenerator::StandardJNISignature);
e78566595089 initial import
mandel
parents:
diff changeset
593
e78566595089 initial import
mandel
parents:
diff changeset
594 // We need to generate a library initializer in Java for all packages
e78566595089 initial import
mandel
parents:
diff changeset
595 // that have generated classes in Java, and in C++ for all packages
e78566595089 initial import
mandel
parents:
diff changeset
596 // that have generated metainfo.
e78566595089 initial import
mandel
parents:
diff changeset
597
e78566595089 initial import
mandel
parents:
diff changeset
598 QList<QString> known_packages = m_skip_list.keys();
e78566595089 initial import
mandel
parents:
diff changeset
599 foreach (QString package, known_packages) {
e78566595089 initial import
mandel
parents:
diff changeset
600 if (generatedMetaInfo(package)) { // write cpp file
e78566595089 initial import
mandel
parents:
diff changeset
601
e78566595089 initial import
mandel
parents:
diff changeset
602 FileOut fileOut(outputDirectory() + "/" + subDirectoryForPackage(package, CppDirectory) + "/qtjambi_libraryinitializer.cpp");
e78566595089 initial import
mandel
parents:
diff changeset
603
e78566595089 initial import
mandel
parents:
diff changeset
604 QString signature = jni_function_signature(package, "QtJambi_LibraryInitializer",
e78566595089 initial import
mandel
parents:
diff changeset
605 "__qt_initLibrary", "void");
e78566595089 initial import
mandel
parents:
diff changeset
606 QTextStream &s = fileOut.stream;
e78566595089 initial import
mandel
parents:
diff changeset
607 s << "#include \"metainfo.h\"" << endl
e78566595089 initial import
mandel
parents:
diff changeset
608 << "#include \"qtjambi_global.h\"" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
609 << signature << "(JNIEnv *, jclass)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
610 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
611 << " ";
e78566595089 initial import
mandel
parents:
diff changeset
612 writeInitializationFunctionName(s, package, false);
e78566595089 initial import
mandel
parents:
diff changeset
613 s << ";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
614 << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
615
238
1349940724eb Generate a classes list for cmake.
SokoL_SD
parents: 1
diff changeset
616 priGenerator->addSource(package, "qtjambi_libraryinitializer.cpp");
1
e78566595089 initial import
mandel
parents:
diff changeset
617
e78566595089 initial import
mandel
parents:
diff changeset
618 if( fileOut.done() )
e78566595089 initial import
mandel
parents:
diff changeset
619 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
620 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
621 }
e78566595089 initial import
mandel
parents:
diff changeset
622
e78566595089 initial import
mandel
parents:
diff changeset
623 if (generatedJavaClasses(package)) {
e78566595089 initial import
mandel
parents:
diff changeset
624
e78566595089 initial import
mandel
parents:
diff changeset
625 FileOut fileOut(outputDirectory() + "/" + subDirectoryForPackage(package, JavaDirectory) + "/QtJambi_LibraryInitializer.java");
e78566595089 initial import
mandel
parents:
diff changeset
626
e78566595089 initial import
mandel
parents:
diff changeset
627 QTextStream &s = fileOut.stream;
e78566595089 initial import
mandel
parents:
diff changeset
628 s << "package " << package << ";" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
629 << "class QtJambi_LibraryInitializer" << endl
e78566595089 initial import
mandel
parents:
diff changeset
630 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
631 << " static {" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
632
e78566595089 initial import
mandel
parents:
diff changeset
633 generateInitializer(s, package, CodeSnip::Beginning);
e78566595089 initial import
mandel
parents:
diff changeset
634
e78566595089 initial import
mandel
parents:
diff changeset
635 s << " qt.Utilities.loadJambiLibrary(\""
e78566595089 initial import
mandel
parents:
diff changeset
636 << QString(package).replace(".", "_") << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
637
e78566595089 initial import
mandel
parents:
diff changeset
638 if (generatedMetaInfo(package))
e78566595089 initial import
mandel
parents:
diff changeset
639 s << " __qt_initLibrary();" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
640
e78566595089 initial import
mandel
parents:
diff changeset
641 generateInitializer(s, package, CodeSnip::End);
e78566595089 initial import
mandel
parents:
diff changeset
642
e78566595089 initial import
mandel
parents:
diff changeset
643 s << " }" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
644
e78566595089 initial import
mandel
parents:
diff changeset
645 if (generatedMetaInfo(package))
e78566595089 initial import
mandel
parents:
diff changeset
646 s << " private native static void __qt_initLibrary();" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
647
e78566595089 initial import
mandel
parents:
diff changeset
648 s << " static void init() { };" << endl
e78566595089 initial import
mandel
parents:
diff changeset
649 << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
650
e78566595089 initial import
mandel
parents:
diff changeset
651 if( fileOut.done() )
e78566595089 initial import
mandel
parents:
diff changeset
652 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
653 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
654 }
e78566595089 initial import
mandel
parents:
diff changeset
655 }
e78566595089 initial import
mandel
parents:
diff changeset
656 }
e78566595089 initial import
mandel
parents:
diff changeset
657
e78566595089 initial import
mandel
parents:
diff changeset
658 void MetaInfoGenerator::writeInclude(QTextStream &s, const Include &inc)
e78566595089 initial import
mandel
parents:
diff changeset
659 {
e78566595089 initial import
mandel
parents:
diff changeset
660 if (inc.name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
661 return;
e78566595089 initial import
mandel
parents:
diff changeset
662
e78566595089 initial import
mandel
parents:
diff changeset
663 s << "#include ";
e78566595089 initial import
mandel
parents:
diff changeset
664 if (inc.type == Include::LocalPath)
e78566595089 initial import
mandel
parents:
diff changeset
665 s << "\"" << inc.name << "\"";
e78566595089 initial import
mandel
parents:
diff changeset
666 else
e78566595089 initial import
mandel
parents:
diff changeset
667 s << "<" << inc.name << ">";
e78566595089 initial import
mandel
parents:
diff changeset
668 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
669 }
e78566595089 initial import
mandel
parents:
diff changeset
670
e78566595089 initial import
mandel
parents:
diff changeset
671 void MetaInfoGenerator::writeIncludeStatements(QTextStream &s, const AbstractMetaClassList &classList,
e78566595089 initial import
mandel
parents:
diff changeset
672 const QString &package)
e78566595089 initial import
mandel
parents:
diff changeset
673 {
e78566595089 initial import
mandel
parents:
diff changeset
674 writeInclude(s, Include(Include::LocalPath, headerFilename()));
e78566595089 initial import
mandel
parents:
diff changeset
675 writeInclude(s, Include(Include::IncludePath, "QMetaType"));
e78566595089 initial import
mandel
parents:
diff changeset
676 writeInclude(s, Include(Include::IncludePath, "QString"));
e78566595089 initial import
mandel
parents:
diff changeset
677 writeInclude(s, Include(Include::IncludePath, "QLatin1String"));
e78566595089 initial import
mandel
parents:
diff changeset
678 writeInclude(s, Include(Include::IncludePath, "QHash"));
e78566595089 initial import
mandel
parents:
diff changeset
679 writeInclude(s, Include(Include::IncludePath, "QReadWriteLock"));
e78566595089 initial import
mandel
parents:
diff changeset
680 writeInclude(s, Include(Include::IncludePath, "QReadLocker"));
e78566595089 initial import
mandel
parents:
diff changeset
681 writeInclude(s, Include(Include::IncludePath, "QWriteLocker"));
e78566595089 initial import
mandel
parents:
diff changeset
682 writeInclude(s, Include(Include::IncludePath, "qtjambi_cache.h"));
e78566595089 initial import
mandel
parents:
diff changeset
683 writeInclude(s, Include(Include::IncludePath, "qtjambi_core.h"));
e78566595089 initial import
mandel
parents:
diff changeset
684
e78566595089 initial import
mandel
parents:
diff changeset
685 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
686 writeInclude(s, Include(Include::IncludePath, "qtjambidebugtools_p.h"));
e78566595089 initial import
mandel
parents:
diff changeset
687 #endif
e78566595089 initial import
mandel
parents:
diff changeset
688
e78566595089 initial import
mandel
parents:
diff changeset
689 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
690
e78566595089 initial import
mandel
parents:
diff changeset
691 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
692 if (generated(cls) && !cls->isInterface() && cls->package() == package) {
e78566595089 initial import
mandel
parents:
diff changeset
693 const ComplexTypeEntry *ctype = cls->typeEntry();
e78566595089 initial import
mandel
parents:
diff changeset
694
e78566595089 initial import
mandel
parents:
diff changeset
695 Include inc = ctype->include();
e78566595089 initial import
mandel
parents:
diff changeset
696 writeInclude(s, inc);
e78566595089 initial import
mandel
parents:
diff changeset
697 }
e78566595089 initial import
mandel
parents:
diff changeset
698 }
e78566595089 initial import
mandel
parents:
diff changeset
699 }
e78566595089 initial import
mandel
parents:
diff changeset
700
e78566595089 initial import
mandel
parents:
diff changeset
701 void MetaInfoGenerator::writeInitializationFunctionName(QTextStream &s, const QString &package, bool fullSignature)
e78566595089 initial import
mandel
parents:
diff changeset
702 {
e78566595089 initial import
mandel
parents:
diff changeset
703 if (fullSignature)
e78566595089 initial import
mandel
parents:
diff changeset
704 s << "void ";
e78566595089 initial import
mandel
parents:
diff changeset
705 s << "__metainfo_init_" << QString(package).replace(".", "_") << "()";
e78566595089 initial import
mandel
parents:
diff changeset
706 }
e78566595089 initial import
mandel
parents:
diff changeset
707
e78566595089 initial import
mandel
parents:
diff changeset
708 void MetaInfoGenerator::writeInitialization(QTextStream &s, const TypeEntry *entry, const AbstractMetaClass *cls,
e78566595089 initial import
mandel
parents:
diff changeset
709 bool registerMetaType)
e78566595089 initial import
mandel
parents:
diff changeset
710 {
e78566595089 initial import
mandel
parents:
diff changeset
711 if (entry->codeGeneration() == TypeEntry::GenerateForSubclass)
e78566595089 initial import
mandel
parents:
diff changeset
712 return;
e78566595089 initial import
mandel
parents:
diff changeset
713
e78566595089 initial import
mandel
parents:
diff changeset
714 if (cls && cls->attributes() & AbstractMetaAttributes::Fake)
e78566595089 initial import
mandel
parents:
diff changeset
715 return;
e78566595089 initial import
mandel
parents:
diff changeset
716
e78566595089 initial import
mandel
parents:
diff changeset
717
e78566595089 initial import
mandel
parents:
diff changeset
718 QString constructorName = entry->customConstructor().name;
e78566595089 initial import
mandel
parents:
diff changeset
719 QString destructorName = entry->customDestructor().name;
e78566595089 initial import
mandel
parents:
diff changeset
720 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
721
e78566595089 initial import
mandel
parents:
diff changeset
722 if (constructorName.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
723 constructorName = "genericConstructor<" + entry->qualifiedCppName() + ">";
e78566595089 initial import
mandel
parents:
diff changeset
724
e78566595089 initial import
mandel
parents:
diff changeset
725 if (destructorName.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
726 destructorName = "genericDestructor<" + entry->qualifiedCppName() + ", __name_" + entry->name() + ">";
e78566595089 initial import
mandel
parents:
diff changeset
727
e78566595089 initial import
mandel
parents:
diff changeset
728 #endif
e78566595089 initial import
mandel
parents:
diff changeset
729
e78566595089 initial import
mandel
parents:
diff changeset
730
e78566595089 initial import
mandel
parents:
diff changeset
731 if (constructorName.isEmpty() != destructorName.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
732 ReportHandler::warning(QString("specify either no custom functions, or both "
e78566595089 initial import
mandel
parents:
diff changeset
733 "constructor and destructor for type '%1'").arg(entry->name()));
e78566595089 initial import
mandel
parents:
diff changeset
734 }
e78566595089 initial import
mandel
parents:
diff changeset
735
e78566595089 initial import
mandel
parents:
diff changeset
736 QString javaPackage = entry->javaPackage();
e78566595089 initial import
mandel
parents:
diff changeset
737
e78566595089 initial import
mandel
parents:
diff changeset
738 QString javaName = entry->lookupName();
e78566595089 initial import
mandel
parents:
diff changeset
739 if(!javaPackage.isEmpty()){
e78566595089 initial import
mandel
parents:
diff changeset
740 javaName.prepend(javaPackage.replace(".", "/") + "/");
e78566595089 initial import
mandel
parents:
diff changeset
741 }
e78566595089 initial import
mandel
parents:
diff changeset
742
e78566595089 initial import
mandel
parents:
diff changeset
743
e78566595089 initial import
mandel
parents:
diff changeset
744 if (entry->isComplex()) {
e78566595089 initial import
mandel
parents:
diff changeset
745 const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(entry);
e78566595089 initial import
mandel
parents:
diff changeset
746 if (centry->typeFlags() & ComplexTypeEntry::DeleteInMainThread)
e78566595089 initial import
mandel
parents:
diff changeset
747 s << " registerDeletionPolicy(\"" << javaName << "\", DeletionPolicyDeleteInMainThread);" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
748 }
e78566595089 initial import
mandel
parents:
diff changeset
749
e78566595089 initial import
mandel
parents:
diff changeset
750 QString qtName = entry->qualifiedCppName();
e78566595089 initial import
mandel
parents:
diff changeset
751 if ((!entry->isInterface())
e78566595089 initial import
mandel
parents:
diff changeset
752 && (!entry->isPrimitive() || ((PrimitiveTypeEntry *) entry)->preferredTargetLangType()))
e78566595089 initial import
mandel
parents:
diff changeset
753 s << " registerQtToJava(\"" << qtName << "\", \"" << javaName << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
754
e78566595089 initial import
mandel
parents:
diff changeset
755 if (!entry->preferredConversion())
e78566595089 initial import
mandel
parents:
diff changeset
756 return ;
e78566595089 initial import
mandel
parents:
diff changeset
757
e78566595089 initial import
mandel
parents:
diff changeset
758 s << " registerJavaToQt(\"" << javaName << "\", \"" << qtName << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
759 if (entry->isComplex() && entry->isObject() && !((ComplexTypeEntry *)entry)->isQObject() && !entry->isInterface()) {
e78566595089 initial import
mandel
parents:
diff changeset
760 QString patchedName = QString(javaName).replace("/", "_").replace("$", "_");
e78566595089 initial import
mandel
parents:
diff changeset
761
e78566595089 initial import
mandel
parents:
diff changeset
762 if(lookupClassWithPublicDestructor(cls))
e78566595089 initial import
mandel
parents:
diff changeset
763 s << " registerDestructor(\"" << javaName << "\", destructor_" << patchedName << ");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
764 }
e78566595089 initial import
mandel
parents:
diff changeset
765
e78566595089 initial import
mandel
parents:
diff changeset
766 if (!registerMetaType)
e78566595089 initial import
mandel
parents:
diff changeset
767 return ;
e78566595089 initial import
mandel
parents:
diff changeset
768
e78566595089 initial import
mandel
parents:
diff changeset
769 int metaType = QMetaType::type(entry->name().toLocal8Bit().constData());
e78566595089 initial import
mandel
parents:
diff changeset
770 if (metaType != QMetaType::Void)
e78566595089 initial import
mandel
parents:
diff changeset
771 return ;
e78566595089 initial import
mandel
parents:
diff changeset
772
e78566595089 initial import
mandel
parents:
diff changeset
773
e78566595089 initial import
mandel
parents:
diff changeset
774 if (!constructorName.isEmpty() && !destructorName.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
775 s << " QMetaType::registerType(\"" << entry->qualifiedCppName() << "\"," << endl
e78566595089 initial import
mandel
parents:
diff changeset
776 << " reinterpret_cast<QMetaType::Destructor>("
e78566595089 initial import
mandel
parents:
diff changeset
777 << destructorName
e78566595089 initial import
mandel
parents:
diff changeset
778 << ")," << endl
e78566595089 initial import
mandel
parents:
diff changeset
779 << " reinterpret_cast<QMetaType::Constructor>("
e78566595089 initial import
mandel
parents:
diff changeset
780 << constructorName
e78566595089 initial import
mandel
parents:
diff changeset
781 << "));" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
782 } else {
e78566595089 initial import
mandel
parents:
diff changeset
783 // Look for default constructor, required for qRegisterMetaType
e78566595089 initial import
mandel
parents:
diff changeset
784 if (cls != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
785 AbstractMetaFunctionList functions = cls->queryFunctions(AbstractMetaClass::WasPublic | AbstractMetaClass::Constructors);
e78566595089 initial import
mandel
parents:
diff changeset
786
e78566595089 initial import
mandel
parents:
diff changeset
787 bool hasDefaultConstructor = false;
e78566595089 initial import
mandel
parents:
diff changeset
788 foreach (AbstractMetaFunction *function, functions) {
e78566595089 initial import
mandel
parents:
diff changeset
789 // Default constructor has to be present
e78566595089 initial import
mandel
parents:
diff changeset
790 if (function->wasPublic() && function->actualMinimumArgumentCount() == 0)
e78566595089 initial import
mandel
parents:
diff changeset
791 hasDefaultConstructor = true;
e78566595089 initial import
mandel
parents:
diff changeset
792 }
e78566595089 initial import
mandel
parents:
diff changeset
793
e78566595089 initial import
mandel
parents:
diff changeset
794 if (!hasDefaultConstructor) {
e78566595089 initial import
mandel
parents:
diff changeset
795 ReportHandler::warning(QString("Value type '%1' is missing a default constructor. "
e78566595089 initial import
mandel
parents:
diff changeset
796 "The resulting C++ code will not compile. If necessary, use <custom-constructor> and "
e78566595089 initial import
mandel
parents:
diff changeset
797 "<custom-destructor> tags to provide the constructors.").arg(cls->fullName()));
e78566595089 initial import
mandel
parents:
diff changeset
798 }
e78566595089 initial import
mandel
parents:
diff changeset
799
e78566595089 initial import
mandel
parents:
diff changeset
800 }
e78566595089 initial import
mandel
parents:
diff changeset
801 s << " qRegisterMetaType<" << entry->qualifiedCppName() << ">(\"" << entry->qualifiedCppName() << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
802 }
e78566595089 initial import
mandel
parents:
diff changeset
803
e78566595089 initial import
mandel
parents:
diff changeset
804 }