annotate generator/generator.cpp @ 357:9784459f0750

An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables Q_CLASSINFO implementation Now Qtd can be built on Windows
author Max Samukha <maxter@spambox.com>
date Wed, 02 Jun 2010 19:38:05 +0300
parents 073b9153ed8a
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 "generator.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "reporthandler.h"
e78566595089 initial import
mandel
parents:
diff changeset
44 #include "fileout.h"
e78566595089 initial import
mandel
parents:
diff changeset
45
e78566595089 initial import
mandel
parents:
diff changeset
46 #include <QDir>
e78566595089 initial import
mandel
parents:
diff changeset
47 #include <QFile>
e78566595089 initial import
mandel
parents:
diff changeset
48 #include <QFileInfo>
e78566595089 initial import
mandel
parents:
diff changeset
49
e78566595089 initial import
mandel
parents:
diff changeset
50 Generator::Generator()
e78566595089 initial import
mandel
parents:
diff changeset
51 {
e78566595089 initial import
mandel
parents:
diff changeset
52 m_num_generated = 0;
e78566595089 initial import
mandel
parents:
diff changeset
53 m_num_generated_written = 0;
e78566595089 initial import
mandel
parents:
diff changeset
54 m_out_dir = ".";
e78566595089 initial import
mandel
parents:
diff changeset
55 }
e78566595089 initial import
mandel
parents:
diff changeset
56
e78566595089 initial import
mandel
parents:
diff changeset
57 void Generator::generate()
e78566595089 initial import
mandel
parents:
diff changeset
58 {
e78566595089 initial import
mandel
parents:
diff changeset
59 if (m_classes.size() == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
60 ReportHandler::warning(QString("%1: no java classes, skipping")
e78566595089 initial import
mandel
parents:
diff changeset
61 .arg(metaObject()->className()));
e78566595089 initial import
mandel
parents:
diff changeset
62 return;
e78566595089 initial import
mandel
parents:
diff changeset
63 }
e78566595089 initial import
mandel
parents:
diff changeset
64
e78566595089 initial import
mandel
parents:
diff changeset
65
e78566595089 initial import
mandel
parents:
diff changeset
66 foreach (AbstractMetaClass *cls, m_classes) {
e78566595089 initial import
mandel
parents:
diff changeset
67 if (!shouldGenerate(cls))
e78566595089 initial import
mandel
parents:
diff changeset
68 continue;
e78566595089 initial import
mandel
parents:
diff changeset
69
e78566595089 initial import
mandel
parents:
diff changeset
70 QString fileName = fileNameForClass(cls);
e78566595089 initial import
mandel
parents:
diff changeset
71 ReportHandler::debugSparse(QString("generating: %1").arg(fileName));
e78566595089 initial import
mandel
parents:
diff changeset
72
e78566595089 initial import
mandel
parents:
diff changeset
73 FileOut fileOut(outputDirectory() + "/" + subDirectoryForClass(cls) + "/" + fileName);
e78566595089 initial import
mandel
parents:
diff changeset
74 write(fileOut.stream, cls);
e78566595089 initial import
mandel
parents:
diff changeset
75
e78566595089 initial import
mandel
parents:
diff changeset
76 if( fileOut.done() )
e78566595089 initial import
mandel
parents:
diff changeset
77 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
78 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
79 }
e78566595089 initial import
mandel
parents:
diff changeset
80 }
e78566595089 initial import
mandel
parents:
diff changeset
81
e78566595089 initial import
mandel
parents:
diff changeset
82
e78566595089 initial import
mandel
parents:
diff changeset
83 void Generator::printClasses()
e78566595089 initial import
mandel
parents:
diff changeset
84 {
e78566595089 initial import
mandel
parents:
diff changeset
85 QTextStream s(stdout);
e78566595089 initial import
mandel
parents:
diff changeset
86
e78566595089 initial import
mandel
parents:
diff changeset
87 AbstractMetaClassList classes = m_classes;
e78566595089 initial import
mandel
parents:
diff changeset
88 qSort(classes);
e78566595089 initial import
mandel
parents:
diff changeset
89
e78566595089 initial import
mandel
parents:
diff changeset
90 foreach (AbstractMetaClass *cls, classes) {
e78566595089 initial import
mandel
parents:
diff changeset
91 if (!shouldGenerate(cls))
e78566595089 initial import
mandel
parents:
diff changeset
92 continue;
e78566595089 initial import
mandel
parents:
diff changeset
93 write(s, cls);
e78566595089 initial import
mandel
parents:
diff changeset
94 s << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
95 }
e78566595089 initial import
mandel
parents:
diff changeset
96 }
e78566595089 initial import
mandel
parents:
diff changeset
97
e78566595089 initial import
mandel
parents:
diff changeset
98 void Generator::verifyDirectoryFor(const QFile &file)
e78566595089 initial import
mandel
parents:
diff changeset
99 {
e78566595089 initial import
mandel
parents:
diff changeset
100 QDir dir = QFileInfo(file).dir();
e78566595089 initial import
mandel
parents:
diff changeset
101 if (!dir.exists()) {
e78566595089 initial import
mandel
parents:
diff changeset
102 if (!dir.mkpath(dir.absolutePath()))
e78566595089 initial import
mandel
parents:
diff changeset
103 ReportHandler::warning(QString("unable to create directory '%1'")
e78566595089 initial import
mandel
parents:
diff changeset
104 .arg(dir.absolutePath()));
e78566595089 initial import
mandel
parents:
diff changeset
105 }
e78566595089 initial import
mandel
parents:
diff changeset
106 }
e78566595089 initial import
mandel
parents:
diff changeset
107
e78566595089 initial import
mandel
parents:
diff changeset
108 QString Generator::subDirectoryForClass(const AbstractMetaClass *) const
e78566595089 initial import
mandel
parents:
diff changeset
109 {
e78566595089 initial import
mandel
parents:
diff changeset
110 Q_ASSERT(false);
e78566595089 initial import
mandel
parents:
diff changeset
111 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
112 }
e78566595089 initial import
mandel
parents:
diff changeset
113
e78566595089 initial import
mandel
parents:
diff changeset
114 QString Generator::fileNameForClass(const AbstractMetaClass *) const
e78566595089 initial import
mandel
parents:
diff changeset
115 {
e78566595089 initial import
mandel
parents:
diff changeset
116 Q_ASSERT(false);
e78566595089 initial import
mandel
parents:
diff changeset
117 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
118 }
e78566595089 initial import
mandel
parents:
diff changeset
119
e78566595089 initial import
mandel
parents:
diff changeset
120 void Generator::write(QTextStream &, const AbstractMetaClass *)
e78566595089 initial import
mandel
parents:
diff changeset
121 {
e78566595089 initial import
mandel
parents:
diff changeset
122 Q_ASSERT(false);
e78566595089 initial import
mandel
parents:
diff changeset
123 }
e78566595089 initial import
mandel
parents:
diff changeset
124
e78566595089 initial import
mandel
parents:
diff changeset
125 bool Generator::hasDefaultConstructor(const AbstractMetaType *type)
e78566595089 initial import
mandel
parents:
diff changeset
126 {
e78566595089 initial import
mandel
parents:
diff changeset
127 QString full_name = type->typeEntry()->qualifiedTargetLangName();
e78566595089 initial import
mandel
parents:
diff changeset
128 QString class_name = type->typeEntry()->targetLangName();
e78566595089 initial import
mandel
parents:
diff changeset
129
e78566595089 initial import
mandel
parents:
diff changeset
130 foreach (const AbstractMetaClass *java_class, m_classes) {
e78566595089 initial import
mandel
parents:
diff changeset
131 if (java_class->typeEntry()->qualifiedTargetLangName() == full_name) {
e78566595089 initial import
mandel
parents:
diff changeset
132 AbstractMetaFunctionList functions = java_class->functions();
e78566595089 initial import
mandel
parents:
diff changeset
133 foreach (const AbstractMetaFunction *function, functions) {
e78566595089 initial import
mandel
parents:
diff changeset
134 if (function->arguments().size() == 0 && function->name() == class_name)
e78566595089 initial import
mandel
parents:
diff changeset
135 return true;
e78566595089 initial import
mandel
parents:
diff changeset
136 }
e78566595089 initial import
mandel
parents:
diff changeset
137 return false;
e78566595089 initial import
mandel
parents:
diff changeset
138 }
e78566595089 initial import
mandel
parents:
diff changeset
139 }
e78566595089 initial import
mandel
parents:
diff changeset
140 return false;
e78566595089 initial import
mandel
parents:
diff changeset
141 }
e78566595089 initial import
mandel
parents:
diff changeset
142
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
143 // hackery to get qt module names
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
144 QString Generator::packageToQtModule(QString package, ModuleNameType nameType)
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
145 {
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
146 if (!package.startsWith("qt."))
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
147 qFatal(qPrintable("Package " + package + " does not start with 'qt.'"));
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
148
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
149 QString module = package.right(package.length() - 3);
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
150
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
151 if (nameType == ShortUpper)
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
152 return module.toUpper();
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
153 else if (nameType == LongCamel) {
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
154 module[0] = module[0].toTitleCase();
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
155 return "Qt" + module;
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
156 }
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
157 else
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
158 Q_ASSERT(0);
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
159 }
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 253
diff changeset
160
1
e78566595089 initial import
mandel
parents:
diff changeset
161 bool isLinearContainer(const ContainerTypeEntry *type)
e78566595089 initial import
mandel
parents:
diff changeset
162 {
e78566595089 initial import
mandel
parents:
diff changeset
163 if (type->type() == ContainerTypeEntry::ListContainer
e78566595089 initial import
mandel
parents:
diff changeset
164 || type->type() == ContainerTypeEntry::VectorContainer
e78566595089 initial import
mandel
parents:
diff changeset
165 || type->type() == ContainerTypeEntry::StringListContainer
e78566595089 initial import
mandel
parents:
diff changeset
166 || type->type() == ContainerTypeEntry::LinkedListContainer
e78566595089 initial import
mandel
parents:
diff changeset
167 || type->type() == ContainerTypeEntry::StackContainer
e78566595089 initial import
mandel
parents:
diff changeset
168 || type->type() == ContainerTypeEntry::SetContainer
e78566595089 initial import
mandel
parents:
diff changeset
169 || type->type() == ContainerTypeEntry::QueueContainer)
e78566595089 initial import
mandel
parents:
diff changeset
170 return true;
e78566595089 initial import
mandel
parents:
diff changeset
171 else
e78566595089 initial import
mandel
parents:
diff changeset
172 return false;
e78566595089 initial import
mandel
parents:
diff changeset
173 }
e78566595089 initial import
mandel
parents:
diff changeset
174
e78566595089 initial import
mandel
parents:
diff changeset
175 bool skipType(const AbstractMetaType *d_type)
e78566595089 initial import
mandel
parents:
diff changeset
176 {
e78566595089 initial import
mandel
parents:
diff changeset
177 if (d_type->isContainer()) {
e78566595089 initial import
mandel
parents:
diff changeset
178 const ContainerTypeEntry* c_entry = static_cast<const ContainerTypeEntry*>(d_type->typeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
179 if (c_entry->type() == ContainerTypeEntry::MapContainer ||
e78566595089 initial import
mandel
parents:
diff changeset
180 c_entry->type() == ContainerTypeEntry::MultiMapContainer ||
e78566595089 initial import
mandel
parents:
diff changeset
181 c_entry->type() == ContainerTypeEntry::MapContainer ||
33
cf8a415f3f32 gui package is fully wrapped now. lots of fixes in the generator
eldar
parents: 1
diff changeset
182 c_entry->type() == ContainerTypeEntry::MultiHashContainer ||
cf8a415f3f32 gui package is fully wrapped now. lots of fixes in the generator
eldar
parents: 1
diff changeset
183 c_entry->type() == ContainerTypeEntry::SetContainer)
1
e78566595089 initial import
mandel
parents:
diff changeset
184 return true;
e78566595089 initial import
mandel
parents:
diff changeset
185
e78566595089 initial import
mandel
parents:
diff changeset
186 QList<AbstractMetaType *> args = d_type->instantiations();
e78566595089 initial import
mandel
parents:
diff changeset
187
e78566595089 initial import
mandel
parents:
diff changeset
188 if (args.size() != 1 || args.at(0)->isContainer()) // not QVector or QList
e78566595089 initial import
mandel
parents:
diff changeset
189 return true;
e78566595089 initial import
mandel
parents:
diff changeset
190 }
e78566595089 initial import
mandel
parents:
diff changeset
191
e78566595089 initial import
mandel
parents:
diff changeset
192 return d_type->isThread() || d_type->isTargetLangChar();
e78566595089 initial import
mandel
parents:
diff changeset
193 }
e78566595089 initial import
mandel
parents:
diff changeset
194
e78566595089 initial import
mandel
parents:
diff changeset
195 bool notWrappedYet(const AbstractMetaFunction *java_function)
e78566595089 initial import
mandel
parents:
diff changeset
196 {
e78566595089 initial import
mandel
parents:
diff changeset
197 AbstractMetaType *d_type = java_function->type();
e78566595089 initial import
mandel
parents:
diff changeset
198 if (d_type)
e78566595089 initial import
mandel
parents:
diff changeset
199 {
e78566595089 initial import
mandel
parents:
diff changeset
200 if(skipType(d_type))
e78566595089 initial import
mandel
parents:
diff changeset
201 return true;
e78566595089 initial import
mandel
parents:
diff changeset
202 }
e78566595089 initial import
mandel
parents:
diff changeset
203
e78566595089 initial import
mandel
parents:
diff changeset
204 AbstractMetaArgumentList arguments = java_function->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
205 foreach (const AbstractMetaArgument *argument, arguments) {
e78566595089 initial import
mandel
parents:
diff changeset
206 if (!java_function->argumentRemoved(argument->argumentIndex() + 1))
e78566595089 initial import
mandel
parents:
diff changeset
207 if (skipType(argument->type()))
e78566595089 initial import
mandel
parents:
diff changeset
208 return true;
e78566595089 initial import
mandel
parents:
diff changeset
209 }
e78566595089 initial import
mandel
parents:
diff changeset
210
e78566595089 initial import
mandel
parents:
diff changeset
211 return false;
e78566595089 initial import
mandel
parents:
diff changeset
212 }
e78566595089 initial import
mandel
parents:
diff changeset
213
253
073b9153ed8a Rev. 264 done right.
maxter
parents: 148
diff changeset
214 AbstractMetaFunctionList signalFunctions(const AbstractMetaClass *cls, bool includeBase)
1
e78566595089 initial import
mandel
parents:
diff changeset
215 {
e78566595089 initial import
mandel
parents:
diff changeset
216 AbstractMetaFunctionList r;
e78566595089 initial import
mandel
parents:
diff changeset
217 if (cls->generateShellClass())
e78566595089 initial import
mandel
parents:
diff changeset
218 {
253
073b9153ed8a Rev. 264 done right.
maxter
parents: 148
diff changeset
219 if (includeBase)
073b9153ed8a Rev. 264 done right.
maxter
parents: 148
diff changeset
220 {
073b9153ed8a Rev. 264 done right.
maxter
parents: 148
diff changeset
221 AbstractMetaClass *base = cls->baseClass();
073b9153ed8a Rev. 264 done right.
maxter
parents: 148
diff changeset
222 if (base)
073b9153ed8a Rev. 264 done right.
maxter
parents: 148
diff changeset
223 r += signalFunctions(base);
073b9153ed8a Rev. 264 done right.
maxter
parents: 148
diff changeset
224 }
1
e78566595089 initial import
mandel
parents:
diff changeset
225
e78566595089 initial import
mandel
parents:
diff changeset
226 foreach (AbstractMetaFunction *f, cls->functions())
e78566595089 initial import
mandel
parents:
diff changeset
227 {
e78566595089 initial import
mandel
parents:
diff changeset
228 if (!f->isSignal()
e78566595089 initial import
mandel
parents:
diff changeset
229 || cls != f->implementingClass()
e78566595089 initial import
mandel
parents:
diff changeset
230 || notWrappedYet(f)
e78566595089 initial import
mandel
parents:
diff changeset
231 || f->isModifiedRemoved(TypeSystem::TargetLangCode))
e78566595089 initial import
mandel
parents:
diff changeset
232 continue;
e78566595089 initial import
mandel
parents:
diff changeset
233
e78566595089 initial import
mandel
parents:
diff changeset
234 r.append(f);
e78566595089 initial import
mandel
parents:
diff changeset
235 }
e78566595089 initial import
mandel
parents:
diff changeset
236 }
e78566595089 initial import
mandel
parents:
diff changeset
237 return r;
e78566595089 initial import
mandel
parents:
diff changeset
238 }