annotate generator/metainfogenerator.cpp @ 55:63c31e221118

CMake: Add forgotten files to install.
author SokoL_SD
date Mon, 18 May 2009 19:03:06 +0000
parents e78566595089
children 1349940724eb
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
e78566595089 initial import
mandel
parents:
diff changeset
385 QString pro_file_name = cls->package().replace(".", "_") + "/" + cls->package().replace(".", "_") + ".pri";
e78566595089 initial import
mandel
parents:
diff changeset
386 priGenerator->addSource(pro_file_name, cppFilename());
e78566595089 initial import
mandel
parents:
diff changeset
387 }
e78566595089 initial import
mandel
parents:
diff changeset
388
e78566595089 initial import
mandel
parents:
diff changeset
389 if (!(cls->attributes() & AbstractMetaAttributes::Fake)) {
e78566595089 initial import
mandel
parents:
diff changeset
390 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
391 if (cls->typeEntry()->isObject()
e78566595089 initial import
mandel
parents:
diff changeset
392 && !cls->typeEntry()->isQObject()
e78566595089 initial import
mandel
parents:
diff changeset
393 && !cls->isInterface()) {
e78566595089 initial import
mandel
parents:
diff changeset
394 writeDestructors(f->stream, cls);
e78566595089 initial import
mandel
parents:
diff changeset
395 }
e78566595089 initial import
mandel
parents:
diff changeset
396 writeCustomStructors(f->stream, cls->typeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
397 }
e78566595089 initial import
mandel
parents:
diff changeset
398
e78566595089 initial import
mandel
parents:
diff changeset
399 if (cls->typeEntry()->isPolymorphicBase())
e78566595089 initial import
mandel
parents:
diff changeset
400 classes_with_polymorphic_id.append(cls);
e78566595089 initial import
mandel
parents:
diff changeset
401 }
e78566595089 initial import
mandel
parents:
diff changeset
402
e78566595089 initial import
mandel
parents:
diff changeset
403 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
404 if (cls->typeEntry()->isValue() && shouldGenerate(cls->typeEntry()))
e78566595089 initial import
mandel
parents:
diff changeset
405 writeNameLiteral(f->stream, cls->typeEntry(), f->name());
e78566595089 initial import
mandel
parents:
diff changeset
406 #endif
e78566595089 initial import
mandel
parents:
diff changeset
407 }
e78566595089 initial import
mandel
parents:
diff changeset
408
e78566595089 initial import
mandel
parents:
diff changeset
409 QHash<QString, QStringList> handlers_to_register;
e78566595089 initial import
mandel
parents:
diff changeset
410 foreach (QString package, fileHash.keys()) {
e78566595089 initial import
mandel
parents:
diff changeset
411 FileOut *f = fileHash.value(package, 0);
e78566595089 initial import
mandel
parents:
diff changeset
412 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
413 writeSignalsAndSlots(f->stream, package);
e78566595089 initial import
mandel
parents:
diff changeset
414 writeEnums(f->stream, package);
e78566595089 initial import
mandel
parents:
diff changeset
415 handlers_to_register[package] = writePolymorphicHandler(f->stream, package, classes_with_polymorphic_id);
e78566595089 initial import
mandel
parents:
diff changeset
416 }
e78566595089 initial import
mandel
parents:
diff changeset
417 }
e78566595089 initial import
mandel
parents:
diff changeset
418
e78566595089 initial import
mandel
parents:
diff changeset
419 // Primitive types must be added to all packages, in case the other packages are
e78566595089 initial import
mandel
parents:
diff changeset
420 // not referenced from the generated code.
e78566595089 initial import
mandel
parents:
diff changeset
421 foreach (FileOut *f, fileHash.values()) {
e78566595089 initial import
mandel
parents:
diff changeset
422 for (it=entries.begin(); it!=entries.end(); ++it) {
e78566595089 initial import
mandel
parents:
diff changeset
423 QList<TypeEntry *> entries = it.value();
e78566595089 initial import
mandel
parents:
diff changeset
424 foreach (TypeEntry *entry, entries) {
e78566595089 initial import
mandel
parents:
diff changeset
425 if (shouldGenerate(entry) && entry->isPrimitive()) {
e78566595089 initial import
mandel
parents:
diff changeset
426 writeCustomStructors(f->stream, entry);
e78566595089 initial import
mandel
parents:
diff changeset
427 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
428 writeNameLiteral(f->stream, entry, f->name());
e78566595089 initial import
mandel
parents:
diff changeset
429 #endif
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
e78566595089 initial import
mandel
parents:
diff changeset
434 // Initialization function: Registers meta types
e78566595089 initial import
mandel
parents:
diff changeset
435 writeInitializationFunctionName(f->stream, fileHash.key(f, ""), true);
e78566595089 initial import
mandel
parents:
diff changeset
436 f->stream << endl << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
437 for (it=entries.begin(); it!=entries.end(); ++it) {
e78566595089 initial import
mandel
parents:
diff changeset
438 QList<TypeEntry *> entries = it.value();
e78566595089 initial import
mandel
parents:
diff changeset
439 foreach (TypeEntry *entry, entries) {
e78566595089 initial import
mandel
parents:
diff changeset
440 if (entry &&
e78566595089 initial import
mandel
parents:
diff changeset
441 ( (shouldGenerate(entry) && entry->isPrimitive())
e78566595089 initial import
mandel
parents:
diff changeset
442 || entry->isString()
e78566595089 initial import
mandel
parents:
diff changeset
443 || entry->isChar())) {
e78566595089 initial import
mandel
parents:
diff changeset
444 writeInitialization(f->stream, entry, 0);
e78566595089 initial import
mandel
parents:
diff changeset
445 }
e78566595089 initial import
mandel
parents:
diff changeset
446 }
e78566595089 initial import
mandel
parents:
diff changeset
447 }
e78566595089 initial import
mandel
parents:
diff changeset
448 writeRegisterSignalsAndSlots(f->stream);
e78566595089 initial import
mandel
parents:
diff changeset
449 writeRegisterEnums(f->stream);
e78566595089 initial import
mandel
parents:
diff changeset
450 }
e78566595089 initial import
mandel
parents:
diff changeset
451
e78566595089 initial import
mandel
parents:
diff changeset
452 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
453 FileOut *f = fileHash.value(cls->package(), 0);
e78566595089 initial import
mandel
parents:
diff changeset
454
e78566595089 initial import
mandel
parents:
diff changeset
455 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
456 writeInitialization(f->stream, cls->typeEntry(), cls, shouldGenerate(cls));
e78566595089 initial import
mandel
parents:
diff changeset
457 }
e78566595089 initial import
mandel
parents:
diff changeset
458 }
e78566595089 initial import
mandel
parents:
diff changeset
459
e78566595089 initial import
mandel
parents:
diff changeset
460 foreach (QString package, fileHash.keys()) {
e78566595089 initial import
mandel
parents:
diff changeset
461 FileOut *f = fileHash.value(package, 0);
e78566595089 initial import
mandel
parents:
diff changeset
462 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
463 foreach (QString handler, handlers_to_register.value(package, QStringList())) {
e78566595089 initial import
mandel
parents:
diff changeset
464 f->stream << " qtjambi_register_polymorphic_id(\"" << handler << "\","
e78566595089 initial import
mandel
parents:
diff changeset
465 << "polymorphichandler_" << handler << ");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
466 }
e78566595089 initial import
mandel
parents:
diff changeset
467
e78566595089 initial import
mandel
parents:
diff changeset
468 f->stream << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
469 if( f->done() )
e78566595089 initial import
mandel
parents:
diff changeset
470 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
471 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
472
e78566595089 initial import
mandel
parents:
diff changeset
473 delete f;
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
e78566595089 initial import
mandel
parents:
diff changeset
478 void MetaInfoGenerator::writeHeaderFile()
e78566595089 initial import
mandel
parents:
diff changeset
479 {
e78566595089 initial import
mandel
parents:
diff changeset
480 AbstractMetaClassList classList = classes();
e78566595089 initial import
mandel
parents:
diff changeset
481 QHash<QString, bool> fileHash;
e78566595089 initial import
mandel
parents:
diff changeset
482
e78566595089 initial import
mandel
parents:
diff changeset
483 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
484 bool hasGenerated = fileHash.value(cls->package(), false);
e78566595089 initial import
mandel
parents:
diff changeset
485 if (!hasGenerated && generated(cls)) {
e78566595089 initial import
mandel
parents:
diff changeset
486 FileOut file(outputDirectory() + "/" + subDirectoryForClass(cls, CppDirectory) + "/" + headerFilename());
e78566595089 initial import
mandel
parents:
diff changeset
487 file.stream << "#ifndef " << filenameStub().toUpper() << "_H" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
488 file.stream << "#define " << filenameStub().toUpper() << "_H" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
489 writeInitializationFunctionName(file.stream, cls->package(), true);
e78566595089 initial import
mandel
parents:
diff changeset
490 file.stream << ";" << endl << "#endif" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
491
e78566595089 initial import
mandel
parents:
diff changeset
492 fileHash.insert(cls->package(), true);
e78566595089 initial import
mandel
parents:
diff changeset
493
e78566595089 initial import
mandel
parents:
diff changeset
494 QString pro_file_name = cls->package().replace(".", "_") + "/" + cls->package().replace(".", "_") + ".pri";
e78566595089 initial import
mandel
parents:
diff changeset
495 priGenerator->addHeader(pro_file_name, headerFilename());
e78566595089 initial import
mandel
parents:
diff changeset
496
e78566595089 initial import
mandel
parents:
diff changeset
497 if( file.done() )
e78566595089 initial import
mandel
parents:
diff changeset
498 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
499 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
500 }
e78566595089 initial import
mandel
parents:
diff changeset
501 }
e78566595089 initial import
mandel
parents:
diff changeset
502 }
e78566595089 initial import
mandel
parents:
diff changeset
503
e78566595089 initial import
mandel
parents:
diff changeset
504 void MetaInfoGenerator::writeCodeBlock(QTextStream &s, const QString &code)
e78566595089 initial import
mandel
parents:
diff changeset
505 {
e78566595089 initial import
mandel
parents:
diff changeset
506 QStringList lines = code.split('\n');
e78566595089 initial import
mandel
parents:
diff changeset
507 QString indent;
e78566595089 initial import
mandel
parents:
diff changeset
508 foreach (QString str, lines) {
e78566595089 initial import
mandel
parents:
diff changeset
509 s << " " << indent << str.trimmed() << endl;
e78566595089 initial import
mandel
parents:
diff changeset
510 if (!str.trimmed().endsWith(";") && !str.trimmed().isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
511 indent = " ";
e78566595089 initial import
mandel
parents:
diff changeset
512 else
e78566595089 initial import
mandel
parents:
diff changeset
513 indent = "";
e78566595089 initial import
mandel
parents:
diff changeset
514 }
e78566595089 initial import
mandel
parents:
diff changeset
515 }
e78566595089 initial import
mandel
parents:
diff changeset
516
e78566595089 initial import
mandel
parents:
diff changeset
517 const AbstractMetaClass* MetaInfoGenerator::lookupClassWithPublicDestructor(const AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
518 {
e78566595089 initial import
mandel
parents:
diff changeset
519 while (cls != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
520 if (cls->hasPublicDestructor()) {
e78566595089 initial import
mandel
parents:
diff changeset
521 return cls;
e78566595089 initial import
mandel
parents:
diff changeset
522 } else {
e78566595089 initial import
mandel
parents:
diff changeset
523 cls = cls->baseClass();
e78566595089 initial import
mandel
parents:
diff changeset
524 }
e78566595089 initial import
mandel
parents:
diff changeset
525 }
e78566595089 initial import
mandel
parents:
diff changeset
526 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
527 }
e78566595089 initial import
mandel
parents:
diff changeset
528
e78566595089 initial import
mandel
parents:
diff changeset
529 void MetaInfoGenerator::writeDestructors(QTextStream &s, const AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
530 {
e78566595089 initial import
mandel
parents:
diff changeset
531 // We can only delete classes with public destructors
e78566595089 initial import
mandel
parents:
diff changeset
532 const AbstractMetaClass *clsWithPublicDestructor = lookupClassWithPublicDestructor(cls);
e78566595089 initial import
mandel
parents:
diff changeset
533 if(clsWithPublicDestructor != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
534 const ComplexTypeEntry *entry = cls->typeEntry();
e78566595089 initial import
mandel
parents:
diff changeset
535 if ((entry->codeGeneration() & TypeEntry::GenerateCode) != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
536 s << "void destructor_" << entry->javaPackage().replace(".", "_") << "_"
e78566595089 initial import
mandel
parents:
diff changeset
537 << entry->lookupName().replace(".", "_").replace("$", "_") << "(void *ptr)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
538 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
539 << " delete reinterpret_cast<" << clsWithPublicDestructor->qualifiedCppName() << " *>(ptr);" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
540
e78566595089 initial import
mandel
parents:
diff changeset
541 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
542 s << " qtjambi_increase_destructorFunctionCalledCount(QString::fromLatin1(\"" << cls->name() << "\"));" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
543 #endif
e78566595089 initial import
mandel
parents:
diff changeset
544
e78566595089 initial import
mandel
parents:
diff changeset
545 s << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
546 }
e78566595089 initial import
mandel
parents:
diff changeset
547 }
e78566595089 initial import
mandel
parents:
diff changeset
548 }
e78566595089 initial import
mandel
parents:
diff changeset
549
e78566595089 initial import
mandel
parents:
diff changeset
550 void MetaInfoGenerator::writeCustomStructors(QTextStream &s, const TypeEntry *entry)
e78566595089 initial import
mandel
parents:
diff changeset
551 {
e78566595089 initial import
mandel
parents:
diff changeset
552 if (!entry->preferredConversion())
e78566595089 initial import
mandel
parents:
diff changeset
553 return ;
e78566595089 initial import
mandel
parents:
diff changeset
554
e78566595089 initial import
mandel
parents:
diff changeset
555 CustomFunction customConstructor = entry->customConstructor();
e78566595089 initial import
mandel
parents:
diff changeset
556 CustomFunction customDestructor = entry->customDestructor();
e78566595089 initial import
mandel
parents:
diff changeset
557
e78566595089 initial import
mandel
parents:
diff changeset
558 if (!customConstructor.name.isEmpty() && !customDestructor.name.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
559 s << "// Custom constructor and destructor for " << entry->qualifiedCppName() << endl
e78566595089 initial import
mandel
parents:
diff changeset
560 << "static void *" << customConstructor.name << "("
e78566595089 initial import
mandel
parents:
diff changeset
561 << "const " << entry->qualifiedCppName() << " *" << customConstructor.param_name
e78566595089 initial import
mandel
parents:
diff changeset
562 << ")" << endl
e78566595089 initial import
mandel
parents:
diff changeset
563 << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
564 writeCodeBlock(s, customConstructor.code());
e78566595089 initial import
mandel
parents:
diff changeset
565 s << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
566
e78566595089 initial import
mandel
parents:
diff changeset
567 s << "static void " << customDestructor.name << "("
e78566595089 initial import
mandel
parents:
diff changeset
568 << "const " << entry->qualifiedCppName() << " *" << customDestructor.param_name
e78566595089 initial import
mandel
parents:
diff changeset
569 << ")" << endl
e78566595089 initial import
mandel
parents:
diff changeset
570 << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
571 writeCodeBlock(s, customDestructor.code());
e78566595089 initial import
mandel
parents:
diff changeset
572 s << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
573 }
e78566595089 initial import
mandel
parents:
diff changeset
574 }
e78566595089 initial import
mandel
parents:
diff changeset
575
e78566595089 initial import
mandel
parents:
diff changeset
576 static void generateInitializer(QTextStream &s, const QString &package, CodeSnip::Position pos)
e78566595089 initial import
mandel
parents:
diff changeset
577 {
e78566595089 initial import
mandel
parents:
diff changeset
578 QList<CodeSnip> snips =
e78566595089 initial import
mandel
parents:
diff changeset
579 ((TypeSystemTypeEntry *) TypeDatabase::instance()->findType(package))->snips;
e78566595089 initial import
mandel
parents:
diff changeset
580
e78566595089 initial import
mandel
parents:
diff changeset
581 foreach (const CodeSnip &snip, snips)
e78566595089 initial import
mandel
parents:
diff changeset
582 if (snip.position == pos)
e78566595089 initial import
mandel
parents:
diff changeset
583 s << snip.code();
e78566595089 initial import
mandel
parents:
diff changeset
584 }
e78566595089 initial import
mandel
parents:
diff changeset
585
e78566595089 initial import
mandel
parents:
diff changeset
586 void MetaInfoGenerator::writeLibraryInitializers()
e78566595089 initial import
mandel
parents:
diff changeset
587 {
e78566595089 initial import
mandel
parents:
diff changeset
588 // from cppimplgenerator.cpp
e78566595089 initial import
mandel
parents:
diff changeset
589 extern QString jni_function_signature(QString package,
e78566595089 initial import
mandel
parents:
diff changeset
590 QString class_name,
e78566595089 initial import
mandel
parents:
diff changeset
591 const QString &function_name,
e78566595089 initial import
mandel
parents:
diff changeset
592 const QString &return_type,
e78566595089 initial import
mandel
parents:
diff changeset
593 const QString &mangled_arguments = QString(),
e78566595089 initial import
mandel
parents:
diff changeset
594 uint options = CppImplGenerator::StandardJNISignature);
e78566595089 initial import
mandel
parents:
diff changeset
595
e78566595089 initial import
mandel
parents:
diff changeset
596 // We need to generate a library initializer in Java for all packages
e78566595089 initial import
mandel
parents:
diff changeset
597 // that have generated classes in Java, and in C++ for all packages
e78566595089 initial import
mandel
parents:
diff changeset
598 // that have generated metainfo.
e78566595089 initial import
mandel
parents:
diff changeset
599
e78566595089 initial import
mandel
parents:
diff changeset
600 QList<QString> known_packages = m_skip_list.keys();
e78566595089 initial import
mandel
parents:
diff changeset
601 foreach (QString package, known_packages) {
e78566595089 initial import
mandel
parents:
diff changeset
602 if (generatedMetaInfo(package)) { // write cpp file
e78566595089 initial import
mandel
parents:
diff changeset
603
e78566595089 initial import
mandel
parents:
diff changeset
604 FileOut fileOut(outputDirectory() + "/" + subDirectoryForPackage(package, CppDirectory) + "/qtjambi_libraryinitializer.cpp");
e78566595089 initial import
mandel
parents:
diff changeset
605
e78566595089 initial import
mandel
parents:
diff changeset
606 QString signature = jni_function_signature(package, "QtJambi_LibraryInitializer",
e78566595089 initial import
mandel
parents:
diff changeset
607 "__qt_initLibrary", "void");
e78566595089 initial import
mandel
parents:
diff changeset
608 QTextStream &s = fileOut.stream;
e78566595089 initial import
mandel
parents:
diff changeset
609 s << "#include \"metainfo.h\"" << endl
e78566595089 initial import
mandel
parents:
diff changeset
610 << "#include \"qtjambi_global.h\"" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
611 << signature << "(JNIEnv *, jclass)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
612 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
613 << " ";
e78566595089 initial import
mandel
parents:
diff changeset
614 writeInitializationFunctionName(s, package, false);
e78566595089 initial import
mandel
parents:
diff changeset
615 s << ";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
616 << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
617
e78566595089 initial import
mandel
parents:
diff changeset
618 QString pro_file_name = QString(package).replace(".", "_");
e78566595089 initial import
mandel
parents:
diff changeset
619
e78566595089 initial import
mandel
parents:
diff changeset
620 priGenerator->addSource(pro_file_name + "/" + pro_file_name + ".pri", "qtjambi_libraryinitializer.cpp");
e78566595089 initial import
mandel
parents:
diff changeset
621
e78566595089 initial import
mandel
parents:
diff changeset
622 if( fileOut.done() )
e78566595089 initial import
mandel
parents:
diff changeset
623 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
624 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
625 }
e78566595089 initial import
mandel
parents:
diff changeset
626
e78566595089 initial import
mandel
parents:
diff changeset
627 if (generatedJavaClasses(package)) {
e78566595089 initial import
mandel
parents:
diff changeset
628
e78566595089 initial import
mandel
parents:
diff changeset
629 FileOut fileOut(outputDirectory() + "/" + subDirectoryForPackage(package, JavaDirectory) + "/QtJambi_LibraryInitializer.java");
e78566595089 initial import
mandel
parents:
diff changeset
630
e78566595089 initial import
mandel
parents:
diff changeset
631 QTextStream &s = fileOut.stream;
e78566595089 initial import
mandel
parents:
diff changeset
632 s << "package " << package << ";" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
633 << "class QtJambi_LibraryInitializer" << endl
e78566595089 initial import
mandel
parents:
diff changeset
634 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
635 << " static {" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
636
e78566595089 initial import
mandel
parents:
diff changeset
637 generateInitializer(s, package, CodeSnip::Beginning);
e78566595089 initial import
mandel
parents:
diff changeset
638
e78566595089 initial import
mandel
parents:
diff changeset
639 s << " qt.Utilities.loadJambiLibrary(\""
e78566595089 initial import
mandel
parents:
diff changeset
640 << QString(package).replace(".", "_") << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
641
e78566595089 initial import
mandel
parents:
diff changeset
642 if (generatedMetaInfo(package))
e78566595089 initial import
mandel
parents:
diff changeset
643 s << " __qt_initLibrary();" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
644
e78566595089 initial import
mandel
parents:
diff changeset
645 generateInitializer(s, package, CodeSnip::End);
e78566595089 initial import
mandel
parents:
diff changeset
646
e78566595089 initial import
mandel
parents:
diff changeset
647 s << " }" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
648
e78566595089 initial import
mandel
parents:
diff changeset
649 if (generatedMetaInfo(package))
e78566595089 initial import
mandel
parents:
diff changeset
650 s << " private native static void __qt_initLibrary();" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
651
e78566595089 initial import
mandel
parents:
diff changeset
652 s << " static void init() { };" << endl
e78566595089 initial import
mandel
parents:
diff changeset
653 << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
654
e78566595089 initial import
mandel
parents:
diff changeset
655 if( fileOut.done() )
e78566595089 initial import
mandel
parents:
diff changeset
656 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
657 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
658 }
e78566595089 initial import
mandel
parents:
diff changeset
659 }
e78566595089 initial import
mandel
parents:
diff changeset
660 }
e78566595089 initial import
mandel
parents:
diff changeset
661
e78566595089 initial import
mandel
parents:
diff changeset
662 void MetaInfoGenerator::writeInclude(QTextStream &s, const Include &inc)
e78566595089 initial import
mandel
parents:
diff changeset
663 {
e78566595089 initial import
mandel
parents:
diff changeset
664 if (inc.name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
665 return;
e78566595089 initial import
mandel
parents:
diff changeset
666
e78566595089 initial import
mandel
parents:
diff changeset
667 s << "#include ";
e78566595089 initial import
mandel
parents:
diff changeset
668 if (inc.type == Include::LocalPath)
e78566595089 initial import
mandel
parents:
diff changeset
669 s << "\"" << inc.name << "\"";
e78566595089 initial import
mandel
parents:
diff changeset
670 else
e78566595089 initial import
mandel
parents:
diff changeset
671 s << "<" << inc.name << ">";
e78566595089 initial import
mandel
parents:
diff changeset
672 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
673 }
e78566595089 initial import
mandel
parents:
diff changeset
674
e78566595089 initial import
mandel
parents:
diff changeset
675 void MetaInfoGenerator::writeIncludeStatements(QTextStream &s, const AbstractMetaClassList &classList,
e78566595089 initial import
mandel
parents:
diff changeset
676 const QString &package)
e78566595089 initial import
mandel
parents:
diff changeset
677 {
e78566595089 initial import
mandel
parents:
diff changeset
678 writeInclude(s, Include(Include::LocalPath, headerFilename()));
e78566595089 initial import
mandel
parents:
diff changeset
679 writeInclude(s, Include(Include::IncludePath, "QMetaType"));
e78566595089 initial import
mandel
parents:
diff changeset
680 writeInclude(s, Include(Include::IncludePath, "QString"));
e78566595089 initial import
mandel
parents:
diff changeset
681 writeInclude(s, Include(Include::IncludePath, "QLatin1String"));
e78566595089 initial import
mandel
parents:
diff changeset
682 writeInclude(s, Include(Include::IncludePath, "QHash"));
e78566595089 initial import
mandel
parents:
diff changeset
683 writeInclude(s, Include(Include::IncludePath, "QReadWriteLock"));
e78566595089 initial import
mandel
parents:
diff changeset
684 writeInclude(s, Include(Include::IncludePath, "QReadLocker"));
e78566595089 initial import
mandel
parents:
diff changeset
685 writeInclude(s, Include(Include::IncludePath, "QWriteLocker"));
e78566595089 initial import
mandel
parents:
diff changeset
686 writeInclude(s, Include(Include::IncludePath, "qtjambi_cache.h"));
e78566595089 initial import
mandel
parents:
diff changeset
687 writeInclude(s, Include(Include::IncludePath, "qtjambi_core.h"));
e78566595089 initial import
mandel
parents:
diff changeset
688
e78566595089 initial import
mandel
parents:
diff changeset
689 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
690 writeInclude(s, Include(Include::IncludePath, "qtjambidebugtools_p.h"));
e78566595089 initial import
mandel
parents:
diff changeset
691 #endif
e78566595089 initial import
mandel
parents:
diff changeset
692
e78566595089 initial import
mandel
parents:
diff changeset
693 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
694
e78566595089 initial import
mandel
parents:
diff changeset
695 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
696 if (generated(cls) && !cls->isInterface() && cls->package() == package) {
e78566595089 initial import
mandel
parents:
diff changeset
697 const ComplexTypeEntry *ctype = cls->typeEntry();
e78566595089 initial import
mandel
parents:
diff changeset
698
e78566595089 initial import
mandel
parents:
diff changeset
699 Include inc = ctype->include();
e78566595089 initial import
mandel
parents:
diff changeset
700 writeInclude(s, inc);
e78566595089 initial import
mandel
parents:
diff changeset
701 }
e78566595089 initial import
mandel
parents:
diff changeset
702 }
e78566595089 initial import
mandel
parents:
diff changeset
703 }
e78566595089 initial import
mandel
parents:
diff changeset
704
e78566595089 initial import
mandel
parents:
diff changeset
705 void MetaInfoGenerator::writeInitializationFunctionName(QTextStream &s, const QString &package, bool fullSignature)
e78566595089 initial import
mandel
parents:
diff changeset
706 {
e78566595089 initial import
mandel
parents:
diff changeset
707 if (fullSignature)
e78566595089 initial import
mandel
parents:
diff changeset
708 s << "void ";
e78566595089 initial import
mandel
parents:
diff changeset
709 s << "__metainfo_init_" << QString(package).replace(".", "_") << "()";
e78566595089 initial import
mandel
parents:
diff changeset
710 }
e78566595089 initial import
mandel
parents:
diff changeset
711
e78566595089 initial import
mandel
parents:
diff changeset
712 void MetaInfoGenerator::writeInitialization(QTextStream &s, const TypeEntry *entry, const AbstractMetaClass *cls,
e78566595089 initial import
mandel
parents:
diff changeset
713 bool registerMetaType)
e78566595089 initial import
mandel
parents:
diff changeset
714 {
e78566595089 initial import
mandel
parents:
diff changeset
715 if (entry->codeGeneration() == TypeEntry::GenerateForSubclass)
e78566595089 initial import
mandel
parents:
diff changeset
716 return;
e78566595089 initial import
mandel
parents:
diff changeset
717
e78566595089 initial import
mandel
parents:
diff changeset
718 if (cls && cls->attributes() & AbstractMetaAttributes::Fake)
e78566595089 initial import
mandel
parents:
diff changeset
719 return;
e78566595089 initial import
mandel
parents:
diff changeset
720
e78566595089 initial import
mandel
parents:
diff changeset
721
e78566595089 initial import
mandel
parents:
diff changeset
722 QString constructorName = entry->customConstructor().name;
e78566595089 initial import
mandel
parents:
diff changeset
723 QString destructorName = entry->customDestructor().name;
e78566595089 initial import
mandel
parents:
diff changeset
724 #if defined(QTJAMBI_DEBUG_TOOLS)
e78566595089 initial import
mandel
parents:
diff changeset
725
e78566595089 initial import
mandel
parents:
diff changeset
726 if (constructorName.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
727 constructorName = "genericConstructor<" + entry->qualifiedCppName() + ">";
e78566595089 initial import
mandel
parents:
diff changeset
728
e78566595089 initial import
mandel
parents:
diff changeset
729 if (destructorName.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
730 destructorName = "genericDestructor<" + entry->qualifiedCppName() + ", __name_" + entry->name() + ">";
e78566595089 initial import
mandel
parents:
diff changeset
731
e78566595089 initial import
mandel
parents:
diff changeset
732 #endif
e78566595089 initial import
mandel
parents:
diff changeset
733
e78566595089 initial import
mandel
parents:
diff changeset
734
e78566595089 initial import
mandel
parents:
diff changeset
735 if (constructorName.isEmpty() != destructorName.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
736 ReportHandler::warning(QString("specify either no custom functions, or both "
e78566595089 initial import
mandel
parents:
diff changeset
737 "constructor and destructor for type '%1'").arg(entry->name()));
e78566595089 initial import
mandel
parents:
diff changeset
738 }
e78566595089 initial import
mandel
parents:
diff changeset
739
e78566595089 initial import
mandel
parents:
diff changeset
740 QString javaPackage = entry->javaPackage();
e78566595089 initial import
mandel
parents:
diff changeset
741
e78566595089 initial import
mandel
parents:
diff changeset
742 QString javaName = entry->lookupName();
e78566595089 initial import
mandel
parents:
diff changeset
743 if(!javaPackage.isEmpty()){
e78566595089 initial import
mandel
parents:
diff changeset
744 javaName.prepend(javaPackage.replace(".", "/") + "/");
e78566595089 initial import
mandel
parents:
diff changeset
745 }
e78566595089 initial import
mandel
parents:
diff changeset
746
e78566595089 initial import
mandel
parents:
diff changeset
747
e78566595089 initial import
mandel
parents:
diff changeset
748 if (entry->isComplex()) {
e78566595089 initial import
mandel
parents:
diff changeset
749 const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(entry);
e78566595089 initial import
mandel
parents:
diff changeset
750 if (centry->typeFlags() & ComplexTypeEntry::DeleteInMainThread)
e78566595089 initial import
mandel
parents:
diff changeset
751 s << " registerDeletionPolicy(\"" << javaName << "\", DeletionPolicyDeleteInMainThread);" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
752 }
e78566595089 initial import
mandel
parents:
diff changeset
753
e78566595089 initial import
mandel
parents:
diff changeset
754 QString qtName = entry->qualifiedCppName();
e78566595089 initial import
mandel
parents:
diff changeset
755 if ((!entry->isInterface())
e78566595089 initial import
mandel
parents:
diff changeset
756 && (!entry->isPrimitive() || ((PrimitiveTypeEntry *) entry)->preferredTargetLangType()))
e78566595089 initial import
mandel
parents:
diff changeset
757 s << " registerQtToJava(\"" << qtName << "\", \"" << javaName << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
758
e78566595089 initial import
mandel
parents:
diff changeset
759 if (!entry->preferredConversion())
e78566595089 initial import
mandel
parents:
diff changeset
760 return ;
e78566595089 initial import
mandel
parents:
diff changeset
761
e78566595089 initial import
mandel
parents:
diff changeset
762 s << " registerJavaToQt(\"" << javaName << "\", \"" << qtName << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
763 if (entry->isComplex() && entry->isObject() && !((ComplexTypeEntry *)entry)->isQObject() && !entry->isInterface()) {
e78566595089 initial import
mandel
parents:
diff changeset
764 QString patchedName = QString(javaName).replace("/", "_").replace("$", "_");
e78566595089 initial import
mandel
parents:
diff changeset
765
e78566595089 initial import
mandel
parents:
diff changeset
766 if(lookupClassWithPublicDestructor(cls))
e78566595089 initial import
mandel
parents:
diff changeset
767 s << " registerDestructor(\"" << javaName << "\", destructor_" << patchedName << ");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
768 }
e78566595089 initial import
mandel
parents:
diff changeset
769
e78566595089 initial import
mandel
parents:
diff changeset
770 if (!registerMetaType)
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 int metaType = QMetaType::type(entry->name().toLocal8Bit().constData());
e78566595089 initial import
mandel
parents:
diff changeset
774 if (metaType != QMetaType::Void)
e78566595089 initial import
mandel
parents:
diff changeset
775 return ;
e78566595089 initial import
mandel
parents:
diff changeset
776
e78566595089 initial import
mandel
parents:
diff changeset
777
e78566595089 initial import
mandel
parents:
diff changeset
778 if (!constructorName.isEmpty() && !destructorName.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
779 s << " QMetaType::registerType(\"" << entry->qualifiedCppName() << "\"," << endl
e78566595089 initial import
mandel
parents:
diff changeset
780 << " reinterpret_cast<QMetaType::Destructor>("
e78566595089 initial import
mandel
parents:
diff changeset
781 << destructorName
e78566595089 initial import
mandel
parents:
diff changeset
782 << ")," << endl
e78566595089 initial import
mandel
parents:
diff changeset
783 << " reinterpret_cast<QMetaType::Constructor>("
e78566595089 initial import
mandel
parents:
diff changeset
784 << constructorName
e78566595089 initial import
mandel
parents:
diff changeset
785 << "));" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
786 } else {
e78566595089 initial import
mandel
parents:
diff changeset
787 // Look for default constructor, required for qRegisterMetaType
e78566595089 initial import
mandel
parents:
diff changeset
788 if (cls != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
789 AbstractMetaFunctionList functions = cls->queryFunctions(AbstractMetaClass::WasPublic | AbstractMetaClass::Constructors);
e78566595089 initial import
mandel
parents:
diff changeset
790
e78566595089 initial import
mandel
parents:
diff changeset
791 bool hasDefaultConstructor = false;
e78566595089 initial import
mandel
parents:
diff changeset
792 foreach (AbstractMetaFunction *function, functions) {
e78566595089 initial import
mandel
parents:
diff changeset
793 // Default constructor has to be present
e78566595089 initial import
mandel
parents:
diff changeset
794 if (function->wasPublic() && function->actualMinimumArgumentCount() == 0)
e78566595089 initial import
mandel
parents:
diff changeset
795 hasDefaultConstructor = true;
e78566595089 initial import
mandel
parents:
diff changeset
796 }
e78566595089 initial import
mandel
parents:
diff changeset
797
e78566595089 initial import
mandel
parents:
diff changeset
798 if (!hasDefaultConstructor) {
e78566595089 initial import
mandel
parents:
diff changeset
799 ReportHandler::warning(QString("Value type '%1' is missing a default constructor. "
e78566595089 initial import
mandel
parents:
diff changeset
800 "The resulting C++ code will not compile. If necessary, use <custom-constructor> and "
e78566595089 initial import
mandel
parents:
diff changeset
801 "<custom-destructor> tags to provide the constructors.").arg(cls->fullName()));
e78566595089 initial import
mandel
parents:
diff changeset
802 }
e78566595089 initial import
mandel
parents:
diff changeset
803
e78566595089 initial import
mandel
parents:
diff changeset
804 }
e78566595089 initial import
mandel
parents:
diff changeset
805 s << " qRegisterMetaType<" << entry->qualifiedCppName() << ">(\"" << entry->qualifiedCppName() << "\");" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
806 }
e78566595089 initial import
mandel
parents:
diff changeset
807
e78566595089 initial import
mandel
parents:
diff changeset
808 }