annotate generator/metainfogenerator.cpp @ 381:347e4c7a9ba1

make QwtD compile on Windows@
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Sun, 11 Jul 2010 01:59:42 +0100
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 }