annotate generator/abstractmetalang.cpp @ 378:7341c47790d4

binding of qwt
author Eldar Insafutdinov
date Sat, 10 Jul 2010 21:54:44 +0100
parents 9784459f0750
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 "abstractmetalang.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "reporthandler.h"
e78566595089 initial import
mandel
parents:
diff changeset
44 #include "jumptable.h"
288
f9559a957be9 new signals and slots implementation
eldar
parents: 39
diff changeset
45 #include <iostream>
1
e78566595089 initial import
mandel
parents:
diff changeset
46
e78566595089 initial import
mandel
parents:
diff changeset
47 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
48 * AbstractMetaType
e78566595089 initial import
mandel
parents:
diff changeset
49 */
e78566595089 initial import
mandel
parents:
diff changeset
50 AbstractMetaType *AbstractMetaType::copy() const
e78566595089 initial import
mandel
parents:
diff changeset
51 {
e78566595089 initial import
mandel
parents:
diff changeset
52 AbstractMetaType *cpy = new AbstractMetaType;
e78566595089 initial import
mandel
parents:
diff changeset
53
e78566595089 initial import
mandel
parents:
diff changeset
54 cpy->setTypeUsagePattern(typeUsagePattern());
e78566595089 initial import
mandel
parents:
diff changeset
55 cpy->setConstant(isConstant());
e78566595089 initial import
mandel
parents:
diff changeset
56 cpy->setReference(isReference());
e78566595089 initial import
mandel
parents:
diff changeset
57 cpy->setIndirections(indirections());
e78566595089 initial import
mandel
parents:
diff changeset
58 cpy->setInstantiations(instantiations());
e78566595089 initial import
mandel
parents:
diff changeset
59 cpy->setArrayElementCount(arrayElementCount());
e78566595089 initial import
mandel
parents:
diff changeset
60 cpy->setOriginalTypeDescription(originalTypeDescription());
e78566595089 initial import
mandel
parents:
diff changeset
61 cpy->setOriginalTemplateType(originalTemplateType() ? originalTemplateType()->copy() : 0);
e78566595089 initial import
mandel
parents:
diff changeset
62
e78566595089 initial import
mandel
parents:
diff changeset
63 cpy->setArrayElementType(arrayElementType() ? arrayElementType()->copy() : 0);
e78566595089 initial import
mandel
parents:
diff changeset
64
e78566595089 initial import
mandel
parents:
diff changeset
65 cpy->setTypeEntry(typeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
66
e78566595089 initial import
mandel
parents:
diff changeset
67 return cpy;
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 AbstractMetaType::cppSignature() const
e78566595089 initial import
mandel
parents:
diff changeset
71 {
e78566595089 initial import
mandel
parents:
diff changeset
72 QString s;
e78566595089 initial import
mandel
parents:
diff changeset
73
e78566595089 initial import
mandel
parents:
diff changeset
74 if (isConstant())
e78566595089 initial import
mandel
parents:
diff changeset
75 s += "const ";
e78566595089 initial import
mandel
parents:
diff changeset
76
e78566595089 initial import
mandel
parents:
diff changeset
77 s += typeEntry()->qualifiedCppName();
e78566595089 initial import
mandel
parents:
diff changeset
78
e78566595089 initial import
mandel
parents:
diff changeset
79 if (hasInstantiationInCpp()) {
e78566595089 initial import
mandel
parents:
diff changeset
80 QList<AbstractMetaType *> types = instantiations();
e78566595089 initial import
mandel
parents:
diff changeset
81 s += "<";
e78566595089 initial import
mandel
parents:
diff changeset
82 for (int i=0; i<types.count(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
83 if (i > 0)
e78566595089 initial import
mandel
parents:
diff changeset
84 s += ", ";
e78566595089 initial import
mandel
parents:
diff changeset
85 s += types.at(i)->cppSignature();
e78566595089 initial import
mandel
parents:
diff changeset
86 }
e78566595089 initial import
mandel
parents:
diff changeset
87 s += " >";
e78566595089 initial import
mandel
parents:
diff changeset
88 }
e78566595089 initial import
mandel
parents:
diff changeset
89
e78566595089 initial import
mandel
parents:
diff changeset
90 if (actualIndirections()) {
e78566595089 initial import
mandel
parents:
diff changeset
91 s += ' ';
e78566595089 initial import
mandel
parents:
diff changeset
92 if (indirections())
e78566595089 initial import
mandel
parents:
diff changeset
93 s += QString(indirections(), '*');
e78566595089 initial import
mandel
parents:
diff changeset
94 if (isReference())
e78566595089 initial import
mandel
parents:
diff changeset
95 s += '&';
e78566595089 initial import
mandel
parents:
diff changeset
96 }
e78566595089 initial import
mandel
parents:
diff changeset
97 return s;
e78566595089 initial import
mandel
parents:
diff changeset
98 }
e78566595089 initial import
mandel
parents:
diff changeset
99
e78566595089 initial import
mandel
parents:
diff changeset
100 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
101 * AbstractMetaArgument
e78566595089 initial import
mandel
parents:
diff changeset
102 */
e78566595089 initial import
mandel
parents:
diff changeset
103 AbstractMetaArgument *AbstractMetaArgument::copy() const
e78566595089 initial import
mandel
parents:
diff changeset
104 {
e78566595089 initial import
mandel
parents:
diff changeset
105 AbstractMetaArgument *cpy = new AbstractMetaArgument;
e78566595089 initial import
mandel
parents:
diff changeset
106 cpy->setName(AbstractMetaVariable::name());
e78566595089 initial import
mandel
parents:
diff changeset
107 cpy->setDefaultValueExpression(defaultValueExpression());
e78566595089 initial import
mandel
parents:
diff changeset
108 cpy->setType(type()->copy());
e78566595089 initial import
mandel
parents:
diff changeset
109 cpy->setArgumentIndex(argumentIndex());
e78566595089 initial import
mandel
parents:
diff changeset
110
e78566595089 initial import
mandel
parents:
diff changeset
111 return cpy;
e78566595089 initial import
mandel
parents:
diff changeset
112 }
e78566595089 initial import
mandel
parents:
diff changeset
113
e78566595089 initial import
mandel
parents:
diff changeset
114
e78566595089 initial import
mandel
parents:
diff changeset
115 QString AbstractMetaArgument::argumentName() const
e78566595089 initial import
mandel
parents:
diff changeset
116 {
e78566595089 initial import
mandel
parents:
diff changeset
117 QString n = AbstractMetaVariable::name();
e78566595089 initial import
mandel
parents:
diff changeset
118 // replace for arguments which are D keywords such as "version"
e78566595089 initial import
mandel
parents:
diff changeset
119 n = ArgumentReplace::translate(n);
e78566595089 initial import
mandel
parents:
diff changeset
120
e78566595089 initial import
mandel
parents:
diff changeset
121 if (n.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
122 return QString("arg__%2").arg(m_argument_index + 1);
e78566595089 initial import
mandel
parents:
diff changeset
123 }
e78566595089 initial import
mandel
parents:
diff changeset
124 return n;
e78566595089 initial import
mandel
parents:
diff changeset
125 }
e78566595089 initial import
mandel
parents:
diff changeset
126
e78566595089 initial import
mandel
parents:
diff changeset
127
e78566595089 initial import
mandel
parents:
diff changeset
128 QString AbstractMetaArgument::indexedName() const
e78566595089 initial import
mandel
parents:
diff changeset
129 {
e78566595089 initial import
mandel
parents:
diff changeset
130 QString n = AbstractMetaVariable::name();
e78566595089 initial import
mandel
parents:
diff changeset
131 if (n.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
132 return argumentName();
e78566595089 initial import
mandel
parents:
diff changeset
133 return QString("%1%2").arg(n).arg(m_argument_index);
e78566595089 initial import
mandel
parents:
diff changeset
134 }
e78566595089 initial import
mandel
parents:
diff changeset
135
e78566595089 initial import
mandel
parents:
diff changeset
136 QString AbstractMetaArgument::name() const
e78566595089 initial import
mandel
parents:
diff changeset
137 {
e78566595089 initial import
mandel
parents:
diff changeset
138 Q_ASSERT_X(0, "AbstractMetaArgument::name()", "use argumentName() or indexedName() instead");
e78566595089 initial import
mandel
parents:
diff changeset
139 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
140 }
e78566595089 initial import
mandel
parents:
diff changeset
141
e78566595089 initial import
mandel
parents:
diff changeset
142
e78566595089 initial import
mandel
parents:
diff changeset
143 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
144 * AbstractMetaFunction
e78566595089 initial import
mandel
parents:
diff changeset
145 */
e78566595089 initial import
mandel
parents:
diff changeset
146 AbstractMetaFunction::~AbstractMetaFunction()
e78566595089 initial import
mandel
parents:
diff changeset
147 {
e78566595089 initial import
mandel
parents:
diff changeset
148 qDeleteAll(m_arguments);
e78566595089 initial import
mandel
parents:
diff changeset
149 delete m_type;
e78566595089 initial import
mandel
parents:
diff changeset
150 }
e78566595089 initial import
mandel
parents:
diff changeset
151
e78566595089 initial import
mandel
parents:
diff changeset
152 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
153 * Indicates that this function has a modification that removes it
e78566595089 initial import
mandel
parents:
diff changeset
154 */
e78566595089 initial import
mandel
parents:
diff changeset
155 bool AbstractMetaFunction::isModifiedRemoved(int types) const
e78566595089 initial import
mandel
parents:
diff changeset
156 {
e78566595089 initial import
mandel
parents:
diff changeset
157 FunctionModificationList mods = modifications(implementingClass());
e78566595089 initial import
mandel
parents:
diff changeset
158 foreach (FunctionModification mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
159 if (!mod.isRemoveModifier())
e78566595089 initial import
mandel
parents:
diff changeset
160 continue;
e78566595089 initial import
mandel
parents:
diff changeset
161
e78566595089 initial import
mandel
parents:
diff changeset
162 if ((mod.removal & types) == types)
e78566595089 initial import
mandel
parents:
diff changeset
163 return true;
e78566595089 initial import
mandel
parents:
diff changeset
164 }
e78566595089 initial import
mandel
parents:
diff changeset
165
e78566595089 initial import
mandel
parents:
diff changeset
166 return false;
e78566595089 initial import
mandel
parents:
diff changeset
167 }
e78566595089 initial import
mandel
parents:
diff changeset
168
e78566595089 initial import
mandel
parents:
diff changeset
169 bool AbstractMetaFunction::needsCallThrough() const
e78566595089 initial import
mandel
parents:
diff changeset
170 {
e78566595089 initial import
mandel
parents:
diff changeset
171 if (ownerClass()->isInterface())
e78566595089 initial import
mandel
parents:
diff changeset
172 return false;
e78566595089 initial import
mandel
parents:
diff changeset
173 if (referenceCounts(implementingClass()).size() > 0)
e78566595089 initial import
mandel
parents:
diff changeset
174 return true;
e78566595089 initial import
mandel
parents:
diff changeset
175 if (argumentsHaveNativeId() || !isStatic())
e78566595089 initial import
mandel
parents:
diff changeset
176 return true;
e78566595089 initial import
mandel
parents:
diff changeset
177 if (JumpTableGenerator::isJumpTableActive())
e78566595089 initial import
mandel
parents:
diff changeset
178 return true;
e78566595089 initial import
mandel
parents:
diff changeset
179
e78566595089 initial import
mandel
parents:
diff changeset
180 foreach (const AbstractMetaArgument *arg, arguments()) {
e78566595089 initial import
mandel
parents:
diff changeset
181 if (arg->type()->isArray() || arg->type()->isTargetLangEnum() || arg->type()->isTargetLangFlags())
e78566595089 initial import
mandel
parents:
diff changeset
182 return true;
e78566595089 initial import
mandel
parents:
diff changeset
183 }
e78566595089 initial import
mandel
parents:
diff changeset
184
e78566595089 initial import
mandel
parents:
diff changeset
185 if (type() && (type()->isArray() || type()->isTargetLangEnum() || type()->isTargetLangFlags()))
e78566595089 initial import
mandel
parents:
diff changeset
186 return true;
e78566595089 initial import
mandel
parents:
diff changeset
187
e78566595089 initial import
mandel
parents:
diff changeset
188 for (int i=-1; i<=arguments().size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
189 TypeSystem::Ownership owner = this->ownership(implementingClass(), TypeSystem::TargetLangCode, i);
e78566595089 initial import
mandel
parents:
diff changeset
190 if (owner != TypeSystem::InvalidOwnership)
e78566595089 initial import
mandel
parents:
diff changeset
191 return true;
e78566595089 initial import
mandel
parents:
diff changeset
192 }
e78566595089 initial import
mandel
parents:
diff changeset
193
e78566595089 initial import
mandel
parents:
diff changeset
194 return false;
e78566595089 initial import
mandel
parents:
diff changeset
195 }
e78566595089 initial import
mandel
parents:
diff changeset
196
e78566595089 initial import
mandel
parents:
diff changeset
197 bool AbstractMetaFunction::needsSuppressUncheckedWarning() const
e78566595089 initial import
mandel
parents:
diff changeset
198 {
e78566595089 initial import
mandel
parents:
diff changeset
199 for (int i=-1; i<=arguments().size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
200 QList<ReferenceCount> referenceCounts = this->referenceCounts(implementingClass(), i);
e78566595089 initial import
mandel
parents:
diff changeset
201 foreach (ReferenceCount referenceCount, referenceCounts) {
e78566595089 initial import
mandel
parents:
diff changeset
202 if (referenceCount.action != ReferenceCount::Set)
e78566595089 initial import
mandel
parents:
diff changeset
203 return true;
e78566595089 initial import
mandel
parents:
diff changeset
204 }
e78566595089 initial import
mandel
parents:
diff changeset
205 }
e78566595089 initial import
mandel
parents:
diff changeset
206 return false;
e78566595089 initial import
mandel
parents:
diff changeset
207 }
e78566595089 initial import
mandel
parents:
diff changeset
208
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
209 QString AbstractMetaFunction::marshalledName(Options options) const
1
e78566595089 initial import
mandel
parents:
diff changeset
210 {
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
211 QString returned;
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
212 if (!(options & NoExternNamespace))
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
213 returned += "qtd_";
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
214
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
215 if(options & DeclaringClass)
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
216 returned += declaringClass()->name();
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 354
diff changeset
217 else
1
e78566595089 initial import
mandel
parents:
diff changeset
218 returned += ownerClass()->name();
e78566595089 initial import
mandel
parents:
diff changeset
219
e78566595089 initial import
mandel
parents:
diff changeset
220 returned += "_" + name();
e78566595089 initial import
mandel
parents:
diff changeset
221 AbstractMetaArgumentList arguments = this->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
222 foreach (const AbstractMetaArgument *arg, arguments) {
e78566595089 initial import
mandel
parents:
diff changeset
223 returned += "_";
e78566595089 initial import
mandel
parents:
diff changeset
224 if (arg->type()->isNativePointer()) {
e78566595089 initial import
mandel
parents:
diff changeset
225 returned += "nativepointer" + arg->type()->name().replace("[]", "_3").replace(".", "_");
e78566595089 initial import
mandel
parents:
diff changeset
226 } else if (arg->type()->isIntegerEnum() || arg->type()->isIntegerFlags()) {
e78566595089 initial import
mandel
parents:
diff changeset
227 returned += "int";
e78566595089 initial import
mandel
parents:
diff changeset
228 } else {
e78566595089 initial import
mandel
parents:
diff changeset
229 returned += arg->type()->name().replace("[]", "_3").replace(".", "_");
e78566595089 initial import
mandel
parents:
diff changeset
230 }
e78566595089 initial import
mandel
parents:
diff changeset
231 }
324
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 309
diff changeset
232
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 309
diff changeset
233 if(this->isConstant())
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 309
diff changeset
234 returned += "_const";
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 309
diff changeset
235
1
e78566595089 initial import
mandel
parents:
diff changeset
236 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
237 }
e78566595089 initial import
mandel
parents:
diff changeset
238
e78566595089 initial import
mandel
parents:
diff changeset
239 bool AbstractMetaFunction::operator<(const AbstractMetaFunction &other) const
e78566595089 initial import
mandel
parents:
diff changeset
240 {
e78566595089 initial import
mandel
parents:
diff changeset
241 uint result = compareTo(&other);
e78566595089 initial import
mandel
parents:
diff changeset
242 return result & NameLessThan;
e78566595089 initial import
mandel
parents:
diff changeset
243 }
e78566595089 initial import
mandel
parents:
diff changeset
244
e78566595089 initial import
mandel
parents:
diff changeset
245
e78566595089 initial import
mandel
parents:
diff changeset
246 /*!
e78566595089 initial import
mandel
parents:
diff changeset
247 Returns a mask of CompareResult describing how this function is
e78566595089 initial import
mandel
parents:
diff changeset
248 compares to another function
e78566595089 initial import
mandel
parents:
diff changeset
249 */
e78566595089 initial import
mandel
parents:
diff changeset
250 uint AbstractMetaFunction::compareTo(const AbstractMetaFunction *other) const
e78566595089 initial import
mandel
parents:
diff changeset
251 {
e78566595089 initial import
mandel
parents:
diff changeset
252 uint result = 0;
e78566595089 initial import
mandel
parents:
diff changeset
253
e78566595089 initial import
mandel
parents:
diff changeset
254 // Enclosing class...
e78566595089 initial import
mandel
parents:
diff changeset
255 if (ownerClass() == other->ownerClass()) {
e78566595089 initial import
mandel
parents:
diff changeset
256 result |= EqualImplementor;
e78566595089 initial import
mandel
parents:
diff changeset
257 }
e78566595089 initial import
mandel
parents:
diff changeset
258
e78566595089 initial import
mandel
parents:
diff changeset
259 // Attributes
e78566595089 initial import
mandel
parents:
diff changeset
260 if (attributes() == other->attributes()) {
e78566595089 initial import
mandel
parents:
diff changeset
261 result |= EqualAttributes;
e78566595089 initial import
mandel
parents:
diff changeset
262 }
e78566595089 initial import
mandel
parents:
diff changeset
263
327
c97e5d15bf95 minor fixes
eldar1@eldar1-laptop
parents: 326
diff changeset
264 // Constness
326
baaf74652f4c treat const and non-const functions as separate
eldar1@eldar1-laptop
parents: 324
diff changeset
265 if (isConstant() == other->isConstant()) {
baaf74652f4c treat const and non-const functions as separate
eldar1@eldar1-laptop
parents: 324
diff changeset
266 result |= EqualConstness;
baaf74652f4c treat const and non-const functions as separate
eldar1@eldar1-laptop
parents: 324
diff changeset
267 }
baaf74652f4c treat const and non-const functions as separate
eldar1@eldar1-laptop
parents: 324
diff changeset
268
1
e78566595089 initial import
mandel
parents:
diff changeset
269 // Compare types
e78566595089 initial import
mandel
parents:
diff changeset
270 AbstractMetaType *t = type();
e78566595089 initial import
mandel
parents:
diff changeset
271 AbstractMetaType *ot = other->type();
e78566595089 initial import
mandel
parents:
diff changeset
272 if ((!t && !ot) || ((t && ot && t->name() == ot->name()))) {
e78566595089 initial import
mandel
parents:
diff changeset
273 result |= EqualReturnType;
e78566595089 initial import
mandel
parents:
diff changeset
274 }
e78566595089 initial import
mandel
parents:
diff changeset
275
e78566595089 initial import
mandel
parents:
diff changeset
276 // Compare names
e78566595089 initial import
mandel
parents:
diff changeset
277 int cmp = originalName().compare(other->originalName());
e78566595089 initial import
mandel
parents:
diff changeset
278
e78566595089 initial import
mandel
parents:
diff changeset
279 if (cmp < 0) {
e78566595089 initial import
mandel
parents:
diff changeset
280 result |= NameLessThan;
e78566595089 initial import
mandel
parents:
diff changeset
281 } else if (cmp == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
282 result |= EqualName;
e78566595089 initial import
mandel
parents:
diff changeset
283 }
e78566595089 initial import
mandel
parents:
diff changeset
284
e78566595089 initial import
mandel
parents:
diff changeset
285 // compare name after modification...
e78566595089 initial import
mandel
parents:
diff changeset
286 cmp = modifiedName().compare(other->modifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
287 if (cmp == 0)
e78566595089 initial import
mandel
parents:
diff changeset
288 result |= EqualModifiedName;
e78566595089 initial import
mandel
parents:
diff changeset
289
e78566595089 initial import
mandel
parents:
diff changeset
290 // Compare arguments...
e78566595089 initial import
mandel
parents:
diff changeset
291 AbstractMetaArgumentList min_arguments;
e78566595089 initial import
mandel
parents:
diff changeset
292 AbstractMetaArgumentList max_arguments;
e78566595089 initial import
mandel
parents:
diff changeset
293 if (arguments().size() < other->arguments().size()) {
e78566595089 initial import
mandel
parents:
diff changeset
294 min_arguments = arguments();
e78566595089 initial import
mandel
parents:
diff changeset
295 max_arguments = other->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
296 } else {
e78566595089 initial import
mandel
parents:
diff changeset
297 min_arguments = other->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
298 max_arguments = arguments();
e78566595089 initial import
mandel
parents:
diff changeset
299 }
e78566595089 initial import
mandel
parents:
diff changeset
300
e78566595089 initial import
mandel
parents:
diff changeset
301 int min_count = min_arguments.size();
e78566595089 initial import
mandel
parents:
diff changeset
302 int max_count = max_arguments.size();
e78566595089 initial import
mandel
parents:
diff changeset
303 bool same = true;
e78566595089 initial import
mandel
parents:
diff changeset
304 for (int i=0; i<max_count; ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
305 if (i < min_count) {
e78566595089 initial import
mandel
parents:
diff changeset
306 const AbstractMetaArgument *min_arg = min_arguments.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
307 const AbstractMetaArgument *max_arg = max_arguments.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
308 if (min_arg->type()->name() != max_arg->type()->name()
e78566595089 initial import
mandel
parents:
diff changeset
309 && (min_arg->defaultValueExpression().isEmpty() || max_arg->defaultValueExpression().isEmpty())) {
e78566595089 initial import
mandel
parents:
diff changeset
310 same = false;
e78566595089 initial import
mandel
parents:
diff changeset
311 break;
e78566595089 initial import
mandel
parents:
diff changeset
312 }
e78566595089 initial import
mandel
parents:
diff changeset
313 } else {
e78566595089 initial import
mandel
parents:
diff changeset
314 if (max_arguments.at(i)->defaultValueExpression().isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
315 same = false;
e78566595089 initial import
mandel
parents:
diff changeset
316 break;
e78566595089 initial import
mandel
parents:
diff changeset
317 }
e78566595089 initial import
mandel
parents:
diff changeset
318 }
e78566595089 initial import
mandel
parents:
diff changeset
319 }
e78566595089 initial import
mandel
parents:
diff changeset
320
e78566595089 initial import
mandel
parents:
diff changeset
321 if (same)
e78566595089 initial import
mandel
parents:
diff changeset
322 result |= min_count == max_count ? EqualArguments : EqualDefaultValueOverload;
e78566595089 initial import
mandel
parents:
diff changeset
323
e78566595089 initial import
mandel
parents:
diff changeset
324 return result;
e78566595089 initial import
mandel
parents:
diff changeset
325 }
e78566595089 initial import
mandel
parents:
diff changeset
326
e78566595089 initial import
mandel
parents:
diff changeset
327 AbstractMetaFunction *AbstractMetaFunction::copy() const
e78566595089 initial import
mandel
parents:
diff changeset
328 {
e78566595089 initial import
mandel
parents:
diff changeset
329 AbstractMetaFunction *cpy = new AbstractMetaFunction;
e78566595089 initial import
mandel
parents:
diff changeset
330 cpy->setName(name());
e78566595089 initial import
mandel
parents:
diff changeset
331 cpy->setOriginalName(originalName());
e78566595089 initial import
mandel
parents:
diff changeset
332 cpy->setOwnerClass(ownerClass());
e78566595089 initial import
mandel
parents:
diff changeset
333 cpy->setImplementingClass(implementingClass());
e78566595089 initial import
mandel
parents:
diff changeset
334 cpy->setInterfaceClass(interfaceClass());
e78566595089 initial import
mandel
parents:
diff changeset
335 cpy->setFunctionType(functionType());
e78566595089 initial import
mandel
parents:
diff changeset
336 cpy->setAttributes(attributes());
e78566595089 initial import
mandel
parents:
diff changeset
337 cpy->setDeclaringClass(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
338 if (type())
e78566595089 initial import
mandel
parents:
diff changeset
339 cpy->setType(type()->copy());
e78566595089 initial import
mandel
parents:
diff changeset
340 cpy->setConstant(isConstant());
e78566595089 initial import
mandel
parents:
diff changeset
341 cpy->setOriginalAttributes(originalAttributes());
e78566595089 initial import
mandel
parents:
diff changeset
342
e78566595089 initial import
mandel
parents:
diff changeset
343 foreach (AbstractMetaArgument *arg, arguments())
e78566595089 initial import
mandel
parents:
diff changeset
344 cpy->addArgument(arg->copy());
e78566595089 initial import
mandel
parents:
diff changeset
345
e78566595089 initial import
mandel
parents:
diff changeset
346 Q_ASSERT((!type() && !cpy->type())
e78566595089 initial import
mandel
parents:
diff changeset
347 || (type()->instantiations() == cpy->type()->instantiations()));
e78566595089 initial import
mandel
parents:
diff changeset
348
e78566595089 initial import
mandel
parents:
diff changeset
349 return cpy;
e78566595089 initial import
mandel
parents:
diff changeset
350 }
e78566595089 initial import
mandel
parents:
diff changeset
351
e78566595089 initial import
mandel
parents:
diff changeset
352 QStringList AbstractMetaFunction::introspectionCompatibleSignatures(const QStringList &resolvedArguments) const
e78566595089 initial import
mandel
parents:
diff changeset
353 {
e78566595089 initial import
mandel
parents:
diff changeset
354 AbstractMetaArgumentList arguments = this->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
355 if (arguments.size() == resolvedArguments.size()) {
e78566595089 initial import
mandel
parents:
diff changeset
356 return (QStringList() << QMetaObject::normalizedSignature((name() + "(" + resolvedArguments.join(",") + ")").toUtf8().constData()));
e78566595089 initial import
mandel
parents:
diff changeset
357 } else {
e78566595089 initial import
mandel
parents:
diff changeset
358 QStringList returned;
e78566595089 initial import
mandel
parents:
diff changeset
359
e78566595089 initial import
mandel
parents:
diff changeset
360 AbstractMetaArgument *argument = arguments.at(resolvedArguments.size());
e78566595089 initial import
mandel
parents:
diff changeset
361 QStringList minimalTypeSignature = argument->type()->minimalSignature().split("::");
e78566595089 initial import
mandel
parents:
diff changeset
362 for (int i=0; i<minimalTypeSignature.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
363 returned += introspectionCompatibleSignatures(QStringList(resolvedArguments)
e78566595089 initial import
mandel
parents:
diff changeset
364 << QStringList(minimalTypeSignature.mid(minimalTypeSignature.size() - i - 1)).join("::"));
e78566595089 initial import
mandel
parents:
diff changeset
365 }
e78566595089 initial import
mandel
parents:
diff changeset
366
e78566595089 initial import
mandel
parents:
diff changeset
367 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
368 }
e78566595089 initial import
mandel
parents:
diff changeset
369 }
e78566595089 initial import
mandel
parents:
diff changeset
370
e78566595089 initial import
mandel
parents:
diff changeset
371 QString AbstractMetaFunction::signature() const
e78566595089 initial import
mandel
parents:
diff changeset
372 {
e78566595089 initial import
mandel
parents:
diff changeset
373 QString s(m_original_name);
e78566595089 initial import
mandel
parents:
diff changeset
374
e78566595089 initial import
mandel
parents:
diff changeset
375 s += "(";
e78566595089 initial import
mandel
parents:
diff changeset
376
e78566595089 initial import
mandel
parents:
diff changeset
377 for (int i=0; i<m_arguments.count(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
378 if (i > 0)
e78566595089 initial import
mandel
parents:
diff changeset
379 s += ", ";
e78566595089 initial import
mandel
parents:
diff changeset
380 AbstractMetaArgument *a = m_arguments.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
381 s += a->type()->cppSignature();
e78566595089 initial import
mandel
parents:
diff changeset
382
e78566595089 initial import
mandel
parents:
diff changeset
383 // We need to have the argument names in the qdoc files
e78566595089 initial import
mandel
parents:
diff changeset
384 s += " ";
e78566595089 initial import
mandel
parents:
diff changeset
385 s += a->argumentName();
e78566595089 initial import
mandel
parents:
diff changeset
386 }
e78566595089 initial import
mandel
parents:
diff changeset
387 s += ")";
e78566595089 initial import
mandel
parents:
diff changeset
388
e78566595089 initial import
mandel
parents:
diff changeset
389 if (isConstant())
e78566595089 initial import
mandel
parents:
diff changeset
390 s += " const";
e78566595089 initial import
mandel
parents:
diff changeset
391
e78566595089 initial import
mandel
parents:
diff changeset
392 return s;
e78566595089 initial import
mandel
parents:
diff changeset
393 }
e78566595089 initial import
mandel
parents:
diff changeset
394
e78566595089 initial import
mandel
parents:
diff changeset
395 int AbstractMetaFunction::actualMinimumArgumentCount() const
e78566595089 initial import
mandel
parents:
diff changeset
396 {
e78566595089 initial import
mandel
parents:
diff changeset
397 AbstractMetaArgumentList arguments = this->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
398
e78566595089 initial import
mandel
parents:
diff changeset
399 int count = 0;
e78566595089 initial import
mandel
parents:
diff changeset
400 for (int i=0; i<arguments.size(); ++i && ++count) {
e78566595089 initial import
mandel
parents:
diff changeset
401 if (argumentRemoved(i + 1)) --count;
e78566595089 initial import
mandel
parents:
diff changeset
402 else if (!arguments.at(i)->defaultValueExpression().isEmpty()) break;
e78566595089 initial import
mandel
parents:
diff changeset
403 }
e78566595089 initial import
mandel
parents:
diff changeset
404
e78566595089 initial import
mandel
parents:
diff changeset
405 return count;
e78566595089 initial import
mandel
parents:
diff changeset
406 }
e78566595089 initial import
mandel
parents:
diff changeset
407
e78566595089 initial import
mandel
parents:
diff changeset
408 // Returns reference counts for argument at idx, or all arguments if idx == -2
e78566595089 initial import
mandel
parents:
diff changeset
409 QList<ReferenceCount> AbstractMetaFunction::referenceCounts(const AbstractMetaClass *cls, int idx) const
e78566595089 initial import
mandel
parents:
diff changeset
410 {
e78566595089 initial import
mandel
parents:
diff changeset
411 QList<ReferenceCount> returned;
e78566595089 initial import
mandel
parents:
diff changeset
412
e78566595089 initial import
mandel
parents:
diff changeset
413 FunctionModificationList mods = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
414 foreach (FunctionModification mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
415 QList<ArgumentModification> argument_mods = mod.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
416 foreach (ArgumentModification argument_mod, argument_mods) {
e78566595089 initial import
mandel
parents:
diff changeset
417 if (argument_mod.index != idx && idx != -2)
e78566595089 initial import
mandel
parents:
diff changeset
418 continue;
e78566595089 initial import
mandel
parents:
diff changeset
419 returned += argument_mod.referenceCounts;
e78566595089 initial import
mandel
parents:
diff changeset
420 }
e78566595089 initial import
mandel
parents:
diff changeset
421 }
e78566595089 initial import
mandel
parents:
diff changeset
422
e78566595089 initial import
mandel
parents:
diff changeset
423 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
424 }
e78566595089 initial import
mandel
parents:
diff changeset
425
e78566595089 initial import
mandel
parents:
diff changeset
426 QString AbstractMetaFunction::replacedDefaultExpression(const AbstractMetaClass *cls, int key) const
e78566595089 initial import
mandel
parents:
diff changeset
427 {
e78566595089 initial import
mandel
parents:
diff changeset
428 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
429 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
430 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
431 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
432 if (argument_modification.index == key
e78566595089 initial import
mandel
parents:
diff changeset
433 && !argument_modification.replaced_default_expression.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
434 return argument_modification.replaced_default_expression;
e78566595089 initial import
mandel
parents:
diff changeset
435 }
e78566595089 initial import
mandel
parents:
diff changeset
436 }
e78566595089 initial import
mandel
parents:
diff changeset
437 }
e78566595089 initial import
mandel
parents:
diff changeset
438
e78566595089 initial import
mandel
parents:
diff changeset
439 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
440 }
e78566595089 initial import
mandel
parents:
diff changeset
441
e78566595089 initial import
mandel
parents:
diff changeset
442 bool AbstractMetaFunction::removedDefaultExpression(const AbstractMetaClass *cls, int key) const
e78566595089 initial import
mandel
parents:
diff changeset
443 {
e78566595089 initial import
mandel
parents:
diff changeset
444 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
445 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
446 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
447 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
448 if (argument_modification.index == key
e78566595089 initial import
mandel
parents:
diff changeset
449 && argument_modification.removed_default_expression) {
e78566595089 initial import
mandel
parents:
diff changeset
450 return true;
e78566595089 initial import
mandel
parents:
diff changeset
451 }
e78566595089 initial import
mandel
parents:
diff changeset
452 }
e78566595089 initial import
mandel
parents:
diff changeset
453 }
e78566595089 initial import
mandel
parents:
diff changeset
454
e78566595089 initial import
mandel
parents:
diff changeset
455 return false;
e78566595089 initial import
mandel
parents:
diff changeset
456 }
e78566595089 initial import
mandel
parents:
diff changeset
457
e78566595089 initial import
mandel
parents:
diff changeset
458 bool AbstractMetaFunction::resetObjectAfterUse(int argument_idx) const
e78566595089 initial import
mandel
parents:
diff changeset
459 {
e78566595089 initial import
mandel
parents:
diff changeset
460 const AbstractMetaClass *cls = declaringClass();
e78566595089 initial import
mandel
parents:
diff changeset
461 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
462 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
463 QList<ArgumentModification> argumentModifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
464 foreach (ArgumentModification argumentModification, argumentModifications) {
e78566595089 initial import
mandel
parents:
diff changeset
465 if (argumentModification.index == argument_idx && argumentModification.reset_after_use)
e78566595089 initial import
mandel
parents:
diff changeset
466 return true;
e78566595089 initial import
mandel
parents:
diff changeset
467 }
e78566595089 initial import
mandel
parents:
diff changeset
468 }
e78566595089 initial import
mandel
parents:
diff changeset
469
e78566595089 initial import
mandel
parents:
diff changeset
470 return false;
e78566595089 initial import
mandel
parents:
diff changeset
471 }
e78566595089 initial import
mandel
parents:
diff changeset
472
e78566595089 initial import
mandel
parents:
diff changeset
473 QString AbstractMetaFunction::nullPointerDefaultValue(const AbstractMetaClass *mainClass, int argument_idx) const
e78566595089 initial import
mandel
parents:
diff changeset
474 {
e78566595089 initial import
mandel
parents:
diff changeset
475 Q_ASSERT(nullPointersDisabled(mainClass, argument_idx));
e78566595089 initial import
mandel
parents:
diff changeset
476
e78566595089 initial import
mandel
parents:
diff changeset
477 const AbstractMetaClass *cls = mainClass;
e78566595089 initial import
mandel
parents:
diff changeset
478 if (cls == 0)
e78566595089 initial import
mandel
parents:
diff changeset
479 cls = implementingClass();
e78566595089 initial import
mandel
parents:
diff changeset
480
e78566595089 initial import
mandel
parents:
diff changeset
481 do {
e78566595089 initial import
mandel
parents:
diff changeset
482 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
483 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
484 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
485 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
486 if (argument_modification.index == argument_idx
e78566595089 initial import
mandel
parents:
diff changeset
487 && argument_modification.no_null_pointers) {
e78566595089 initial import
mandel
parents:
diff changeset
488 return argument_modification.null_pointer_default_value;
e78566595089 initial import
mandel
parents:
diff changeset
489 }
e78566595089 initial import
mandel
parents:
diff changeset
490 }
e78566595089 initial import
mandel
parents:
diff changeset
491 }
e78566595089 initial import
mandel
parents:
diff changeset
492
e78566595089 initial import
mandel
parents:
diff changeset
493 cls = cls->baseClass();
e78566595089 initial import
mandel
parents:
diff changeset
494 } while (cls != 0 && mainClass == 0); // Once when mainClass != 0, or once for all base classes of implementing class
e78566595089 initial import
mandel
parents:
diff changeset
495
e78566595089 initial import
mandel
parents:
diff changeset
496 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
497
e78566595089 initial import
mandel
parents:
diff changeset
498 }
e78566595089 initial import
mandel
parents:
diff changeset
499
e78566595089 initial import
mandel
parents:
diff changeset
500 bool AbstractMetaFunction::nullPointersDisabled(const AbstractMetaClass *mainClass, int argument_idx) const
e78566595089 initial import
mandel
parents:
diff changeset
501 {
e78566595089 initial import
mandel
parents:
diff changeset
502 const AbstractMetaClass *cls = mainClass;
e78566595089 initial import
mandel
parents:
diff changeset
503 if (cls == 0)
e78566595089 initial import
mandel
parents:
diff changeset
504 cls = implementingClass();
e78566595089 initial import
mandel
parents:
diff changeset
505
e78566595089 initial import
mandel
parents:
diff changeset
506 do {
e78566595089 initial import
mandel
parents:
diff changeset
507 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
508 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
509 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
510 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
511 if (argument_modification.index == argument_idx
e78566595089 initial import
mandel
parents:
diff changeset
512 && argument_modification.no_null_pointers) {
e78566595089 initial import
mandel
parents:
diff changeset
513 return true;
e78566595089 initial import
mandel
parents:
diff changeset
514 }
e78566595089 initial import
mandel
parents:
diff changeset
515 }
e78566595089 initial import
mandel
parents:
diff changeset
516 }
e78566595089 initial import
mandel
parents:
diff changeset
517
e78566595089 initial import
mandel
parents:
diff changeset
518 cls = cls->baseClass();
e78566595089 initial import
mandel
parents:
diff changeset
519 } while (cls != 0 && mainClass == 0); // Once when mainClass != 0, or once for all base classes of implementing class
e78566595089 initial import
mandel
parents:
diff changeset
520
e78566595089 initial import
mandel
parents:
diff changeset
521 return false;
e78566595089 initial import
mandel
parents:
diff changeset
522 }
e78566595089 initial import
mandel
parents:
diff changeset
523
e78566595089 initial import
mandel
parents:
diff changeset
524 QString AbstractMetaFunction::conversionRule(TypeSystem::Language language, int key) const
e78566595089 initial import
mandel
parents:
diff changeset
525 {
e78566595089 initial import
mandel
parents:
diff changeset
526 FunctionModificationList modifications = this->modifications(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
527 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
528 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
529 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
530 if (argument_modification.index != key)
e78566595089 initial import
mandel
parents:
diff changeset
531 continue;
e78566595089 initial import
mandel
parents:
diff changeset
532
e78566595089 initial import
mandel
parents:
diff changeset
533 foreach (CodeSnip snip, argument_modification.conversion_rules) {
e78566595089 initial import
mandel
parents:
diff changeset
534 if (snip.language == language && !snip.code().isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
535 return snip.code();
e78566595089 initial import
mandel
parents:
diff changeset
536 }
e78566595089 initial import
mandel
parents:
diff changeset
537 }
e78566595089 initial import
mandel
parents:
diff changeset
538 }
e78566595089 initial import
mandel
parents:
diff changeset
539
e78566595089 initial import
mandel
parents:
diff changeset
540 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
541 }
e78566595089 initial import
mandel
parents:
diff changeset
542
e78566595089 initial import
mandel
parents:
diff changeset
543 QString AbstractMetaFunction::argumentReplaced(int key) const
e78566595089 initial import
mandel
parents:
diff changeset
544 {
e78566595089 initial import
mandel
parents:
diff changeset
545 FunctionModificationList modifications = this->modifications(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
546 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
547 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
548 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
549 if (argument_modification.index == key && !argument_modification.replace_value.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
550 return argument_modification.replace_value;
e78566595089 initial import
mandel
parents:
diff changeset
551 }
e78566595089 initial import
mandel
parents:
diff changeset
552 }
e78566595089 initial import
mandel
parents:
diff changeset
553 }
e78566595089 initial import
mandel
parents:
diff changeset
554
e78566595089 initial import
mandel
parents:
diff changeset
555 return "";
e78566595089 initial import
mandel
parents:
diff changeset
556 }
e78566595089 initial import
mandel
parents:
diff changeset
557
e78566595089 initial import
mandel
parents:
diff changeset
558 bool AbstractMetaFunction::argumentRemoved(int key) const
e78566595089 initial import
mandel
parents:
diff changeset
559 {
e78566595089 initial import
mandel
parents:
diff changeset
560 FunctionModificationList modifications = this->modifications(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
561 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
562 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
563 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
564 if (argument_modification.index == key) {
e78566595089 initial import
mandel
parents:
diff changeset
565 if (argument_modification.removed) {
e78566595089 initial import
mandel
parents:
diff changeset
566 return true;
e78566595089 initial import
mandel
parents:
diff changeset
567 }
e78566595089 initial import
mandel
parents:
diff changeset
568 }
e78566595089 initial import
mandel
parents:
diff changeset
569 }
e78566595089 initial import
mandel
parents:
diff changeset
570 }
e78566595089 initial import
mandel
parents:
diff changeset
571
e78566595089 initial import
mandel
parents:
diff changeset
572 return false;
e78566595089 initial import
mandel
parents:
diff changeset
573 }
e78566595089 initial import
mandel
parents:
diff changeset
574
e78566595089 initial import
mandel
parents:
diff changeset
575 bool AbstractMetaFunction::storeResult() const
e78566595089 initial import
mandel
parents:
diff changeset
576 {
e78566595089 initial import
mandel
parents:
diff changeset
577 if (m_store_result == 2)
e78566595089 initial import
mandel
parents:
diff changeset
578 return true;
e78566595089 initial import
mandel
parents:
diff changeset
579 else
e78566595089 initial import
mandel
parents:
diff changeset
580 return false;
e78566595089 initial import
mandel
parents:
diff changeset
581 }
e78566595089 initial import
mandel
parents:
diff changeset
582
e78566595089 initial import
mandel
parents:
diff changeset
583 void AbstractMetaFunction::checkStoreResult()
e78566595089 initial import
mandel
parents:
diff changeset
584 {
e78566595089 initial import
mandel
parents:
diff changeset
585 FunctionModificationList modifications = this->modifications(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
586 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
587 if (modification.store_result) {
e78566595089 initial import
mandel
parents:
diff changeset
588 m_store_result = 2;
e78566595089 initial import
mandel
parents:
diff changeset
589 return;
e78566595089 initial import
mandel
parents:
diff changeset
590 }
e78566595089 initial import
mandel
parents:
diff changeset
591 }
e78566595089 initial import
mandel
parents:
diff changeset
592
e78566595089 initial import
mandel
parents:
diff changeset
593 m_store_result = 1;
e78566595089 initial import
mandel
parents:
diff changeset
594 }
e78566595089 initial import
mandel
parents:
diff changeset
595
e78566595089 initial import
mandel
parents:
diff changeset
596 bool AbstractMetaFunction::isVirtualSlot() const
e78566595089 initial import
mandel
parents:
diff changeset
597 {
e78566595089 initial import
mandel
parents:
diff changeset
598 FunctionModificationList modifications = this->modifications(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
599 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
600 if (modification.isVirtualSlot())
e78566595089 initial import
mandel
parents:
diff changeset
601 return true;
e78566595089 initial import
mandel
parents:
diff changeset
602 }
e78566595089 initial import
mandel
parents:
diff changeset
603
e78566595089 initial import
mandel
parents:
diff changeset
604 return false;
e78566595089 initial import
mandel
parents:
diff changeset
605 }
e78566595089 initial import
mandel
parents:
diff changeset
606
e78566595089 initial import
mandel
parents:
diff changeset
607 bool AbstractMetaFunction::disabledGarbageCollection(const AbstractMetaClass *cls, int key) const
e78566595089 initial import
mandel
parents:
diff changeset
608 {
e78566595089 initial import
mandel
parents:
diff changeset
609 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
610 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
611 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
612 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
613 if (argument_modification.index != key)
e78566595089 initial import
mandel
parents:
diff changeset
614 continue;
e78566595089 initial import
mandel
parents:
diff changeset
615
e78566595089 initial import
mandel
parents:
diff changeset
616 foreach (TypeSystem::Ownership ownership, argument_modification.ownerships.values()) {
e78566595089 initial import
mandel
parents:
diff changeset
617 if (ownership == TypeSystem::CppOwnership)
e78566595089 initial import
mandel
parents:
diff changeset
618 return true;
e78566595089 initial import
mandel
parents:
diff changeset
619 }
e78566595089 initial import
mandel
parents:
diff changeset
620
e78566595089 initial import
mandel
parents:
diff changeset
621 }
e78566595089 initial import
mandel
parents:
diff changeset
622 }
e78566595089 initial import
mandel
parents:
diff changeset
623
e78566595089 initial import
mandel
parents:
diff changeset
624 return false;
e78566595089 initial import
mandel
parents:
diff changeset
625 }
e78566595089 initial import
mandel
parents:
diff changeset
626
e78566595089 initial import
mandel
parents:
diff changeset
627 bool AbstractMetaFunction::isDeprecated() const
e78566595089 initial import
mandel
parents:
diff changeset
628 {
e78566595089 initial import
mandel
parents:
diff changeset
629 FunctionModificationList modifications = this->modifications(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
630 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
631 if (modification.isDeprecated())
e78566595089 initial import
mandel
parents:
diff changeset
632 return true;
e78566595089 initial import
mandel
parents:
diff changeset
633 }
e78566595089 initial import
mandel
parents:
diff changeset
634 return false;
e78566595089 initial import
mandel
parents:
diff changeset
635 }
e78566595089 initial import
mandel
parents:
diff changeset
636
e78566595089 initial import
mandel
parents:
diff changeset
637 TypeSystem::Ownership AbstractMetaFunction::ownership(const AbstractMetaClass *cls, TypeSystem::Language language, int key) const
e78566595089 initial import
mandel
parents:
diff changeset
638 {
e78566595089 initial import
mandel
parents:
diff changeset
639 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
640 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
641 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
642 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
643 if (argument_modification.index == key)
e78566595089 initial import
mandel
parents:
diff changeset
644 return argument_modification.ownerships.value(language, TypeSystem::InvalidOwnership);
e78566595089 initial import
mandel
parents:
diff changeset
645 }
e78566595089 initial import
mandel
parents:
diff changeset
646 }
e78566595089 initial import
mandel
parents:
diff changeset
647
e78566595089 initial import
mandel
parents:
diff changeset
648 return TypeSystem::InvalidOwnership;
e78566595089 initial import
mandel
parents:
diff changeset
649 }
e78566595089 initial import
mandel
parents:
diff changeset
650
e78566595089 initial import
mandel
parents:
diff changeset
651 bool AbstractMetaFunction::isRemovedFromAllLanguages(const AbstractMetaClass *cls) const
e78566595089 initial import
mandel
parents:
diff changeset
652 {
e78566595089 initial import
mandel
parents:
diff changeset
653 return isRemovedFrom(cls, TypeSystem::All);
e78566595089 initial import
mandel
parents:
diff changeset
654 }
e78566595089 initial import
mandel
parents:
diff changeset
655
e78566595089 initial import
mandel
parents:
diff changeset
656 bool AbstractMetaFunction::isRemovedFrom(const AbstractMetaClass *cls, TypeSystem::Language language) const
e78566595089 initial import
mandel
parents:
diff changeset
657 {
e78566595089 initial import
mandel
parents:
diff changeset
658 FunctionModificationList modifications = this->modifications(cls);
e78566595089 initial import
mandel
parents:
diff changeset
659 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
660 if ((modification.removal & language) == language)
e78566595089 initial import
mandel
parents:
diff changeset
661 return true;
e78566595089 initial import
mandel
parents:
diff changeset
662 }
e78566595089 initial import
mandel
parents:
diff changeset
663
e78566595089 initial import
mandel
parents:
diff changeset
664 return false;
e78566595089 initial import
mandel
parents:
diff changeset
665
e78566595089 initial import
mandel
parents:
diff changeset
666 }
e78566595089 initial import
mandel
parents:
diff changeset
667
e78566595089 initial import
mandel
parents:
diff changeset
668 QString AbstractMetaFunction::typeReplaced(int key) const
e78566595089 initial import
mandel
parents:
diff changeset
669 {
e78566595089 initial import
mandel
parents:
diff changeset
670 FunctionModificationList modifications = this->modifications(declaringClass());
e78566595089 initial import
mandel
parents:
diff changeset
671 foreach (FunctionModification modification, modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
672 QList<ArgumentModification> argument_modifications = modification.argument_mods;
e78566595089 initial import
mandel
parents:
diff changeset
673 foreach (ArgumentModification argument_modification, argument_modifications) {
e78566595089 initial import
mandel
parents:
diff changeset
674 if (argument_modification.index == key
e78566595089 initial import
mandel
parents:
diff changeset
675 && !argument_modification.modified_type.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
676 return argument_modification.modified_type;
e78566595089 initial import
mandel
parents:
diff changeset
677 }
e78566595089 initial import
mandel
parents:
diff changeset
678 }
e78566595089 initial import
mandel
parents:
diff changeset
679 }
e78566595089 initial import
mandel
parents:
diff changeset
680
e78566595089 initial import
mandel
parents:
diff changeset
681 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
682 }
e78566595089 initial import
mandel
parents:
diff changeset
683
288
f9559a957be9 new signals and slots implementation
eldar
parents: 39
diff changeset
684 QString AbstractMetaFunction::minimalSignature(int reduce) const
1
e78566595089 initial import
mandel
parents:
diff changeset
685 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 39
diff changeset
686 if (!m_cached_minimal_signature.isEmpty() && !reduce)
1
e78566595089 initial import
mandel
parents:
diff changeset
687 return m_cached_minimal_signature;
e78566595089 initial import
mandel
parents:
diff changeset
688
e78566595089 initial import
mandel
parents:
diff changeset
689 QString minimalSignature = originalName() + "(";
e78566595089 initial import
mandel
parents:
diff changeset
690 AbstractMetaArgumentList arguments = this->arguments();
288
f9559a957be9 new signals and slots implementation
eldar
parents: 39
diff changeset
691 int argsCount = arguments.count() - reduce;
f9559a957be9 new signals and slots implementation
eldar
parents: 39
diff changeset
692 for (int i=0; i<argsCount; ++i) {
1
e78566595089 initial import
mandel
parents:
diff changeset
693 AbstractMetaType *t = arguments.at(i)->type();
e78566595089 initial import
mandel
parents:
diff changeset
694
e78566595089 initial import
mandel
parents:
diff changeset
695 if (i > 0)
e78566595089 initial import
mandel
parents:
diff changeset
696 minimalSignature += ",";
e78566595089 initial import
mandel
parents:
diff changeset
697
e78566595089 initial import
mandel
parents:
diff changeset
698 minimalSignature += t->minimalSignature();
e78566595089 initial import
mandel
parents:
diff changeset
699 }
e78566595089 initial import
mandel
parents:
diff changeset
700 minimalSignature += ")";
e78566595089 initial import
mandel
parents:
diff changeset
701 if (isConstant())
e78566595089 initial import
mandel
parents:
diff changeset
702 minimalSignature += "const";
e78566595089 initial import
mandel
parents:
diff changeset
703
e78566595089 initial import
mandel
parents:
diff changeset
704 minimalSignature = QMetaObject::normalizedSignature(minimalSignature.toLocal8Bit().constData());
288
f9559a957be9 new signals and slots implementation
eldar
parents: 39
diff changeset
705 if(!reduce)
f9559a957be9 new signals and slots implementation
eldar
parents: 39
diff changeset
706 m_cached_minimal_signature = minimalSignature;
1
e78566595089 initial import
mandel
parents:
diff changeset
707
e78566595089 initial import
mandel
parents:
diff changeset
708 return minimalSignature;
e78566595089 initial import
mandel
parents:
diff changeset
709 }
e78566595089 initial import
mandel
parents:
diff changeset
710
e78566595089 initial import
mandel
parents:
diff changeset
711 FunctionModificationList AbstractMetaFunction::modifications(const AbstractMetaClass *implementor) const
e78566595089 initial import
mandel
parents:
diff changeset
712 {
e78566595089 initial import
mandel
parents:
diff changeset
713 Q_ASSERT(implementor);
e78566595089 initial import
mandel
parents:
diff changeset
714 return implementor->typeEntry()->functionModifications(minimalSignature());
e78566595089 initial import
mandel
parents:
diff changeset
715 }
e78566595089 initial import
mandel
parents:
diff changeset
716
e78566595089 initial import
mandel
parents:
diff changeset
717 bool AbstractMetaFunction::hasModifications(const AbstractMetaClass *implementor) const
e78566595089 initial import
mandel
parents:
diff changeset
718 {
e78566595089 initial import
mandel
parents:
diff changeset
719 FunctionModificationList mods = modifications(implementor);
e78566595089 initial import
mandel
parents:
diff changeset
720 return mods.count() > 0;
e78566595089 initial import
mandel
parents:
diff changeset
721 }
e78566595089 initial import
mandel
parents:
diff changeset
722
e78566595089 initial import
mandel
parents:
diff changeset
723 QString AbstractMetaFunction::modifiedName() const
e78566595089 initial import
mandel
parents:
diff changeset
724 {
e78566595089 initial import
mandel
parents:
diff changeset
725 if (m_cached_modified_name.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
726 FunctionModificationList mods = modifications(implementingClass());
e78566595089 initial import
mandel
parents:
diff changeset
727 foreach (FunctionModification mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
728 if (mod.isRenameModifier()) {
e78566595089 initial import
mandel
parents:
diff changeset
729 m_cached_modified_name = mod.renamedToName;
e78566595089 initial import
mandel
parents:
diff changeset
730 break;
e78566595089 initial import
mandel
parents:
diff changeset
731 }
e78566595089 initial import
mandel
parents:
diff changeset
732 }
e78566595089 initial import
mandel
parents:
diff changeset
733 if (m_cached_modified_name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
734 m_cached_modified_name = name();
e78566595089 initial import
mandel
parents:
diff changeset
735 }
e78566595089 initial import
mandel
parents:
diff changeset
736 return m_cached_modified_name;
e78566595089 initial import
mandel
parents:
diff changeset
737 }
e78566595089 initial import
mandel
parents:
diff changeset
738
e78566595089 initial import
mandel
parents:
diff changeset
739 QString AbstractMetaFunction::targetLangSignature(bool minimal) const
e78566595089 initial import
mandel
parents:
diff changeset
740 {
e78566595089 initial import
mandel
parents:
diff changeset
741 QString s;
e78566595089 initial import
mandel
parents:
diff changeset
742
e78566595089 initial import
mandel
parents:
diff changeset
743 // Attributes...
e78566595089 initial import
mandel
parents:
diff changeset
744 if (!minimal) {
e78566595089 initial import
mandel
parents:
diff changeset
745 if (isPublic()) s += "public ";
e78566595089 initial import
mandel
parents:
diff changeset
746 else if (isProtected()) s += "protected ";
e78566595089 initial import
mandel
parents:
diff changeset
747 else if (isPrivate()) s += "private ";
e78566595089 initial import
mandel
parents:
diff changeset
748
e78566595089 initial import
mandel
parents:
diff changeset
749 // if (isNative()) s += "native ";
e78566595089 initial import
mandel
parents:
diff changeset
750 // else
e78566595089 initial import
mandel
parents:
diff changeset
751 if (isFinalInTargetLang()) s += "final ";
e78566595089 initial import
mandel
parents:
diff changeset
752 else if (isAbstract()) s += "abstract ";
e78566595089 initial import
mandel
parents:
diff changeset
753
e78566595089 initial import
mandel
parents:
diff changeset
754 if (isStatic()) s += "static ";
e78566595089 initial import
mandel
parents:
diff changeset
755
e78566595089 initial import
mandel
parents:
diff changeset
756 // Return type
e78566595089 initial import
mandel
parents:
diff changeset
757 if (type())
e78566595089 initial import
mandel
parents:
diff changeset
758 s += type()->fullName() + " ";
e78566595089 initial import
mandel
parents:
diff changeset
759 else
e78566595089 initial import
mandel
parents:
diff changeset
760 s += "void ";
e78566595089 initial import
mandel
parents:
diff changeset
761 }
e78566595089 initial import
mandel
parents:
diff changeset
762
e78566595089 initial import
mandel
parents:
diff changeset
763 s += name();
e78566595089 initial import
mandel
parents:
diff changeset
764 s += "(";
e78566595089 initial import
mandel
parents:
diff changeset
765
e78566595089 initial import
mandel
parents:
diff changeset
766 for (int i=0; i<m_arguments.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
767 if (i != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
768 s += ",";
e78566595089 initial import
mandel
parents:
diff changeset
769 if (!minimal)
e78566595089 initial import
mandel
parents:
diff changeset
770 s += QLatin1Char(' ');
e78566595089 initial import
mandel
parents:
diff changeset
771 }
e78566595089 initial import
mandel
parents:
diff changeset
772 s += m_arguments.at(i)->type()->fullName();
e78566595089 initial import
mandel
parents:
diff changeset
773
e78566595089 initial import
mandel
parents:
diff changeset
774 if (!minimal) {
e78566595089 initial import
mandel
parents:
diff changeset
775 s += " ";
e78566595089 initial import
mandel
parents:
diff changeset
776 s += m_arguments.at(i)->argumentName();
e78566595089 initial import
mandel
parents:
diff changeset
777 }
e78566595089 initial import
mandel
parents:
diff changeset
778 }
e78566595089 initial import
mandel
parents:
diff changeset
779
e78566595089 initial import
mandel
parents:
diff changeset
780 s += ")";
e78566595089 initial import
mandel
parents:
diff changeset
781
e78566595089 initial import
mandel
parents:
diff changeset
782 return s;
e78566595089 initial import
mandel
parents:
diff changeset
783 }
e78566595089 initial import
mandel
parents:
diff changeset
784
e78566595089 initial import
mandel
parents:
diff changeset
785
e78566595089 initial import
mandel
parents:
diff changeset
786 bool function_sorter(AbstractMetaFunction *a, AbstractMetaFunction *b)
e78566595089 initial import
mandel
parents:
diff changeset
787 {
e78566595089 initial import
mandel
parents:
diff changeset
788 return a->signature() < b->signature();
e78566595089 initial import
mandel
parents:
diff changeset
789 }
e78566595089 initial import
mandel
parents:
diff changeset
790
e78566595089 initial import
mandel
parents:
diff changeset
791 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
792 * AbstractMetaClass
e78566595089 initial import
mandel
parents:
diff changeset
793 */
e78566595089 initial import
mandel
parents:
diff changeset
794 AbstractMetaClass::~AbstractMetaClass()
e78566595089 initial import
mandel
parents:
diff changeset
795 {
e78566595089 initial import
mandel
parents:
diff changeset
796 qDeleteAll(m_functions);
e78566595089 initial import
mandel
parents:
diff changeset
797 qDeleteAll(m_fields);
e78566595089 initial import
mandel
parents:
diff changeset
798 }
e78566595089 initial import
mandel
parents:
diff changeset
799
e78566595089 initial import
mandel
parents:
diff changeset
800 /*AbstractMetaClass *AbstractMetaClass::copy() const
e78566595089 initial import
mandel
parents:
diff changeset
801 {
e78566595089 initial import
mandel
parents:
diff changeset
802 AbstractMetaClass *cls = new AbstractMetaClass;
e78566595089 initial import
mandel
parents:
diff changeset
803 cls->setAttributes(attributes());
e78566595089 initial import
mandel
parents:
diff changeset
804 cls->setBaseClass(baseClass());
e78566595089 initial import
mandel
parents:
diff changeset
805 cls->setTypeEntry(typeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
806 foreach (AbstractMetaFunction *function, functions()) {
e78566595089 initial import
mandel
parents:
diff changeset
807 AbstractMetaFunction *copy = function->copy();
e78566595089 initial import
mandel
parents:
diff changeset
808 function->setImplementingClass(cls);
e78566595089 initial import
mandel
parents:
diff changeset
809 cls->addFunction(copy);
e78566595089 initial import
mandel
parents:
diff changeset
810 }
e78566595089 initial import
mandel
parents:
diff changeset
811 cls->setEnums(enums());
e78566595089 initial import
mandel
parents:
diff changeset
812 foreach (const AbstractMetaField *field, fields()) {
e78566595089 initial import
mandel
parents:
diff changeset
813 AbstractMetaField *copy = field->copy();
e78566595089 initial import
mandel
parents:
diff changeset
814 copy->setEnclosingClass(cls);
e78566595089 initial import
mandel
parents:
diff changeset
815 cls->addField(copy);
e78566595089 initial import
mandel
parents:
diff changeset
816 }
e78566595089 initial import
mandel
parents:
diff changeset
817 cls->setInterfaces(interfaces());
e78566595089 initial import
mandel
parents:
diff changeset
818
e78566595089 initial import
mandel
parents:
diff changeset
819 return cls;
e78566595089 initial import
mandel
parents:
diff changeset
820 }*/
e78566595089 initial import
mandel
parents:
diff changeset
821
e78566595089 initial import
mandel
parents:
diff changeset
822 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
823 * Returns true if this class is a subclass of the given class
e78566595089 initial import
mandel
parents:
diff changeset
824 */
e78566595089 initial import
mandel
parents:
diff changeset
825 bool AbstractMetaClass::inheritsFrom(const AbstractMetaClass *cls) const
e78566595089 initial import
mandel
parents:
diff changeset
826 {
e78566595089 initial import
mandel
parents:
diff changeset
827 Q_ASSERT(cls != 0);
e78566595089 initial import
mandel
parents:
diff changeset
828
e78566595089 initial import
mandel
parents:
diff changeset
829 const AbstractMetaClass *clazz = this;
e78566595089 initial import
mandel
parents:
diff changeset
830 while (clazz != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
831 if (clazz == cls)
e78566595089 initial import
mandel
parents:
diff changeset
832 return true;
e78566595089 initial import
mandel
parents:
diff changeset
833
e78566595089 initial import
mandel
parents:
diff changeset
834 clazz = clazz->baseClass();
e78566595089 initial import
mandel
parents:
diff changeset
835 }
e78566595089 initial import
mandel
parents:
diff changeset
836
e78566595089 initial import
mandel
parents:
diff changeset
837 return false;
e78566595089 initial import
mandel
parents:
diff changeset
838 }
e78566595089 initial import
mandel
parents:
diff changeset
839
e78566595089 initial import
mandel
parents:
diff changeset
840 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
841 * Constructs an interface based on the functions and enums in this
e78566595089 initial import
mandel
parents:
diff changeset
842 * class and returns it...
e78566595089 initial import
mandel
parents:
diff changeset
843 */
e78566595089 initial import
mandel
parents:
diff changeset
844 AbstractMetaClass *AbstractMetaClass::extractInterface()
e78566595089 initial import
mandel
parents:
diff changeset
845 {
e78566595089 initial import
mandel
parents:
diff changeset
846 Q_ASSERT(typeEntry()->designatedInterface());
e78566595089 initial import
mandel
parents:
diff changeset
847
e78566595089 initial import
mandel
parents:
diff changeset
848 if (m_extracted_interface == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
849 AbstractMetaClass *iface = new AbstractMetaClass;
e78566595089 initial import
mandel
parents:
diff changeset
850 iface->setAttributes(attributes());
e78566595089 initial import
mandel
parents:
diff changeset
851 iface->setBaseClass(0);
e78566595089 initial import
mandel
parents:
diff changeset
852 iface->setPrimaryInterfaceImplementor(this);
e78566595089 initial import
mandel
parents:
diff changeset
853
e78566595089 initial import
mandel
parents:
diff changeset
854 iface->setTypeEntry(typeEntry()->designatedInterface());
e78566595089 initial import
mandel
parents:
diff changeset
855
e78566595089 initial import
mandel
parents:
diff changeset
856 foreach (AbstractMetaFunction *function, functions()) {
e78566595089 initial import
mandel
parents:
diff changeset
857 if (!function->isConstructor())
e78566595089 initial import
mandel
parents:
diff changeset
858 iface->addFunction(function->copy());
e78566595089 initial import
mandel
parents:
diff changeset
859 }
e78566595089 initial import
mandel
parents:
diff changeset
860
e78566595089 initial import
mandel
parents:
diff changeset
861 // iface->setEnums(enums());
e78566595089 initial import
mandel
parents:
diff changeset
862 // setEnums(AbstractMetaEnumList());
e78566595089 initial import
mandel
parents:
diff changeset
863
e78566595089 initial import
mandel
parents:
diff changeset
864 foreach (const AbstractMetaField *field, fields()) {
e78566595089 initial import
mandel
parents:
diff changeset
865 if (field->isPublic()) {
e78566595089 initial import
mandel
parents:
diff changeset
866 AbstractMetaField *new_field = field->copy();
e78566595089 initial import
mandel
parents:
diff changeset
867 new_field->setEnclosingClass(iface);
e78566595089 initial import
mandel
parents:
diff changeset
868 iface->addField(new_field);
e78566595089 initial import
mandel
parents:
diff changeset
869 }
e78566595089 initial import
mandel
parents:
diff changeset
870 }
e78566595089 initial import
mandel
parents:
diff changeset
871
e78566595089 initial import
mandel
parents:
diff changeset
872 m_extracted_interface = iface;
e78566595089 initial import
mandel
parents:
diff changeset
873 addInterface(iface);
e78566595089 initial import
mandel
parents:
diff changeset
874 }
e78566595089 initial import
mandel
parents:
diff changeset
875
e78566595089 initial import
mandel
parents:
diff changeset
876 return m_extracted_interface;
e78566595089 initial import
mandel
parents:
diff changeset
877 }
e78566595089 initial import
mandel
parents:
diff changeset
878
e78566595089 initial import
mandel
parents:
diff changeset
879 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
880 * Returns a list of all the functions with a given name
e78566595089 initial import
mandel
parents:
diff changeset
881 */
e78566595089 initial import
mandel
parents:
diff changeset
882 AbstractMetaFunctionList AbstractMetaClass::queryFunctionsByName(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
883 {
e78566595089 initial import
mandel
parents:
diff changeset
884 AbstractMetaFunctionList returned;
e78566595089 initial import
mandel
parents:
diff changeset
885 AbstractMetaFunctionList functions = this->functions();
e78566595089 initial import
mandel
parents:
diff changeset
886 foreach (AbstractMetaFunction *function, functions) {
e78566595089 initial import
mandel
parents:
diff changeset
887 if (function->name() == name)
e78566595089 initial import
mandel
parents:
diff changeset
888 returned.append(function);
e78566595089 initial import
mandel
parents:
diff changeset
889 }
e78566595089 initial import
mandel
parents:
diff changeset
890
e78566595089 initial import
mandel
parents:
diff changeset
891 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
892 }
e78566595089 initial import
mandel
parents:
diff changeset
893
e78566595089 initial import
mandel
parents:
diff changeset
894 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
895 * Returns all reference count modifications for any function in the class
e78566595089 initial import
mandel
parents:
diff changeset
896 */
e78566595089 initial import
mandel
parents:
diff changeset
897 QList<ReferenceCount> AbstractMetaClass::referenceCounts() const
e78566595089 initial import
mandel
parents:
diff changeset
898 {
e78566595089 initial import
mandel
parents:
diff changeset
899 QList<ReferenceCount> returned;
e78566595089 initial import
mandel
parents:
diff changeset
900
e78566595089 initial import
mandel
parents:
diff changeset
901 AbstractMetaFunctionList functions = this->functions();
e78566595089 initial import
mandel
parents:
diff changeset
902 foreach (AbstractMetaFunction *function, functions) {
e78566595089 initial import
mandel
parents:
diff changeset
903 returned += function->referenceCounts(this);
e78566595089 initial import
mandel
parents:
diff changeset
904 }
e78566595089 initial import
mandel
parents:
diff changeset
905
e78566595089 initial import
mandel
parents:
diff changeset
906 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
907 }
e78566595089 initial import
mandel
parents:
diff changeset
908
e78566595089 initial import
mandel
parents:
diff changeset
909 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
910 * Returns a list of all the functions retrieved during parsing which should
e78566595089 initial import
mandel
parents:
diff changeset
911 * be added to the Java API.
e78566595089 initial import
mandel
parents:
diff changeset
912 */
e78566595089 initial import
mandel
parents:
diff changeset
913 AbstractMetaFunctionList AbstractMetaClass::functionsInTargetLang() const
e78566595089 initial import
mandel
parents:
diff changeset
914 {
e78566595089 initial import
mandel
parents:
diff changeset
915 int default_flags = NormalFunctions | Visible | NotRemovedFromTargetLang;
e78566595089 initial import
mandel
parents:
diff changeset
916
e78566595089 initial import
mandel
parents:
diff changeset
917 // Interfaces don't implement functions
e78566595089 initial import
mandel
parents:
diff changeset
918 default_flags |= isInterface() ? 0 : ClassImplements;
e78566595089 initial import
mandel
parents:
diff changeset
919
e78566595089 initial import
mandel
parents:
diff changeset
920 // Only public functions in final classes
e78566595089 initial import
mandel
parents:
diff changeset
921 // default_flags |= isFinal() ? WasPublic : 0;
e78566595089 initial import
mandel
parents:
diff changeset
922 int public_flags = isFinal() ? WasPublic : 0;
e78566595089 initial import
mandel
parents:
diff changeset
923
e78566595089 initial import
mandel
parents:
diff changeset
924 // Constructors
e78566595089 initial import
mandel
parents:
diff changeset
925 AbstractMetaFunctionList returned = queryFunctions(Constructors | default_flags | public_flags);
e78566595089 initial import
mandel
parents:
diff changeset
926
e78566595089 initial import
mandel
parents:
diff changeset
927 // Final functions
e78566595089 initial import
mandel
parents:
diff changeset
928 returned += queryFunctions(FinalInTargetLangFunctions | NonStaticFunctions | default_flags | public_flags);
e78566595089 initial import
mandel
parents:
diff changeset
929
e78566595089 initial import
mandel
parents:
diff changeset
930 // Virtual functions
e78566595089 initial import
mandel
parents:
diff changeset
931 returned += queryFunctions(VirtualInTargetLangFunctions | NonStaticFunctions | default_flags | public_flags);
e78566595089 initial import
mandel
parents:
diff changeset
932
e78566595089 initial import
mandel
parents:
diff changeset
933 // Static functions
e78566595089 initial import
mandel
parents:
diff changeset
934 returned += queryFunctions(StaticFunctions | default_flags | public_flags);
e78566595089 initial import
mandel
parents:
diff changeset
935
e78566595089 initial import
mandel
parents:
diff changeset
936 // Empty, private functions, since they aren't caught by the other ones
e78566595089 initial import
mandel
parents:
diff changeset
937 returned += queryFunctions(Empty | Invisible);
e78566595089 initial import
mandel
parents:
diff changeset
938
e78566595089 initial import
mandel
parents:
diff changeset
939 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
940 }
e78566595089 initial import
mandel
parents:
diff changeset
941
e78566595089 initial import
mandel
parents:
diff changeset
942 AbstractMetaFunctionList AbstractMetaClass::virtualFunctions() const
e78566595089 initial import
mandel
parents:
diff changeset
943 {
e78566595089 initial import
mandel
parents:
diff changeset
944 AbstractMetaFunctionList list = functionsInShellClass();
e78566595089 initial import
mandel
parents:
diff changeset
945
e78566595089 initial import
mandel
parents:
diff changeset
946 AbstractMetaFunctionList returned;
e78566595089 initial import
mandel
parents:
diff changeset
947 foreach (AbstractMetaFunction *f, list) {
e78566595089 initial import
mandel
parents:
diff changeset
948 if (!f->isFinalInCpp() || f->isVirtualSlot())
e78566595089 initial import
mandel
parents:
diff changeset
949 returned += f;
e78566595089 initial import
mandel
parents:
diff changeset
950 }
e78566595089 initial import
mandel
parents:
diff changeset
951
e78566595089 initial import
mandel
parents:
diff changeset
952 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
953 }
e78566595089 initial import
mandel
parents:
diff changeset
954
e78566595089 initial import
mandel
parents:
diff changeset
955 AbstractMetaFunctionList AbstractMetaClass::nonVirtualShellFunctions() const
e78566595089 initial import
mandel
parents:
diff changeset
956 {
e78566595089 initial import
mandel
parents:
diff changeset
957 AbstractMetaFunctionList list = functionsInShellClass();
e78566595089 initial import
mandel
parents:
diff changeset
958 AbstractMetaFunctionList returned;
e78566595089 initial import
mandel
parents:
diff changeset
959 foreach (AbstractMetaFunction *f, list) {
e78566595089 initial import
mandel
parents:
diff changeset
960 if (f->isFinalInCpp() && !f->isVirtualSlot())
e78566595089 initial import
mandel
parents:
diff changeset
961 returned += f;
e78566595089 initial import
mandel
parents:
diff changeset
962 }
e78566595089 initial import
mandel
parents:
diff changeset
963
e78566595089 initial import
mandel
parents:
diff changeset
964 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
965 }
e78566595089 initial import
mandel
parents:
diff changeset
966
e78566595089 initial import
mandel
parents:
diff changeset
967 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
968 * Returns a list of all functions that should be declared and implemented in
e78566595089 initial import
mandel
parents:
diff changeset
969 * the shell class which is generated as a wrapper on top of the actual C++ class
e78566595089 initial import
mandel
parents:
diff changeset
970 */
e78566595089 initial import
mandel
parents:
diff changeset
971 AbstractMetaFunctionList AbstractMetaClass::functionsInShellClass() const
e78566595089 initial import
mandel
parents:
diff changeset
972 {
e78566595089 initial import
mandel
parents:
diff changeset
973 // Only functions and only protected and public functions
e78566595089 initial import
mandel
parents:
diff changeset
974 int default_flags = NormalFunctions | Visible | WasVisible | NotRemovedFromShell;
e78566595089 initial import
mandel
parents:
diff changeset
975
e78566595089 initial import
mandel
parents:
diff changeset
976 // All virtual functions
e78566595089 initial import
mandel
parents:
diff changeset
977 AbstractMetaFunctionList returned = queryFunctions(VirtualFunctions | default_flags);
e78566595089 initial import
mandel
parents:
diff changeset
978
e78566595089 initial import
mandel
parents:
diff changeset
979 // All functions explicitly set to be implemented by the shell class
e78566595089 initial import
mandel
parents:
diff changeset
980 // (mainly superclass functions that are hidden by other declarations)
e78566595089 initial import
mandel
parents:
diff changeset
981 returned += queryFunctions(ForcedShellFunctions | default_flags);
e78566595089 initial import
mandel
parents:
diff changeset
982
e78566595089 initial import
mandel
parents:
diff changeset
983 // All functions explicitly set to be virtual slots
e78566595089 initial import
mandel
parents:
diff changeset
984 returned += queryFunctions(VirtualSlots | default_flags);
e78566595089 initial import
mandel
parents:
diff changeset
985
e78566595089 initial import
mandel
parents:
diff changeset
986 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
987 }
e78566595089 initial import
mandel
parents:
diff changeset
988
e78566595089 initial import
mandel
parents:
diff changeset
989 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
990 * Returns a list of all functions that require a public override function to
e78566595089 initial import
mandel
parents:
diff changeset
991 * be generated in the shell class. This includes all functions that were originally
e78566595089 initial import
mandel
parents:
diff changeset
992 * protected in the superclass.
e78566595089 initial import
mandel
parents:
diff changeset
993 */
e78566595089 initial import
mandel
parents:
diff changeset
994 AbstractMetaFunctionList AbstractMetaClass::publicOverrideFunctions() const
e78566595089 initial import
mandel
parents:
diff changeset
995 {
e78566595089 initial import
mandel
parents:
diff changeset
996 return queryFunctions(NormalFunctions | WasProtected | FinalInCppFunctions | NotRemovedFromTargetLang)
e78566595089 initial import
mandel
parents:
diff changeset
997 + queryFunctions(Signals | WasProtected | FinalInCppFunctions | NotRemovedFromTargetLang);
e78566595089 initial import
mandel
parents:
diff changeset
998 }
e78566595089 initial import
mandel
parents:
diff changeset
999
e78566595089 initial import
mandel
parents:
diff changeset
1000 AbstractMetaFunctionList AbstractMetaClass::virtualOverrideFunctions() const
e78566595089 initial import
mandel
parents:
diff changeset
1001 {
e78566595089 initial import
mandel
parents:
diff changeset
1002 return queryFunctions(NormalFunctions | NonEmptyFunctions | Visible | VirtualInCppFunctions | NotRemovedFromShell) +
e78566595089 initial import
mandel
parents:
diff changeset
1003 queryFunctions(Signals | NonEmptyFunctions | Visible | VirtualInCppFunctions | NotRemovedFromShell);
e78566595089 initial import
mandel
parents:
diff changeset
1004 }
e78566595089 initial import
mandel
parents:
diff changeset
1005
e78566595089 initial import
mandel
parents:
diff changeset
1006 void AbstractMetaClass::sortFunctions()
e78566595089 initial import
mandel
parents:
diff changeset
1007 {
e78566595089 initial import
mandel
parents:
diff changeset
1008 qSort(m_functions.begin(), m_functions.end(), function_sorter);
e78566595089 initial import
mandel
parents:
diff changeset
1009 }
e78566595089 initial import
mandel
parents:
diff changeset
1010
e78566595089 initial import
mandel
parents:
diff changeset
1011 void AbstractMetaClass::setFunctions(const AbstractMetaFunctionList &functions)
e78566595089 initial import
mandel
parents:
diff changeset
1012 {
e78566595089 initial import
mandel
parents:
diff changeset
1013 m_functions = functions;
e78566595089 initial import
mandel
parents:
diff changeset
1014
e78566595089 initial import
mandel
parents:
diff changeset
1015 // Functions must be sorted by name before next loop
e78566595089 initial import
mandel
parents:
diff changeset
1016 sortFunctions();
e78566595089 initial import
mandel
parents:
diff changeset
1017
e78566595089 initial import
mandel
parents:
diff changeset
1018 QString currentName;
e78566595089 initial import
mandel
parents:
diff changeset
1019 bool hasVirtuals = false;
e78566595089 initial import
mandel
parents:
diff changeset
1020 AbstractMetaFunctionList final_functions;
e78566595089 initial import
mandel
parents:
diff changeset
1021 foreach (AbstractMetaFunction *f, m_functions) {
e78566595089 initial import
mandel
parents:
diff changeset
1022 f->setOwnerClass(this);
e78566595089 initial import
mandel
parents:
diff changeset
1023
e78566595089 initial import
mandel
parents:
diff changeset
1024 m_has_virtual_slots |= f->isVirtualSlot();
e78566595089 initial import
mandel
parents:
diff changeset
1025 m_has_virtuals |= !f->isFinal() || f->isVirtualSlot();
e78566595089 initial import
mandel
parents:
diff changeset
1026 m_has_nonpublic |= !f->isPublic();
e78566595089 initial import
mandel
parents:
diff changeset
1027
e78566595089 initial import
mandel
parents:
diff changeset
1028 // If we have non-virtual overloads of a virtual function, we have to implement
e78566595089 initial import
mandel
parents:
diff changeset
1029 // all the overloads in the shell class to override the hiding rule
e78566595089 initial import
mandel
parents:
diff changeset
1030 if (currentName == f->name()) {
e78566595089 initial import
mandel
parents:
diff changeset
1031 hasVirtuals = hasVirtuals || !f->isFinal();
e78566595089 initial import
mandel
parents:
diff changeset
1032 if (f->isFinal())
e78566595089 initial import
mandel
parents:
diff changeset
1033 final_functions += f;
e78566595089 initial import
mandel
parents:
diff changeset
1034 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1035 if (hasVirtuals && final_functions.size() > 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1036 foreach (AbstractMetaFunction *final_function, final_functions) {
e78566595089 initial import
mandel
parents:
diff changeset
1037 *final_function += AbstractMetaAttributes::ForceShellImplementation;
e78566595089 initial import
mandel
parents:
diff changeset
1038
e78566595089 initial import
mandel
parents:
diff changeset
1039 QString warn = QString("hiding of function '%1' in class '%2'")
e78566595089 initial import
mandel
parents:
diff changeset
1040 .arg(final_function->name()).arg(name());
e78566595089 initial import
mandel
parents:
diff changeset
1041 ReportHandler::warning(warn);
e78566595089 initial import
mandel
parents:
diff changeset
1042 }
e78566595089 initial import
mandel
parents:
diff changeset
1043 }
e78566595089 initial import
mandel
parents:
diff changeset
1044
e78566595089 initial import
mandel
parents:
diff changeset
1045 hasVirtuals = !f->isFinal();
e78566595089 initial import
mandel
parents:
diff changeset
1046 final_functions.clear();
e78566595089 initial import
mandel
parents:
diff changeset
1047 if (f->isFinal())
e78566595089 initial import
mandel
parents:
diff changeset
1048 final_functions += f;
e78566595089 initial import
mandel
parents:
diff changeset
1049 currentName = f->name();
e78566595089 initial import
mandel
parents:
diff changeset
1050 }
e78566595089 initial import
mandel
parents:
diff changeset
1051 }
e78566595089 initial import
mandel
parents:
diff changeset
1052
e78566595089 initial import
mandel
parents:
diff changeset
1053 #ifndef QT_NO_DEBUG
e78566595089 initial import
mandel
parents:
diff changeset
1054 bool duplicate_function = false;
e78566595089 initial import
mandel
parents:
diff changeset
1055 for (int j=0; j<m_functions.size(); ++j) {
e78566595089 initial import
mandel
parents:
diff changeset
1056 FunctionModificationList mods = m_functions.at(j)->modifications(m_functions.at(j)->implementingClass());
e78566595089 initial import
mandel
parents:
diff changeset
1057
e78566595089 initial import
mandel
parents:
diff changeset
1058 bool removed = false;
e78566595089 initial import
mandel
parents:
diff changeset
1059 foreach (const FunctionModification &mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
1060 if (mod.isRemoveModifier()) {
e78566595089 initial import
mandel
parents:
diff changeset
1061 removed = true;
e78566595089 initial import
mandel
parents:
diff changeset
1062 break ;
e78566595089 initial import
mandel
parents:
diff changeset
1063 }
e78566595089 initial import
mandel
parents:
diff changeset
1064 }
e78566595089 initial import
mandel
parents:
diff changeset
1065 if (removed)
e78566595089 initial import
mandel
parents:
diff changeset
1066 continue ;
e78566595089 initial import
mandel
parents:
diff changeset
1067
e78566595089 initial import
mandel
parents:
diff changeset
1068 for (int i=0; i<m_functions.size() - 1; ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
1069 if (j == i)
e78566595089 initial import
mandel
parents:
diff changeset
1070 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1071
e78566595089 initial import
mandel
parents:
diff changeset
1072 mods = m_functions.at(i)->modifications(m_functions.at(i)->implementingClass());
e78566595089 initial import
mandel
parents:
diff changeset
1073 bool removed = false;
e78566595089 initial import
mandel
parents:
diff changeset
1074 foreach (const FunctionModification &mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
1075 if (mod.isRemoveModifier()) {
e78566595089 initial import
mandel
parents:
diff changeset
1076 removed = true;
e78566595089 initial import
mandel
parents:
diff changeset
1077 break ;
e78566595089 initial import
mandel
parents:
diff changeset
1078 }
e78566595089 initial import
mandel
parents:
diff changeset
1079 }
e78566595089 initial import
mandel
parents:
diff changeset
1080 if (removed)
e78566595089 initial import
mandel
parents:
diff changeset
1081 continue ;
e78566595089 initial import
mandel
parents:
diff changeset
1082
e78566595089 initial import
mandel
parents:
diff changeset
1083 uint cmp = m_functions.at(i)->compareTo(m_functions.at(j));
e78566595089 initial import
mandel
parents:
diff changeset
1084 if ((cmp & AbstractMetaFunction::EqualName) && (cmp & AbstractMetaFunction::EqualArguments)) {
e78566595089 initial import
mandel
parents:
diff changeset
1085 printf("%s.%s mostly equal to %s.%s\n",
e78566595089 initial import
mandel
parents:
diff changeset
1086 qPrintable(m_functions.at(i)->implementingClass()->typeEntry()->qualifiedCppName()),
e78566595089 initial import
mandel
parents:
diff changeset
1087 qPrintable(m_functions.at(i)->signature()),
e78566595089 initial import
mandel
parents:
diff changeset
1088 qPrintable(m_functions.at(j)->implementingClass()->typeEntry()->qualifiedCppName()),
e78566595089 initial import
mandel
parents:
diff changeset
1089 qPrintable(m_functions.at(j)->signature()));
e78566595089 initial import
mandel
parents:
diff changeset
1090 duplicate_function = true;
e78566595089 initial import
mandel
parents:
diff changeset
1091 }
e78566595089 initial import
mandel
parents:
diff changeset
1092 }
e78566595089 initial import
mandel
parents:
diff changeset
1093 }
e78566595089 initial import
mandel
parents:
diff changeset
1094 //Q_ASSERT(!duplicate_function);
e78566595089 initial import
mandel
parents:
diff changeset
1095 #endif
e78566595089 initial import
mandel
parents:
diff changeset
1096 }
e78566595089 initial import
mandel
parents:
diff changeset
1097
e78566595089 initial import
mandel
parents:
diff changeset
1098 bool AbstractMetaClass::hasFieldAccessors() const
e78566595089 initial import
mandel
parents:
diff changeset
1099 {
e78566595089 initial import
mandel
parents:
diff changeset
1100 foreach (const AbstractMetaField *field, fields()) {
e78566595089 initial import
mandel
parents:
diff changeset
1101 if (field->getter() || field->setter())
e78566595089 initial import
mandel
parents:
diff changeset
1102 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1103 }
e78566595089 initial import
mandel
parents:
diff changeset
1104
e78566595089 initial import
mandel
parents:
diff changeset
1105 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1106 }
e78566595089 initial import
mandel
parents:
diff changeset
1107
e78566595089 initial import
mandel
parents:
diff changeset
1108 bool AbstractMetaClass::hasDefaultToStringFunction() const
e78566595089 initial import
mandel
parents:
diff changeset
1109 {
e78566595089 initial import
mandel
parents:
diff changeset
1110 foreach (AbstractMetaFunction *f, queryFunctionsByName("toString")) {
e78566595089 initial import
mandel
parents:
diff changeset
1111 if (f->actualMinimumArgumentCount() == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1112 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1113 }
e78566595089 initial import
mandel
parents:
diff changeset
1114
e78566595089 initial import
mandel
parents:
diff changeset
1115 }
e78566595089 initial import
mandel
parents:
diff changeset
1116 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1117 }
e78566595089 initial import
mandel
parents:
diff changeset
1118
e78566595089 initial import
mandel
parents:
diff changeset
1119 void AbstractMetaClass::addFunction(AbstractMetaFunction *function)
e78566595089 initial import
mandel
parents:
diff changeset
1120 {
e78566595089 initial import
mandel
parents:
diff changeset
1121 function->setOwnerClass(this);
e78566595089 initial import
mandel
parents:
diff changeset
1122
e78566595089 initial import
mandel
parents:
diff changeset
1123 if (!function->isDestructor()) {
e78566595089 initial import
mandel
parents:
diff changeset
1124 m_functions << function;
e78566595089 initial import
mandel
parents:
diff changeset
1125 qSort(m_functions.begin(), m_functions.end(), function_sorter);
e78566595089 initial import
mandel
parents:
diff changeset
1126 }
e78566595089 initial import
mandel
parents:
diff changeset
1127
e78566595089 initial import
mandel
parents:
diff changeset
1128
e78566595089 initial import
mandel
parents:
diff changeset
1129 m_has_virtual_slots |= function->isVirtualSlot();
e78566595089 initial import
mandel
parents:
diff changeset
1130 m_has_virtuals |= !function->isFinal() || function->isVirtualSlot();
e78566595089 initial import
mandel
parents:
diff changeset
1131 m_has_nonpublic |= !function->isPublic();
e78566595089 initial import
mandel
parents:
diff changeset
1132 }
e78566595089 initial import
mandel
parents:
diff changeset
1133
e78566595089 initial import
mandel
parents:
diff changeset
1134 bool AbstractMetaClass::hasSignal(const AbstractMetaFunction *other) const
e78566595089 initial import
mandel
parents:
diff changeset
1135 {
e78566595089 initial import
mandel
parents:
diff changeset
1136 if (!other->isSignal())
e78566595089 initial import
mandel
parents:
diff changeset
1137 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1138
e78566595089 initial import
mandel
parents:
diff changeset
1139 foreach (const AbstractMetaFunction *f, functions()) {
e78566595089 initial import
mandel
parents:
diff changeset
1140 if (f->isSignal() && f->compareTo(other) & AbstractMetaFunction::EqualName)
e78566595089 initial import
mandel
parents:
diff changeset
1141 return other->modifiedName() == f->modifiedName();
e78566595089 initial import
mandel
parents:
diff changeset
1142 }
e78566595089 initial import
mandel
parents:
diff changeset
1143
e78566595089 initial import
mandel
parents:
diff changeset
1144 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1145 }
e78566595089 initial import
mandel
parents:
diff changeset
1146
e78566595089 initial import
mandel
parents:
diff changeset
1147
e78566595089 initial import
mandel
parents:
diff changeset
1148 QString AbstractMetaClass::name() const
e78566595089 initial import
mandel
parents:
diff changeset
1149 {
e78566595089 initial import
mandel
parents:
diff changeset
1150 return QString(m_type_entry->targetLangName()).replace("::", "_");
e78566595089 initial import
mandel
parents:
diff changeset
1151 }
e78566595089 initial import
mandel
parents:
diff changeset
1152
e78566595089 initial import
mandel
parents:
diff changeset
1153 bool AbstractMetaClass::hasFunction(const QString &str) const
e78566595089 initial import
mandel
parents:
diff changeset
1154 {
e78566595089 initial import
mandel
parents:
diff changeset
1155 foreach (const AbstractMetaFunction *f, functions())
e78566595089 initial import
mandel
parents:
diff changeset
1156 if (f->name() == str)
e78566595089 initial import
mandel
parents:
diff changeset
1157 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1158 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1159 }
e78566595089 initial import
mandel
parents:
diff changeset
1160
e78566595089 initial import
mandel
parents:
diff changeset
1161 /* Returns true if this class has one or more functions that are
e78566595089 initial import
mandel
parents:
diff changeset
1162 protected. If a class has protected members we need to generate a
e78566595089 initial import
mandel
parents:
diff changeset
1163 shell class with public accessors to the protected functions, so
e78566595089 initial import
mandel
parents:
diff changeset
1164 they can be called from the native functions.
e78566595089 initial import
mandel
parents:
diff changeset
1165 */
e78566595089 initial import
mandel
parents:
diff changeset
1166 bool AbstractMetaClass::hasProtectedFunctions() const {
e78566595089 initial import
mandel
parents:
diff changeset
1167 foreach (AbstractMetaFunction *func, m_functions) {
e78566595089 initial import
mandel
parents:
diff changeset
1168 if (func->isProtected())
e78566595089 initial import
mandel
parents:
diff changeset
1169 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1170 }
e78566595089 initial import
mandel
parents:
diff changeset
1171 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1172 }
e78566595089 initial import
mandel
parents:
diff changeset
1173
e78566595089 initial import
mandel
parents:
diff changeset
1174 bool AbstractMetaClass::generateShellClass() const
e78566595089 initial import
mandel
parents:
diff changeset
1175 {
e78566595089 initial import
mandel
parents:
diff changeset
1176 return m_force_shell_class ||
e78566595089 initial import
mandel
parents:
diff changeset
1177 (!isFinal()
354
18bd68f586c6 removed superfluous destructors
Max Samukha <maxter@spambox.com>
parents: 327
diff changeset
1178 && (isPolymorphic()
1
e78566595089 initial import
mandel
parents:
diff changeset
1179 || hasProtectedFunctions()
e78566595089 initial import
mandel
parents:
diff changeset
1180 || hasFieldAccessors()
e78566595089 initial import
mandel
parents:
diff changeset
1181 || typeEntry()->isObject())); // qtd2 for being more consistent
e78566595089 initial import
mandel
parents:
diff changeset
1182 }
e78566595089 initial import
mandel
parents:
diff changeset
1183
e78566595089 initial import
mandel
parents:
diff changeset
1184 QPropertySpec *AbstractMetaClass::propertySpecForRead(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
1185 {
e78566595089 initial import
mandel
parents:
diff changeset
1186 for (int i=0; i<m_property_specs.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
1187 if (name == m_property_specs.at(i)->read())
e78566595089 initial import
mandel
parents:
diff changeset
1188 return m_property_specs.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
1189 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1190 }
e78566595089 initial import
mandel
parents:
diff changeset
1191
e78566595089 initial import
mandel
parents:
diff changeset
1192 QPropertySpec *AbstractMetaClass::propertySpecForWrite(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
1193 {
e78566595089 initial import
mandel
parents:
diff changeset
1194 for (int i=0; i<m_property_specs.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
1195 if (name == m_property_specs.at(i)->write())
e78566595089 initial import
mandel
parents:
diff changeset
1196 return m_property_specs.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
1197 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1198 }
e78566595089 initial import
mandel
parents:
diff changeset
1199
e78566595089 initial import
mandel
parents:
diff changeset
1200 QPropertySpec *AbstractMetaClass::propertySpecForReset(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
1201 {
e78566595089 initial import
mandel
parents:
diff changeset
1202 for (int i=0; i<m_property_specs.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
1203 if (name == m_property_specs.at(i)->reset())
e78566595089 initial import
mandel
parents:
diff changeset
1204 return m_property_specs.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
1205 }
e78566595089 initial import
mandel
parents:
diff changeset
1206 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1207 }
e78566595089 initial import
mandel
parents:
diff changeset
1208
293
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1209 AbstractMetaFunction* AbstractMetaClass::copyConstructor() const
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1210 {
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1211 AbstractMetaFunctionList ctors = queryFunctions(Constructors);
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1212 for(int i = 0; i < ctors.size(); i++)
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1213 {
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1214 AbstractMetaFunction *ctor = ctors.at(i);
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1215 if (ctor->arguments().size() > 0)
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1216 if(ctor->arguments().at(0)->type()->typeEntry() == typeEntry())
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1217 return ctor;
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1218 }
1
e78566595089 initial import
mandel
parents:
diff changeset
1219
293
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1220 return NULL;
8627891e4556 QList updates
eldar
parents: 288
diff changeset
1221 }
1
e78566595089 initial import
mandel
parents:
diff changeset
1222
e78566595089 initial import
mandel
parents:
diff changeset
1223 static bool functions_contains(const AbstractMetaFunctionList &l, const AbstractMetaFunction *func)
e78566595089 initial import
mandel
parents:
diff changeset
1224 {
e78566595089 initial import
mandel
parents:
diff changeset
1225 foreach (const AbstractMetaFunction *f, l) {
e78566595089 initial import
mandel
parents:
diff changeset
1226 if ((f->compareTo(func) & AbstractMetaFunction::PrettySimilar) == AbstractMetaFunction::PrettySimilar)
e78566595089 initial import
mandel
parents:
diff changeset
1227 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1228 }
e78566595089 initial import
mandel
parents:
diff changeset
1229 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1230 }
e78566595089 initial import
mandel
parents:
diff changeset
1231
e78566595089 initial import
mandel
parents:
diff changeset
1232 AbstractMetaField::AbstractMetaField() : m_getter(0), m_setter(0), m_class(0)
e78566595089 initial import
mandel
parents:
diff changeset
1233 {
e78566595089 initial import
mandel
parents:
diff changeset
1234 }
e78566595089 initial import
mandel
parents:
diff changeset
1235
e78566595089 initial import
mandel
parents:
diff changeset
1236 AbstractMetaField::~AbstractMetaField()
e78566595089 initial import
mandel
parents:
diff changeset
1237 {
e78566595089 initial import
mandel
parents:
diff changeset
1238 delete m_setter;
e78566595089 initial import
mandel
parents:
diff changeset
1239 delete m_getter;
e78566595089 initial import
mandel
parents:
diff changeset
1240 }
e78566595089 initial import
mandel
parents:
diff changeset
1241 ushort painters; // refcount
e78566595089 initial import
mandel
parents:
diff changeset
1242 AbstractMetaField *AbstractMetaField::copy() const
e78566595089 initial import
mandel
parents:
diff changeset
1243 {
e78566595089 initial import
mandel
parents:
diff changeset
1244 AbstractMetaField *returned = new AbstractMetaField;
e78566595089 initial import
mandel
parents:
diff changeset
1245 returned->setEnclosingClass(0);
e78566595089 initial import
mandel
parents:
diff changeset
1246 returned->setAttributes(attributes());
e78566595089 initial import
mandel
parents:
diff changeset
1247 returned->setName(name());
e78566595089 initial import
mandel
parents:
diff changeset
1248 returned->setType(type()->copy());
e78566595089 initial import
mandel
parents:
diff changeset
1249 returned->setOriginalAttributes(originalAttributes());
e78566595089 initial import
mandel
parents:
diff changeset
1250
e78566595089 initial import
mandel
parents:
diff changeset
1251 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
1252 }
e78566595089 initial import
mandel
parents:
diff changeset
1253
e78566595089 initial import
mandel
parents:
diff changeset
1254 static QString upCaseFirst(const QString &str) {
e78566595089 initial import
mandel
parents:
diff changeset
1255 Q_ASSERT(!str.isEmpty());
e78566595089 initial import
mandel
parents:
diff changeset
1256 QString s = str;
e78566595089 initial import
mandel
parents:
diff changeset
1257 s[0] = s.at(0).toUpper();
e78566595089 initial import
mandel
parents:
diff changeset
1258 return s;
e78566595089 initial import
mandel
parents:
diff changeset
1259 }
e78566595089 initial import
mandel
parents:
diff changeset
1260
e78566595089 initial import
mandel
parents:
diff changeset
1261 static AbstractMetaFunction *createXetter(const AbstractMetaField *g, const QString &name, uint type) {
e78566595089 initial import
mandel
parents:
diff changeset
1262 AbstractMetaFunction *f = new AbstractMetaFunction;
e78566595089 initial import
mandel
parents:
diff changeset
1263
e78566595089 initial import
mandel
parents:
diff changeset
1264
e78566595089 initial import
mandel
parents:
diff changeset
1265
e78566595089 initial import
mandel
parents:
diff changeset
1266 f->setName(name);
e78566595089 initial import
mandel
parents:
diff changeset
1267 f->setOriginalName(name);
e78566595089 initial import
mandel
parents:
diff changeset
1268 f->setOwnerClass(g->enclosingClass());
e78566595089 initial import
mandel
parents:
diff changeset
1269 f->setImplementingClass(g->enclosingClass());
e78566595089 initial import
mandel
parents:
diff changeset
1270 f->setDeclaringClass(g->enclosingClass());
e78566595089 initial import
mandel
parents:
diff changeset
1271
e78566595089 initial import
mandel
parents:
diff changeset
1272 uint attr = AbstractMetaAttributes::Native
e78566595089 initial import
mandel
parents:
diff changeset
1273 | AbstractMetaAttributes::Final
e78566595089 initial import
mandel
parents:
diff changeset
1274 | type;
e78566595089 initial import
mandel
parents:
diff changeset
1275 if (g->isStatic())
e78566595089 initial import
mandel
parents:
diff changeset
1276 attr |= AbstractMetaAttributes::Static;
e78566595089 initial import
mandel
parents:
diff changeset
1277 if (g->isPublic())
e78566595089 initial import
mandel
parents:
diff changeset
1278 attr |= AbstractMetaAttributes::Public;
e78566595089 initial import
mandel
parents:
diff changeset
1279 else if (g->isProtected())
e78566595089 initial import
mandel
parents:
diff changeset
1280 attr |= AbstractMetaAttributes::Protected;
e78566595089 initial import
mandel
parents:
diff changeset
1281 else
e78566595089 initial import
mandel
parents:
diff changeset
1282 attr |= AbstractMetaAttributes::Private;
e78566595089 initial import
mandel
parents:
diff changeset
1283 f->setAttributes(attr);
e78566595089 initial import
mandel
parents:
diff changeset
1284 f->setOriginalAttributes(attr);
e78566595089 initial import
mandel
parents:
diff changeset
1285
e78566595089 initial import
mandel
parents:
diff changeset
1286 FieldModificationList mods = g->modifications();
e78566595089 initial import
mandel
parents:
diff changeset
1287 foreach (FieldModification mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
1288 if (mod.isRenameModifier())
e78566595089 initial import
mandel
parents:
diff changeset
1289 f->setName(mod.renamedTo());
e78566595089 initial import
mandel
parents:
diff changeset
1290 if (mod.isAccessModifier()) {
e78566595089 initial import
mandel
parents:
diff changeset
1291 if (mod.isPrivate())
e78566595089 initial import
mandel
parents:
diff changeset
1292 f->setVisibility(AbstractMetaAttributes::Private);
e78566595089 initial import
mandel
parents:
diff changeset
1293 else if (mod.isProtected())
e78566595089 initial import
mandel
parents:
diff changeset
1294 f->setVisibility(AbstractMetaAttributes::Protected);
e78566595089 initial import
mandel
parents:
diff changeset
1295 else if (mod.isPublic())
e78566595089 initial import
mandel
parents:
diff changeset
1296 f->setVisibility(AbstractMetaAttributes::Public);
e78566595089 initial import
mandel
parents:
diff changeset
1297 else if (mod.isFriendly())
e78566595089 initial import
mandel
parents:
diff changeset
1298 f->setVisibility(AbstractMetaAttributes::Friendly);
e78566595089 initial import
mandel
parents:
diff changeset
1299 }
e78566595089 initial import
mandel
parents:
diff changeset
1300
e78566595089 initial import
mandel
parents:
diff changeset
1301 }
e78566595089 initial import
mandel
parents:
diff changeset
1302 return f;
e78566595089 initial import
mandel
parents:
diff changeset
1303 }
e78566595089 initial import
mandel
parents:
diff changeset
1304
e78566595089 initial import
mandel
parents:
diff changeset
1305 FieldModificationList AbstractMetaField::modifications() const
e78566595089 initial import
mandel
parents:
diff changeset
1306 {
e78566595089 initial import
mandel
parents:
diff changeset
1307 FieldModificationList mods = enclosingClass()->typeEntry()->fieldModifications();
e78566595089 initial import
mandel
parents:
diff changeset
1308 FieldModificationList returned;
e78566595089 initial import
mandel
parents:
diff changeset
1309
e78566595089 initial import
mandel
parents:
diff changeset
1310 foreach (FieldModification mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
1311 if (mod.name == name())
e78566595089 initial import
mandel
parents:
diff changeset
1312 returned += mod;
e78566595089 initial import
mandel
parents:
diff changeset
1313 }
e78566595089 initial import
mandel
parents:
diff changeset
1314
e78566595089 initial import
mandel
parents:
diff changeset
1315 return returned;
e78566595089 initial import
mandel
parents:
diff changeset
1316 }
e78566595089 initial import
mandel
parents:
diff changeset
1317
e78566595089 initial import
mandel
parents:
diff changeset
1318 const AbstractMetaFunction *AbstractMetaField::setter() const
e78566595089 initial import
mandel
parents:
diff changeset
1319 {
e78566595089 initial import
mandel
parents:
diff changeset
1320 if (m_setter == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1321 m_setter = createXetter(this,
e78566595089 initial import
mandel
parents:
diff changeset
1322 "set" + upCaseFirst(name()),
e78566595089 initial import
mandel
parents:
diff changeset
1323 AbstractMetaAttributes::SetterFunction);
e78566595089 initial import
mandel
parents:
diff changeset
1324 AbstractMetaArgumentList arguments;
e78566595089 initial import
mandel
parents:
diff changeset
1325 AbstractMetaArgument *argument = new AbstractMetaArgument;
e78566595089 initial import
mandel
parents:
diff changeset
1326 argument->setType(type()->copy());
e78566595089 initial import
mandel
parents:
diff changeset
1327 argument->setName(name());
e78566595089 initial import
mandel
parents:
diff changeset
1328 arguments.append(argument);
e78566595089 initial import
mandel
parents:
diff changeset
1329 m_setter->setArguments(arguments);
e78566595089 initial import
mandel
parents:
diff changeset
1330 }
e78566595089 initial import
mandel
parents:
diff changeset
1331 return m_setter;
e78566595089 initial import
mandel
parents:
diff changeset
1332 }
e78566595089 initial import
mandel
parents:
diff changeset
1333
e78566595089 initial import
mandel
parents:
diff changeset
1334 const AbstractMetaFunction *AbstractMetaField::getter() const
e78566595089 initial import
mandel
parents:
diff changeset
1335 {
e78566595089 initial import
mandel
parents:
diff changeset
1336 if (m_getter == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1337 m_getter = createXetter(this,
e78566595089 initial import
mandel
parents:
diff changeset
1338 name(),
e78566595089 initial import
mandel
parents:
diff changeset
1339 AbstractMetaAttributes::GetterFunction);
e78566595089 initial import
mandel
parents:
diff changeset
1340 m_getter->setType(type());
e78566595089 initial import
mandel
parents:
diff changeset
1341 }
e78566595089 initial import
mandel
parents:
diff changeset
1342
e78566595089 initial import
mandel
parents:
diff changeset
1343 return m_getter;
e78566595089 initial import
mandel
parents:
diff changeset
1344 }
e78566595089 initial import
mandel
parents:
diff changeset
1345
e78566595089 initial import
mandel
parents:
diff changeset
1346
e78566595089 initial import
mandel
parents:
diff changeset
1347 bool AbstractMetaClass::hasConstructors() const
e78566595089 initial import
mandel
parents:
diff changeset
1348 {
e78566595089 initial import
mandel
parents:
diff changeset
1349 return queryFunctions(Constructors).size() != 0;
e78566595089 initial import
mandel
parents:
diff changeset
1350 }
e78566595089 initial import
mandel
parents:
diff changeset
1351
e78566595089 initial import
mandel
parents:
diff changeset
1352 void AbstractMetaClass::addDefaultConstructor()
e78566595089 initial import
mandel
parents:
diff changeset
1353 {
e78566595089 initial import
mandel
parents:
diff changeset
1354 AbstractMetaFunction *f = new AbstractMetaFunction;
e78566595089 initial import
mandel
parents:
diff changeset
1355 f->setName(name());
e78566595089 initial import
mandel
parents:
diff changeset
1356 f->setOwnerClass(this);
e78566595089 initial import
mandel
parents:
diff changeset
1357 f->setFunctionType(AbstractMetaFunction::ConstructorFunction);
e78566595089 initial import
mandel
parents:
diff changeset
1358 f->setArguments(AbstractMetaArgumentList());
e78566595089 initial import
mandel
parents:
diff changeset
1359 f->setDeclaringClass(this);
e78566595089 initial import
mandel
parents:
diff changeset
1360
e78566595089 initial import
mandel
parents:
diff changeset
1361 uint attr = AbstractMetaAttributes::Native;
e78566595089 initial import
mandel
parents:
diff changeset
1362 attr |= AbstractMetaAttributes::Public;
e78566595089 initial import
mandel
parents:
diff changeset
1363 attr |= AbstractMetaAttributes::Final; // qtd otherwise added constructor is virtual which in fact it is not
e78566595089 initial import
mandel
parents:
diff changeset
1364 f->setAttributes(attr);
e78566595089 initial import
mandel
parents:
diff changeset
1365 f->setImplementingClass(this);
e78566595089 initial import
mandel
parents:
diff changeset
1366 f->setOriginalAttributes(f->attributes());
e78566595089 initial import
mandel
parents:
diff changeset
1367
e78566595089 initial import
mandel
parents:
diff changeset
1368 addFunction(f);
e78566595089 initial import
mandel
parents:
diff changeset
1369 }
e78566595089 initial import
mandel
parents:
diff changeset
1370
e78566595089 initial import
mandel
parents:
diff changeset
1371 bool AbstractMetaClass::hasFunction(const AbstractMetaFunction *f) const
e78566595089 initial import
mandel
parents:
diff changeset
1372 {
e78566595089 initial import
mandel
parents:
diff changeset
1373 return functions_contains(m_functions, f);
e78566595089 initial import
mandel
parents:
diff changeset
1374 }
e78566595089 initial import
mandel
parents:
diff changeset
1375
e78566595089 initial import
mandel
parents:
diff changeset
1376 /* Goes through the list of functions and returns a list of all
e78566595089 initial import
mandel
parents:
diff changeset
1377 functions matching all of the criteria in \a query.
e78566595089 initial import
mandel
parents:
diff changeset
1378 */
e78566595089 initial import
mandel
parents:
diff changeset
1379
e78566595089 initial import
mandel
parents:
diff changeset
1380 AbstractMetaFunctionList AbstractMetaClass::queryFunctions(uint query) const
e78566595089 initial import
mandel
parents:
diff changeset
1381 {
e78566595089 initial import
mandel
parents:
diff changeset
1382 AbstractMetaFunctionList functions;
e78566595089 initial import
mandel
parents:
diff changeset
1383
e78566595089 initial import
mandel
parents:
diff changeset
1384 foreach (AbstractMetaFunction *f, m_functions) {
e78566595089 initial import
mandel
parents:
diff changeset
1385
e78566595089 initial import
mandel
parents:
diff changeset
1386 if ((query & VirtualSlots) && !f->isVirtualSlot())
e78566595089 initial import
mandel
parents:
diff changeset
1387 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1388
e78566595089 initial import
mandel
parents:
diff changeset
1389 if ((query & NotRemovedFromTargetLang) && f->isRemovedFrom(f->implementingClass(), TypeSystem::TargetLangCode)) {
e78566595089 initial import
mandel
parents:
diff changeset
1390 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1391 }
e78566595089 initial import
mandel
parents:
diff changeset
1392
e78566595089 initial import
mandel
parents:
diff changeset
1393 if ((query & NotRemovedFromTargetLang) && !f->isFinal() && f->isRemovedFrom(f->declaringClass(), TypeSystem::TargetLangCode)) {
e78566595089 initial import
mandel
parents:
diff changeset
1394 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1395 }
e78566595089 initial import
mandel
parents:
diff changeset
1396
e78566595089 initial import
mandel
parents:
diff changeset
1397 if ((query & NotRemovedFromShell) && f->isRemovedFrom(f->implementingClass(), TypeSystem::ShellCode)) {
e78566595089 initial import
mandel
parents:
diff changeset
1398 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1399 }
e78566595089 initial import
mandel
parents:
diff changeset
1400
e78566595089 initial import
mandel
parents:
diff changeset
1401 if ((query & NotRemovedFromShell) && !f->isFinal() && f->isRemovedFrom(f->declaringClass(), TypeSystem::ShellCode)) {
e78566595089 initial import
mandel
parents:
diff changeset
1402 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1403 }
e78566595089 initial import
mandel
parents:
diff changeset
1404
e78566595089 initial import
mandel
parents:
diff changeset
1405 if ((query & Visible) && f->isPrivate()) {
e78566595089 initial import
mandel
parents:
diff changeset
1406 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1407 }
e78566595089 initial import
mandel
parents:
diff changeset
1408
e78566595089 initial import
mandel
parents:
diff changeset
1409 if ((query & VirtualInTargetLangFunctions) && f->isFinalInTargetLang()) {
e78566595089 initial import
mandel
parents:
diff changeset
1410 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1411 }
e78566595089 initial import
mandel
parents:
diff changeset
1412
e78566595089 initial import
mandel
parents:
diff changeset
1413 if ((query & Invisible) && !f->isPrivate()) {
e78566595089 initial import
mandel
parents:
diff changeset
1414 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1415 }
e78566595089 initial import
mandel
parents:
diff changeset
1416
e78566595089 initial import
mandel
parents:
diff changeset
1417 if ((query & Empty) && !f->isEmptyFunction()) {
e78566595089 initial import
mandel
parents:
diff changeset
1418 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1419 }
e78566595089 initial import
mandel
parents:
diff changeset
1420
e78566595089 initial import
mandel
parents:
diff changeset
1421 if ((query & WasPublic) && !f->wasPublic()) {
e78566595089 initial import
mandel
parents:
diff changeset
1422 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1423 }
e78566595089 initial import
mandel
parents:
diff changeset
1424
e78566595089 initial import
mandel
parents:
diff changeset
1425 if ((query & WasVisible) && f->wasPrivate()) {
e78566595089 initial import
mandel
parents:
diff changeset
1426 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1427 }
e78566595089 initial import
mandel
parents:
diff changeset
1428
e78566595089 initial import
mandel
parents:
diff changeset
1429 if ((query & WasProtected) && !f->wasProtected()) {
e78566595089 initial import
mandel
parents:
diff changeset
1430 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1431 }
e78566595089 initial import
mandel
parents:
diff changeset
1432
e78566595089 initial import
mandel
parents:
diff changeset
1433 if ((query & ClassImplements) && f->ownerClass() != f->implementingClass()) {
e78566595089 initial import
mandel
parents:
diff changeset
1434 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1435 }
e78566595089 initial import
mandel
parents:
diff changeset
1436
e78566595089 initial import
mandel
parents:
diff changeset
1437 if ((query & Inconsistent) && (f->isFinalInTargetLang() || !f->isFinalInCpp() || f->isStatic())) {
e78566595089 initial import
mandel
parents:
diff changeset
1438 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1439 }
e78566595089 initial import
mandel
parents:
diff changeset
1440
e78566595089 initial import
mandel
parents:
diff changeset
1441 if ((query & FinalInTargetLangFunctions) && !f->isFinalInTargetLang()) {
e78566595089 initial import
mandel
parents:
diff changeset
1442 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1443 }
e78566595089 initial import
mandel
parents:
diff changeset
1444
e78566595089 initial import
mandel
parents:
diff changeset
1445 if ((query & FinalInCppFunctions) && !f->isFinalInCpp()) {
e78566595089 initial import
mandel
parents:
diff changeset
1446 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1447 }
e78566595089 initial import
mandel
parents:
diff changeset
1448
e78566595089 initial import
mandel
parents:
diff changeset
1449 if ((query & VirtualInCppFunctions) && f->isFinalInCpp()) {
e78566595089 initial import
mandel
parents:
diff changeset
1450 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1451 }
e78566595089 initial import
mandel
parents:
diff changeset
1452
e78566595089 initial import
mandel
parents:
diff changeset
1453 if ((query & Signals) && (!f->isSignal())) {
e78566595089 initial import
mandel
parents:
diff changeset
1454 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1455 }
e78566595089 initial import
mandel
parents:
diff changeset
1456
e78566595089 initial import
mandel
parents:
diff changeset
1457 if ((query & ForcedShellFunctions)
e78566595089 initial import
mandel
parents:
diff changeset
1458 && (!f->isForcedShellImplementation()
e78566595089 initial import
mandel
parents:
diff changeset
1459 || !f->isFinal())) {
e78566595089 initial import
mandel
parents:
diff changeset
1460 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1461 }
e78566595089 initial import
mandel
parents:
diff changeset
1462
e78566595089 initial import
mandel
parents:
diff changeset
1463 if ((query & Constructors) && (!f->isConstructor()
e78566595089 initial import
mandel
parents:
diff changeset
1464 || f->ownerClass() != f->implementingClass())
e78566595089 initial import
mandel
parents:
diff changeset
1465 || f->isConstructor() && (query & Constructors) == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1466 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1467 }
e78566595089 initial import
mandel
parents:
diff changeset
1468
e78566595089 initial import
mandel
parents:
diff changeset
1469 // Destructors are never included in the functions of a class currently
e78566595089 initial import
mandel
parents:
diff changeset
1470 /*
e78566595089 initial import
mandel
parents:
diff changeset
1471 if ((query & Destructors) && (!f->isDestructor()
e78566595089 initial import
mandel
parents:
diff changeset
1472 || f->ownerClass() != f->implementingClass())
e78566595089 initial import
mandel
parents:
diff changeset
1473 || f->isDestructor() && (query & Destructors) == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1474 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1475 }*/
e78566595089 initial import
mandel
parents:
diff changeset
1476
e78566595089 initial import
mandel
parents:
diff changeset
1477 if ((query & VirtualFunctions) && (f->isFinal() || f->isSignal() || f->isStatic())) {
e78566595089 initial import
mandel
parents:
diff changeset
1478 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1479 }
e78566595089 initial import
mandel
parents:
diff changeset
1480
e78566595089 initial import
mandel
parents:
diff changeset
1481 if ((query & StaticFunctions) && (!f->isStatic() || f->isSignal())) {
e78566595089 initial import
mandel
parents:
diff changeset
1482 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1483 }
e78566595089 initial import
mandel
parents:
diff changeset
1484
e78566595089 initial import
mandel
parents:
diff changeset
1485 if ((query & NonStaticFunctions) && (f->isStatic())) {
e78566595089 initial import
mandel
parents:
diff changeset
1486 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1487 }
e78566595089 initial import
mandel
parents:
diff changeset
1488
e78566595089 initial import
mandel
parents:
diff changeset
1489 if ((query & NonEmptyFunctions) && (f->isEmptyFunction())) {
e78566595089 initial import
mandel
parents:
diff changeset
1490 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1491 }
e78566595089 initial import
mandel
parents:
diff changeset
1492
e78566595089 initial import
mandel
parents:
diff changeset
1493 if ((query & NormalFunctions) && (f->isSignal())) {
e78566595089 initial import
mandel
parents:
diff changeset
1494 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1495 }
e78566595089 initial import
mandel
parents:
diff changeset
1496
e78566595089 initial import
mandel
parents:
diff changeset
1497 if ((query & AbstractFunctions) && !f->isAbstract()) {
e78566595089 initial import
mandel
parents:
diff changeset
1498 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1499 }
e78566595089 initial import
mandel
parents:
diff changeset
1500
e78566595089 initial import
mandel
parents:
diff changeset
1501 functions << f;
e78566595089 initial import
mandel
parents:
diff changeset
1502 }
e78566595089 initial import
mandel
parents:
diff changeset
1503
e78566595089 initial import
mandel
parents:
diff changeset
1504 // qDebug() << "queried" << m_type_entry->qualifiedCppName() << "got" << functions.size() << "out of" << m_functions.size();
e78566595089 initial import
mandel
parents:
diff changeset
1505
e78566595089 initial import
mandel
parents:
diff changeset
1506 return functions;
e78566595089 initial import
mandel
parents:
diff changeset
1507 }
e78566595089 initial import
mandel
parents:
diff changeset
1508
e78566595089 initial import
mandel
parents:
diff changeset
1509
e78566595089 initial import
mandel
parents:
diff changeset
1510 bool AbstractMetaClass::hasInconsistentFunctions() const
e78566595089 initial import
mandel
parents:
diff changeset
1511 {
e78566595089 initial import
mandel
parents:
diff changeset
1512 return cppInconsistentFunctions().size() > 0;
e78566595089 initial import
mandel
parents:
diff changeset
1513 }
e78566595089 initial import
mandel
parents:
diff changeset
1514
e78566595089 initial import
mandel
parents:
diff changeset
1515 bool AbstractMetaClass::hasSignals() const
e78566595089 initial import
mandel
parents:
diff changeset
1516 {
e78566595089 initial import
mandel
parents:
diff changeset
1517 return cppSignalFunctions().size() > 0;
e78566595089 initial import
mandel
parents:
diff changeset
1518 }
e78566595089 initial import
mandel
parents:
diff changeset
1519
e78566595089 initial import
mandel
parents:
diff changeset
1520
e78566595089 initial import
mandel
parents:
diff changeset
1521 /**
e78566595089 initial import
mandel
parents:
diff changeset
1522 * Adds the specified interface to this class by adding all the
e78566595089 initial import
mandel
parents:
diff changeset
1523 * functions in the interface to this class.
e78566595089 initial import
mandel
parents:
diff changeset
1524 */
e78566595089 initial import
mandel
parents:
diff changeset
1525 void AbstractMetaClass::addInterface(AbstractMetaClass *interface)
e78566595089 initial import
mandel
parents:
diff changeset
1526 {
e78566595089 initial import
mandel
parents:
diff changeset
1527 Q_ASSERT(!m_interfaces.contains(interface));
e78566595089 initial import
mandel
parents:
diff changeset
1528 m_interfaces << interface;
e78566595089 initial import
mandel
parents:
diff changeset
1529
e78566595089 initial import
mandel
parents:
diff changeset
1530 if (m_extracted_interface != 0 && m_extracted_interface != interface)
e78566595089 initial import
mandel
parents:
diff changeset
1531 m_extracted_interface->addInterface(interface);
e78566595089 initial import
mandel
parents:
diff changeset
1532
e78566595089 initial import
mandel
parents:
diff changeset
1533 foreach (AbstractMetaFunction *function, interface->functions())
e78566595089 initial import
mandel
parents:
diff changeset
1534 if (!hasFunction(function) && !function->isConstructor()) {
e78566595089 initial import
mandel
parents:
diff changeset
1535 AbstractMetaFunction *cpy = function->copy();
e78566595089 initial import
mandel
parents:
diff changeset
1536 cpy->setImplementingClass(this);
e78566595089 initial import
mandel
parents:
diff changeset
1537
e78566595089 initial import
mandel
parents:
diff changeset
1538 // Setup that this function is an interface class.
e78566595089 initial import
mandel
parents:
diff changeset
1539 cpy->setInterfaceClass(interface);
e78566595089 initial import
mandel
parents:
diff changeset
1540 *cpy += AbstractMetaAttributes::InterfaceFunction;
e78566595089 initial import
mandel
parents:
diff changeset
1541
e78566595089 initial import
mandel
parents:
diff changeset
1542 // Copy the modifications in interface into the implementing classes.
e78566595089 initial import
mandel
parents:
diff changeset
1543 FunctionModificationList mods = function->modifications(interface);
e78566595089 initial import
mandel
parents:
diff changeset
1544 foreach (const FunctionModification &mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
1545 m_type_entry->addFunctionModification(mod);
e78566595089 initial import
mandel
parents:
diff changeset
1546 }
e78566595089 initial import
mandel
parents:
diff changeset
1547
e78566595089 initial import
mandel
parents:
diff changeset
1548 // It should be mostly safe to assume that when we implement an interface
e78566595089 initial import
mandel
parents:
diff changeset
1549 // we don't "pass on" pure virtual functions to our sublcasses...
e78566595089 initial import
mandel
parents:
diff changeset
1550 // *cpy -= AbstractMetaAttributes::Abstract;
e78566595089 initial import
mandel
parents:
diff changeset
1551
e78566595089 initial import
mandel
parents:
diff changeset
1552 addFunction(cpy);
e78566595089 initial import
mandel
parents:
diff changeset
1553 }
e78566595089 initial import
mandel
parents:
diff changeset
1554 }
e78566595089 initial import
mandel
parents:
diff changeset
1555
e78566595089 initial import
mandel
parents:
diff changeset
1556
e78566595089 initial import
mandel
parents:
diff changeset
1557 void AbstractMetaClass::setInterfaces(const AbstractMetaClassList &interfaces)
e78566595089 initial import
mandel
parents:
diff changeset
1558 {
e78566595089 initial import
mandel
parents:
diff changeset
1559 m_interfaces = interfaces;
e78566595089 initial import
mandel
parents:
diff changeset
1560 }
e78566595089 initial import
mandel
parents:
diff changeset
1561
e78566595089 initial import
mandel
parents:
diff changeset
1562
e78566595089 initial import
mandel
parents:
diff changeset
1563 AbstractMetaEnum *AbstractMetaClass::findEnum(const QString &enumName)
e78566595089 initial import
mandel
parents:
diff changeset
1564 {
e78566595089 initial import
mandel
parents:
diff changeset
1565 foreach (AbstractMetaEnum *e, m_enums) {
e78566595089 initial import
mandel
parents:
diff changeset
1566 if (e->name() == enumName)
e78566595089 initial import
mandel
parents:
diff changeset
1567 return e;
e78566595089 initial import
mandel
parents:
diff changeset
1568 }
e78566595089 initial import
mandel
parents:
diff changeset
1569
e78566595089 initial import
mandel
parents:
diff changeset
1570 if (typeEntry()->designatedInterface())
e78566595089 initial import
mandel
parents:
diff changeset
1571 return extractInterface()->findEnum(enumName);
e78566595089 initial import
mandel
parents:
diff changeset
1572
e78566595089 initial import
mandel
parents:
diff changeset
1573 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1574 }
e78566595089 initial import
mandel
parents:
diff changeset
1575
e78566595089 initial import
mandel
parents:
diff changeset
1576
e78566595089 initial import
mandel
parents:
diff changeset
1577
e78566595089 initial import
mandel
parents:
diff changeset
1578
e78566595089 initial import
mandel
parents:
diff changeset
1579 /*! Recursivly searches for the enum value named \a enumValueName in
e78566595089 initial import
mandel
parents:
diff changeset
1580 this class and its superclasses and interfaces. Values belonging to
e78566595089 initial import
mandel
parents:
diff changeset
1581 \a meta_enum are excluded from the search.
e78566595089 initial import
mandel
parents:
diff changeset
1582 */
e78566595089 initial import
mandel
parents:
diff changeset
1583 AbstractMetaEnumValue *AbstractMetaClass::findEnumValue(const QString &enumValueName, AbstractMetaEnum *meta_enum)
e78566595089 initial import
mandel
parents:
diff changeset
1584 {
e78566595089 initial import
mandel
parents:
diff changeset
1585 foreach (AbstractMetaEnum *e, m_enums) {
e78566595089 initial import
mandel
parents:
diff changeset
1586 if (e == meta_enum)
e78566595089 initial import
mandel
parents:
diff changeset
1587 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1588 foreach (AbstractMetaEnumValue *v, e->values()) {
e78566595089 initial import
mandel
parents:
diff changeset
1589 if (v->name() == enumValueName)
e78566595089 initial import
mandel
parents:
diff changeset
1590 return v;
e78566595089 initial import
mandel
parents:
diff changeset
1591 }
e78566595089 initial import
mandel
parents:
diff changeset
1592 }
e78566595089 initial import
mandel
parents:
diff changeset
1593
e78566595089 initial import
mandel
parents:
diff changeset
1594 if (typeEntry()->designatedInterface())
e78566595089 initial import
mandel
parents:
diff changeset
1595 return extractInterface()->findEnumValue(enumValueName, meta_enum);
e78566595089 initial import
mandel
parents:
diff changeset
1596
e78566595089 initial import
mandel
parents:
diff changeset
1597 if (baseClass() != 0)
e78566595089 initial import
mandel
parents:
diff changeset
1598 return baseClass()->findEnumValue(enumValueName, meta_enum);
e78566595089 initial import
mandel
parents:
diff changeset
1599
e78566595089 initial import
mandel
parents:
diff changeset
1600 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1601 }
e78566595089 initial import
mandel
parents:
diff changeset
1602
e78566595089 initial import
mandel
parents:
diff changeset
1603
e78566595089 initial import
mandel
parents:
diff changeset
1604 /*!
e78566595089 initial import
mandel
parents:
diff changeset
1605 * Searches through all of this class' enums for a value matching the
e78566595089 initial import
mandel
parents:
diff changeset
1606 * name \a enumValueName. The name is excluding the class/namespace
e78566595089 initial import
mandel
parents:
diff changeset
1607 * prefix. The function recursivly searches interfaces and baseclasses
e78566595089 initial import
mandel
parents:
diff changeset
1608 * of this class.
e78566595089 initial import
mandel
parents:
diff changeset
1609 */
e78566595089 initial import
mandel
parents:
diff changeset
1610 AbstractMetaEnum *AbstractMetaClass::findEnumForValue(const QString &enumValueName)
e78566595089 initial import
mandel
parents:
diff changeset
1611 {
e78566595089 initial import
mandel
parents:
diff changeset
1612 foreach (AbstractMetaEnum *e, m_enums) {
e78566595089 initial import
mandel
parents:
diff changeset
1613 foreach (AbstractMetaEnumValue *v, e->values()) {
e78566595089 initial import
mandel
parents:
diff changeset
1614 if (v->name() == enumValueName)
e78566595089 initial import
mandel
parents:
diff changeset
1615 return e;
e78566595089 initial import
mandel
parents:
diff changeset
1616 }
e78566595089 initial import
mandel
parents:
diff changeset
1617 }
e78566595089 initial import
mandel
parents:
diff changeset
1618
e78566595089 initial import
mandel
parents:
diff changeset
1619 if (typeEntry()->designatedInterface())
e78566595089 initial import
mandel
parents:
diff changeset
1620 return extractInterface()->findEnumForValue(enumValueName);
e78566595089 initial import
mandel
parents:
diff changeset
1621
e78566595089 initial import
mandel
parents:
diff changeset
1622 if (baseClass() != 0)
e78566595089 initial import
mandel
parents:
diff changeset
1623 return baseClass()->findEnumForValue(enumValueName);
e78566595089 initial import
mandel
parents:
diff changeset
1624
e78566595089 initial import
mandel
parents:
diff changeset
1625 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1626 }
e78566595089 initial import
mandel
parents:
diff changeset
1627
e78566595089 initial import
mandel
parents:
diff changeset
1628
e78566595089 initial import
mandel
parents:
diff changeset
1629 static void add_extra_include_for_type(AbstractMetaClass *meta_class, const AbstractMetaType *type)
e78566595089 initial import
mandel
parents:
diff changeset
1630 {
e78566595089 initial import
mandel
parents:
diff changeset
1631
e78566595089 initial import
mandel
parents:
diff changeset
1632 if (type == 0)
e78566595089 initial import
mandel
parents:
diff changeset
1633 return;
e78566595089 initial import
mandel
parents:
diff changeset
1634
e78566595089 initial import
mandel
parents:
diff changeset
1635 Q_ASSERT(meta_class != 0);
e78566595089 initial import
mandel
parents:
diff changeset
1636 const TypeEntry *entry = (type ? type->typeEntry() : 0);
e78566595089 initial import
mandel
parents:
diff changeset
1637 if (entry != 0 && entry->isComplex()) {
e78566595089 initial import
mandel
parents:
diff changeset
1638 const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(entry);
e78566595089 initial import
mandel
parents:
diff changeset
1639 ComplexTypeEntry *class_entry = meta_class->typeEntry();
e78566595089 initial import
mandel
parents:
diff changeset
1640 if (class_entry != 0 && centry->include().isValid())
e78566595089 initial import
mandel
parents:
diff changeset
1641 class_entry->addExtraInclude(centry->include());
e78566595089 initial import
mandel
parents:
diff changeset
1642 }
e78566595089 initial import
mandel
parents:
diff changeset
1643
e78566595089 initial import
mandel
parents:
diff changeset
1644 if (type->hasInstantiations()) {
e78566595089 initial import
mandel
parents:
diff changeset
1645 QList<AbstractMetaType *> instantiations = type->instantiations();
e78566595089 initial import
mandel
parents:
diff changeset
1646 foreach (AbstractMetaType *instantiation, instantiations)
e78566595089 initial import
mandel
parents:
diff changeset
1647 add_extra_include_for_type(meta_class, instantiation);
e78566595089 initial import
mandel
parents:
diff changeset
1648 }
e78566595089 initial import
mandel
parents:
diff changeset
1649 }
e78566595089 initial import
mandel
parents:
diff changeset
1650
e78566595089 initial import
mandel
parents:
diff changeset
1651 static void add_extra_includes_for_function(AbstractMetaClass *meta_class, const AbstractMetaFunction *meta_function)
e78566595089 initial import
mandel
parents:
diff changeset
1652 {
e78566595089 initial import
mandel
parents:
diff changeset
1653 Q_ASSERT(meta_class != 0);
e78566595089 initial import
mandel
parents:
diff changeset
1654 Q_ASSERT(meta_function != 0);
e78566595089 initial import
mandel
parents:
diff changeset
1655 add_extra_include_for_type(meta_class, meta_function->type());
e78566595089 initial import
mandel
parents:
diff changeset
1656
e78566595089 initial import
mandel
parents:
diff changeset
1657 AbstractMetaArgumentList arguments = meta_function->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
1658 foreach (AbstractMetaArgument *argument, arguments)
e78566595089 initial import
mandel
parents:
diff changeset
1659 add_extra_include_for_type(meta_class, argument->type());
e78566595089 initial import
mandel
parents:
diff changeset
1660 }
e78566595089 initial import
mandel
parents:
diff changeset
1661
e78566595089 initial import
mandel
parents:
diff changeset
1662 void AbstractMetaClass::fixFunctions()
e78566595089 initial import
mandel
parents:
diff changeset
1663 {
e78566595089 initial import
mandel
parents:
diff changeset
1664 if (m_functions_fixed)
e78566595089 initial import
mandel
parents:
diff changeset
1665 return;
e78566595089 initial import
mandel
parents:
diff changeset
1666 else
e78566595089 initial import
mandel
parents:
diff changeset
1667 m_functions_fixed = true;
e78566595089 initial import
mandel
parents:
diff changeset
1668
e78566595089 initial import
mandel
parents:
diff changeset
1669 AbstractMetaClass *super_class = baseClass();
e78566595089 initial import
mandel
parents:
diff changeset
1670 AbstractMetaFunctionList funcs = functions();
e78566595089 initial import
mandel
parents:
diff changeset
1671
e78566595089 initial import
mandel
parents:
diff changeset
1672 // printf("fix functions for %s\n", qPrintable(name()));
e78566595089 initial import
mandel
parents:
diff changeset
1673
e78566595089 initial import
mandel
parents:
diff changeset
1674 if (super_class != 0)
e78566595089 initial import
mandel
parents:
diff changeset
1675 super_class->fixFunctions();
e78566595089 initial import
mandel
parents:
diff changeset
1676 int iface_idx = 0;
e78566595089 initial import
mandel
parents:
diff changeset
1677 while (super_class || iface_idx < interfaces().size()) {
e78566595089 initial import
mandel
parents:
diff changeset
1678 // printf(" - base: %s\n", qPrintable(super_class->name()));
e78566595089 initial import
mandel
parents:
diff changeset
1679
e78566595089 initial import
mandel
parents:
diff changeset
1680 // Since we always traverse the complete hierarchy we are only
e78566595089 initial import
mandel
parents:
diff changeset
1681 // interrested in what each super class implements, not what
e78566595089 initial import
mandel
parents:
diff changeset
1682 // we may have propagated from their base classes again.
e78566595089 initial import
mandel
parents:
diff changeset
1683 AbstractMetaFunctionList super_funcs;
e78566595089 initial import
mandel
parents:
diff changeset
1684 if (super_class) {
e78566595089 initial import
mandel
parents:
diff changeset
1685
e78566595089 initial import
mandel
parents:
diff changeset
1686 // Super classes can never be final
e78566595089 initial import
mandel
parents:
diff changeset
1687 if (super_class->isFinalInTargetLang()) {
e78566595089 initial import
mandel
parents:
diff changeset
1688 ReportHandler::warning("Final class '" + super_class->name() + "' set to non-final, as it is extended by other classes");
e78566595089 initial import
mandel
parents:
diff changeset
1689 *super_class -= AbstractMetaAttributes::FinalInTargetLang;
e78566595089 initial import
mandel
parents:
diff changeset
1690 }
e78566595089 initial import
mandel
parents:
diff changeset
1691 super_funcs = super_class->queryFunctions(AbstractMetaClass::ClassImplements);
e78566595089 initial import
mandel
parents:
diff changeset
1692 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1693 super_funcs = interfaces().at(iface_idx)->queryFunctions(AbstractMetaClass::NormalFunctions);
e78566595089 initial import
mandel
parents:
diff changeset
1694 }
e78566595089 initial import
mandel
parents:
diff changeset
1695
e78566595089 initial import
mandel
parents:
diff changeset
1696 QSet<AbstractMetaFunction *> funcs_to_add;
e78566595089 initial import
mandel
parents:
diff changeset
1697 for (int sfi=0; sfi<super_funcs.size(); ++sfi) {
e78566595089 initial import
mandel
parents:
diff changeset
1698 AbstractMetaFunction *sf = super_funcs.at(sfi);
e78566595089 initial import
mandel
parents:
diff changeset
1699
e78566595089 initial import
mandel
parents:
diff changeset
1700 if (sf->isRemovedFromAllLanguages(sf->implementingClass()))
e78566595089 initial import
mandel
parents:
diff changeset
1701 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1702
e78566595089 initial import
mandel
parents:
diff changeset
1703 // we generally don't care about private functions, but we have to get the ones that are
e78566595089 initial import
mandel
parents:
diff changeset
1704 // virtual in case they override abstract functions.
e78566595089 initial import
mandel
parents:
diff changeset
1705 bool add = (sf->isNormal() || sf->isSignal() || sf->isEmptyFunction());
e78566595089 initial import
mandel
parents:
diff changeset
1706 for (int fi=0; fi<funcs.size(); ++fi) {
e78566595089 initial import
mandel
parents:
diff changeset
1707 AbstractMetaFunction *f = funcs.at(fi);
e78566595089 initial import
mandel
parents:
diff changeset
1708 if (f->isRemovedFromAllLanguages(f->implementingClass()))
e78566595089 initial import
mandel
parents:
diff changeset
1709 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1710
e78566595089 initial import
mandel
parents:
diff changeset
1711 uint cmp = f->compareTo(sf);
e78566595089 initial import
mandel
parents:
diff changeset
1712
e78566595089 initial import
mandel
parents:
diff changeset
1713 if (cmp & AbstractMetaFunction::EqualModifiedName) {
e78566595089 initial import
mandel
parents:
diff changeset
1714 // printf(" - %s::%s similar to %s::%s %x vs %x\n",
e78566595089 initial import
mandel
parents:
diff changeset
1715 // qPrintable(sf->implementingClass()->typeEntry()->qualifiedCppName()),
e78566595089 initial import
mandel
parents:
diff changeset
1716 // qPrintable(sf->name()),
e78566595089 initial import
mandel
parents:
diff changeset
1717 // qPrintable(f->implementingClass()->typeEntry()->qualifiedCppName()),
e78566595089 initial import
mandel
parents:
diff changeset
1718 // qPrintable(f->name()),
e78566595089 initial import
mandel
parents:
diff changeset
1719 // sf->attributes(),
e78566595089 initial import
mandel
parents:
diff changeset
1720 // f->attributes());
e78566595089 initial import
mandel
parents:
diff changeset
1721
e78566595089 initial import
mandel
parents:
diff changeset
1722 add = false;
e78566595089 initial import
mandel
parents:
diff changeset
1723 if (cmp & AbstractMetaFunction::EqualArguments) {
e78566595089 initial import
mandel
parents:
diff changeset
1724
e78566595089 initial import
mandel
parents:
diff changeset
1725 // if (!(cmp & AbstractMetaFunction::EqualReturnType)) {
e78566595089 initial import
mandel
parents:
diff changeset
1726 // ReportHandler::warning(QString("%1::%2 and %3::%4 differ in retur type")
e78566595089 initial import
mandel
parents:
diff changeset
1727 // .arg(sf->implementingClass()->name())
e78566595089 initial import
mandel
parents:
diff changeset
1728 // .arg(sf->name())
e78566595089 initial import
mandel
parents:
diff changeset
1729 // .arg(f->implementingClass()->name())
e78566595089 initial import
mandel
parents:
diff changeset
1730 // .arg(f->name()));
e78566595089 initial import
mandel
parents:
diff changeset
1731 // }
e78566595089 initial import
mandel
parents:
diff changeset
1732
e78566595089 initial import
mandel
parents:
diff changeset
1733 // Same function, propegate virtual...
e78566595089 initial import
mandel
parents:
diff changeset
1734 if (!(cmp & AbstractMetaFunction::EqualAttributes)) {
e78566595089 initial import
mandel
parents:
diff changeset
1735 if (!f->isEmptyFunction()) {
e78566595089 initial import
mandel
parents:
diff changeset
1736 if (!sf->isFinalInCpp() && f->isFinalInCpp()) {
e78566595089 initial import
mandel
parents:
diff changeset
1737 *f -= AbstractMetaAttributes::FinalInCpp;
e78566595089 initial import
mandel
parents:
diff changeset
1738 // printf(" --- inherit virtual\n");
e78566595089 initial import
mandel
parents:
diff changeset
1739 }
e78566595089 initial import
mandel
parents:
diff changeset
1740 if (!sf->isFinalInTargetLang() && f->isFinalInTargetLang()) {
e78566595089 initial import
mandel
parents:
diff changeset
1741 *f -= AbstractMetaAttributes::FinalInTargetLang;
e78566595089 initial import
mandel
parents:
diff changeset
1742 // printf(" --- inherit virtual\n");
e78566595089 initial import
mandel
parents:
diff changeset
1743 }
e78566595089 initial import
mandel
parents:
diff changeset
1744 if (!f->isFinalInTargetLang() && f->isPrivate()) {
e78566595089 initial import
mandel
parents:
diff changeset
1745 f->setFunctionType(AbstractMetaFunction::EmptyFunction);
e78566595089 initial import
mandel
parents:
diff changeset
1746 f->setVisibility(AbstractMetaAttributes::Protected);
e78566595089 initial import
mandel
parents:
diff changeset
1747 *f += AbstractMetaAttributes::FinalInTargetLang;
e78566595089 initial import
mandel
parents:
diff changeset
1748 ReportHandler::warning(QString("private virtual function '%1' in '%2'")
e78566595089 initial import
mandel
parents:
diff changeset
1749 .arg(f->signature())
e78566595089 initial import
mandel
parents:
diff changeset
1750 .arg(f->implementingClass()->name()));
e78566595089 initial import
mandel
parents:
diff changeset
1751 }
e78566595089 initial import
mandel
parents:
diff changeset
1752 }
e78566595089 initial import
mandel
parents:
diff changeset
1753 }
e78566595089 initial import
mandel
parents:
diff changeset
1754
e78566595089 initial import
mandel
parents:
diff changeset
1755 if (f->visibility() != sf->visibility()) {
e78566595089 initial import
mandel
parents:
diff changeset
1756 QString warn = QString("visibility of function '%1' modified in class '%2'")
e78566595089 initial import
mandel
parents:
diff changeset
1757 .arg(f->name()).arg(name());
e78566595089 initial import
mandel
parents:
diff changeset
1758 ReportHandler::warning(warn);
e78566595089 initial import
mandel
parents:
diff changeset
1759
e78566595089 initial import
mandel
parents:
diff changeset
1760 // If new visibility is private, we can't
e78566595089 initial import
mandel
parents:
diff changeset
1761 // do anything. If it isn't, then we
e78566595089 initial import
mandel
parents:
diff changeset
1762 // prefer the parent class's visibility
e78566595089 initial import
mandel
parents:
diff changeset
1763 // setting for the function.
e78566595089 initial import
mandel
parents:
diff changeset
1764 if (!f->isPrivate() && !sf->isPrivate())
e78566595089 initial import
mandel
parents:
diff changeset
1765 f->setVisibility(sf->visibility());
e78566595089 initial import
mandel
parents:
diff changeset
1766
e78566595089 initial import
mandel
parents:
diff changeset
1767 // Private overrides of abstract functions have to go into the class or
e78566595089 initial import
mandel
parents:
diff changeset
1768 // the subclasses will not compile as non-abstract classes.
e78566595089 initial import
mandel
parents:
diff changeset
1769 // But they don't need to be implemented, since they can never be called.
e78566595089 initial import
mandel
parents:
diff changeset
1770 if (f->isPrivate() && sf->isAbstract()) {
e78566595089 initial import
mandel
parents:
diff changeset
1771 f->setFunctionType(AbstractMetaFunction::EmptyFunction);
e78566595089 initial import
mandel
parents:
diff changeset
1772 f->setVisibility(sf->visibility());
e78566595089 initial import
mandel
parents:
diff changeset
1773 *f += AbstractMetaAttributes::FinalInTargetLang;
e78566595089 initial import
mandel
parents:
diff changeset
1774 *f += AbstractMetaAttributes::FinalInCpp;
e78566595089 initial import
mandel
parents:
diff changeset
1775 }
e78566595089 initial import
mandel
parents:
diff changeset
1776 }
e78566595089 initial import
mandel
parents:
diff changeset
1777
e78566595089 initial import
mandel
parents:
diff changeset
1778 // Set the class which first declares this function, afawk
354
18bd68f586c6 removed superfluous destructors
Max Samukha <maxter@spambox.com>
parents: 327
diff changeset
1779 if (!f->isFinal() && sf->isFinal())
18bd68f586c6 removed superfluous destructors
Max Samukha <maxter@spambox.com>
parents: 327
diff changeset
1780 f->setDeclaringClass(f->ownerClass());
18bd68f586c6 removed superfluous destructors
Max Samukha <maxter@spambox.com>
parents: 327
diff changeset
1781 else
18bd68f586c6 removed superfluous destructors
Max Samukha <maxter@spambox.com>
parents: 327
diff changeset
1782 f->setDeclaringClass(sf->declaringClass());
1
e78566595089 initial import
mandel
parents:
diff changeset
1783
e78566595089 initial import
mandel
parents:
diff changeset
1784 if (sf->isFinalInTargetLang() && !sf->isPrivate() && !f->isPrivate() && !sf->isStatic() && !f->isStatic()) {
e78566595089 initial import
mandel
parents:
diff changeset
1785 // Shadowed funcion, need to make base class
e78566595089 initial import
mandel
parents:
diff changeset
1786 // function non-virtual
e78566595089 initial import
mandel
parents:
diff changeset
1787 if (f->implementingClass() != sf->implementingClass() && f->implementingClass()->inheritsFrom(sf->implementingClass())) {
e78566595089 initial import
mandel
parents:
diff changeset
1788
e78566595089 initial import
mandel
parents:
diff changeset
1789 // Check whether the superclass method has been redefined to non-final
e78566595089 initial import
mandel
parents:
diff changeset
1790
e78566595089 initial import
mandel
parents:
diff changeset
1791 bool hasNonFinalModifier = false;
e78566595089 initial import
mandel
parents:
diff changeset
1792 bool isBaseImplPrivate = false;
e78566595089 initial import
mandel
parents:
diff changeset
1793 FunctionModificationList mods = sf->modifications(sf->implementingClass());
e78566595089 initial import
mandel
parents:
diff changeset
1794 foreach (FunctionModification mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
1795 if (mod.isNonFinal()) {
e78566595089 initial import
mandel
parents:
diff changeset
1796 hasNonFinalModifier = true;
e78566595089 initial import
mandel
parents:
diff changeset
1797 break;
e78566595089 initial import
mandel
parents:
diff changeset
1798 } else if (mod.isPrivate()) {
e78566595089 initial import
mandel
parents:
diff changeset
1799 isBaseImplPrivate = true;
e78566595089 initial import
mandel
parents:
diff changeset
1800 break;
e78566595089 initial import
mandel
parents:
diff changeset
1801 }
e78566595089 initial import
mandel
parents:
diff changeset
1802 }
e78566595089 initial import
mandel
parents:
diff changeset
1803
e78566595089 initial import
mandel
parents:
diff changeset
1804 if (!hasNonFinalModifier && !isBaseImplPrivate) {
e78566595089 initial import
mandel
parents:
diff changeset
1805 ReportHandler::warning(QString::fromLatin1("Shadowing: %1::%2 and %3::%4; Java code will not compile")
e78566595089 initial import
mandel
parents:
diff changeset
1806 .arg(sf->implementingClass()->name())
e78566595089 initial import
mandel
parents:
diff changeset
1807 .arg(sf->signature())
e78566595089 initial import
mandel
parents:
diff changeset
1808 .arg(f->implementingClass()->name())
e78566595089 initial import
mandel
parents:
diff changeset
1809 .arg(f->signature()));
e78566595089 initial import
mandel
parents:
diff changeset
1810 }
e78566595089 initial import
mandel
parents:
diff changeset
1811 }
e78566595089 initial import
mandel
parents:
diff changeset
1812 }
e78566595089 initial import
mandel
parents:
diff changeset
1813
e78566595089 initial import
mandel
parents:
diff changeset
1814 }
e78566595089 initial import
mandel
parents:
diff changeset
1815
e78566595089 initial import
mandel
parents:
diff changeset
1816 if (cmp & AbstractMetaFunction::EqualDefaultValueOverload) {
e78566595089 initial import
mandel
parents:
diff changeset
1817 AbstractMetaArgumentList arguments;
e78566595089 initial import
mandel
parents:
diff changeset
1818 if (f->arguments().size() < sf->arguments().size())
e78566595089 initial import
mandel
parents:
diff changeset
1819 arguments = sf->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
1820 else
e78566595089 initial import
mandel
parents:
diff changeset
1821 arguments = f->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
1822 /* qtd
e78566595089 initial import
mandel
parents:
diff changeset
1823 for (int i=0; i<arguments.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
1824 arguments[i]->setDefaultValueExpression(QString());
e78566595089 initial import
mandel
parents:
diff changeset
1825 */ }
e78566595089 initial import
mandel
parents:
diff changeset
1826
e78566595089 initial import
mandel
parents:
diff changeset
1827
e78566595089 initial import
mandel
parents:
diff changeset
1828 // Otherwise we have function shadowing and we can
e78566595089 initial import
mandel
parents:
diff changeset
1829 // skip the thing...
e78566595089 initial import
mandel
parents:
diff changeset
1830 } else if (cmp & AbstractMetaFunction::EqualName && !sf->isSignal()) {
e78566595089 initial import
mandel
parents:
diff changeset
1831
e78566595089 initial import
mandel
parents:
diff changeset
1832 // In the case of function shadowing where the function name has been altered to
e78566595089 initial import
mandel
parents:
diff changeset
1833 // avoid conflict, we don't copy in the original.
e78566595089 initial import
mandel
parents:
diff changeset
1834 add = false;
e78566595089 initial import
mandel
parents:
diff changeset
1835 }
e78566595089 initial import
mandel
parents:
diff changeset
1836
e78566595089 initial import
mandel
parents:
diff changeset
1837 }
e78566595089 initial import
mandel
parents:
diff changeset
1838
e78566595089 initial import
mandel
parents:
diff changeset
1839 if (add)
e78566595089 initial import
mandel
parents:
diff changeset
1840 funcs_to_add << sf;
e78566595089 initial import
mandel
parents:
diff changeset
1841 }
e78566595089 initial import
mandel
parents:
diff changeset
1842
e78566595089 initial import
mandel
parents:
diff changeset
1843 foreach (AbstractMetaFunction *f, funcs_to_add)
e78566595089 initial import
mandel
parents:
diff changeset
1844 funcs << f->copy();
e78566595089 initial import
mandel
parents:
diff changeset
1845
e78566595089 initial import
mandel
parents:
diff changeset
1846 if (super_class)
e78566595089 initial import
mandel
parents:
diff changeset
1847 super_class = super_class->baseClass();
e78566595089 initial import
mandel
parents:
diff changeset
1848 else
e78566595089 initial import
mandel
parents:
diff changeset
1849 iface_idx++;
e78566595089 initial import
mandel
parents:
diff changeset
1850 }
e78566595089 initial import
mandel
parents:
diff changeset
1851
e78566595089 initial import
mandel
parents:
diff changeset
1852 bool hasPrivateConstructors = false;
e78566595089 initial import
mandel
parents:
diff changeset
1853 bool hasPublicConstructors = false;
e78566595089 initial import
mandel
parents:
diff changeset
1854 foreach (AbstractMetaFunction *func, funcs) {
e78566595089 initial import
mandel
parents:
diff changeset
1855 FunctionModificationList mods = func->modifications(this);
e78566595089 initial import
mandel
parents:
diff changeset
1856 foreach (const FunctionModification &mod, mods) {
e78566595089 initial import
mandel
parents:
diff changeset
1857 if (mod.isRenameModifier()) {
e78566595089 initial import
mandel
parents:
diff changeset
1858 // qDebug() << name() << func->originalName() << func << " from "
e78566595089 initial import
mandel
parents:
diff changeset
1859 // << func->implementingClass()->name() << "renamed to" << mod.renamedTo();
e78566595089 initial import
mandel
parents:
diff changeset
1860 func->setName(mod.renamedTo());
e78566595089 initial import
mandel
parents:
diff changeset
1861 }
e78566595089 initial import
mandel
parents:
diff changeset
1862 }
e78566595089 initial import
mandel
parents:
diff changeset
1863
e78566595089 initial import
mandel
parents:
diff changeset
1864 // Make sure class is abstract if one of the functions is
e78566595089 initial import
mandel
parents:
diff changeset
1865 if (func->isAbstract()) {
e78566595089 initial import
mandel
parents:
diff changeset
1866 (*this) += AbstractMetaAttributes::Abstract;
e78566595089 initial import
mandel
parents:
diff changeset
1867 (*this) -= AbstractMetaAttributes::Final;
e78566595089 initial import
mandel
parents:
diff changeset
1868 }
e78566595089 initial import
mandel
parents:
diff changeset
1869
e78566595089 initial import
mandel
parents:
diff changeset
1870 if (func->isConstructor()) {
e78566595089 initial import
mandel
parents:
diff changeset
1871 if (func->isPrivate())
e78566595089 initial import
mandel
parents:
diff changeset
1872 hasPrivateConstructors = true;
e78566595089 initial import
mandel
parents:
diff changeset
1873 else
e78566595089 initial import
mandel
parents:
diff changeset
1874 hasPublicConstructors = true;
e78566595089 initial import
mandel
parents:
diff changeset
1875 }
e78566595089 initial import
mandel
parents:
diff changeset
1876
e78566595089 initial import
mandel
parents:
diff changeset
1877
e78566595089 initial import
mandel
parents:
diff changeset
1878
e78566595089 initial import
mandel
parents:
diff changeset
1879 // Make sure that we include files for all classes that are in use
e78566595089 initial import
mandel
parents:
diff changeset
1880
e78566595089 initial import
mandel
parents:
diff changeset
1881 if (!func->isRemovedFrom(this, TypeSystem::ShellCode))
e78566595089 initial import
mandel
parents:
diff changeset
1882 add_extra_includes_for_function(this, func);
e78566595089 initial import
mandel
parents:
diff changeset
1883 }
e78566595089 initial import
mandel
parents:
diff changeset
1884
e78566595089 initial import
mandel
parents:
diff changeset
1885 if (hasPrivateConstructors && !hasPublicConstructors) {
e78566595089 initial import
mandel
parents:
diff changeset
1886 (*this) += AbstractMetaAttributes::Abstract;
e78566595089 initial import
mandel
parents:
diff changeset
1887 (*this) -= AbstractMetaAttributes::Final;
e78566595089 initial import
mandel
parents:
diff changeset
1888 }
e78566595089 initial import
mandel
parents:
diff changeset
1889
e78566595089 initial import
mandel
parents:
diff changeset
1890 foreach (AbstractMetaFunction *f1, funcs) {
e78566595089 initial import
mandel
parents:
diff changeset
1891 foreach (AbstractMetaFunction *f2, funcs) {
e78566595089 initial import
mandel
parents:
diff changeset
1892 if (f1 != f2) {
e78566595089 initial import
mandel
parents:
diff changeset
1893 uint cmp = f1->compareTo(f2);
e78566595089 initial import
mandel
parents:
diff changeset
1894 if ((cmp & AbstractMetaFunction::EqualName)
e78566595089 initial import
mandel
parents:
diff changeset
1895 && !f1->isFinalInCpp()
e78566595089 initial import
mandel
parents:
diff changeset
1896 && f2->isFinalInCpp()) {
e78566595089 initial import
mandel
parents:
diff changeset
1897 *f2 += AbstractMetaAttributes::FinalOverload;
e78566595089 initial import
mandel
parents:
diff changeset
1898 // qDebug() << f2 << f2->implementingClass()->name() << "::" << f2->name() << f2->arguments().size() << " vs " << f1 << f1->implementingClass()->name() << "::" << f1->name() << f1->arguments().size();
e78566595089 initial import
mandel
parents:
diff changeset
1899 // qDebug() << " " << f2;
e78566595089 initial import
mandel
parents:
diff changeset
1900 // AbstractMetaArgumentList f2Args = f2->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
1901 // foreach (AbstractMetaArgument *a, f2Args)
e78566595089 initial import
mandel
parents:
diff changeset
1902 // qDebug() << " " << a->type()->name() << a->name();
e78566595089 initial import
mandel
parents:
diff changeset
1903 // qDebug() << " " << f1;
e78566595089 initial import
mandel
parents:
diff changeset
1904 // AbstractMetaArgumentList f1Args = f1->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
1905 // foreach (AbstractMetaArgument *a, f1Args)
e78566595089 initial import
mandel
parents:
diff changeset
1906 // qDebug() << " " << a->type()->name() << a->name();
e78566595089 initial import
mandel
parents:
diff changeset
1907
e78566595089 initial import
mandel
parents:
diff changeset
1908 }
e78566595089 initial import
mandel
parents:
diff changeset
1909 }
e78566595089 initial import
mandel
parents:
diff changeset
1910 }
e78566595089 initial import
mandel
parents:
diff changeset
1911 }
e78566595089 initial import
mandel
parents:
diff changeset
1912
e78566595089 initial import
mandel
parents:
diff changeset
1913 setFunctions(funcs);
e78566595089 initial import
mandel
parents:
diff changeset
1914 }
e78566595089 initial import
mandel
parents:
diff changeset
1915
e78566595089 initial import
mandel
parents:
diff changeset
1916
e78566595089 initial import
mandel
parents:
diff changeset
1917 QString AbstractMetaType::minimalSignature() const
e78566595089 initial import
mandel
parents:
diff changeset
1918 {
e78566595089 initial import
mandel
parents:
diff changeset
1919 QString minimalSignature;
e78566595089 initial import
mandel
parents:
diff changeset
1920 if (isConstant())
e78566595089 initial import
mandel
parents:
diff changeset
1921 minimalSignature += "const ";
e78566595089 initial import
mandel
parents:
diff changeset
1922 minimalSignature += typeEntry()->qualifiedCppName();
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
1923 if (hasInstantiations() &&
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
1924 (static_cast<const ContainerTypeEntry *>(typeEntry()))->type() != ContainerTypeEntry::StringListContainer)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
1925 {
1
e78566595089 initial import
mandel
parents:
diff changeset
1926 QList<AbstractMetaType *> instantiations = this->instantiations();
e78566595089 initial import
mandel
parents:
diff changeset
1927 minimalSignature += "<";
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
1928 for (int i=0;i<instantiations.size();++i)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
1929 {
1
e78566595089 initial import
mandel
parents:
diff changeset
1930 if (i > 0)
e78566595089 initial import
mandel
parents:
diff changeset
1931 minimalSignature += ",";
e78566595089 initial import
mandel
parents:
diff changeset
1932 minimalSignature += instantiations.at(i)->minimalSignature();
e78566595089 initial import
mandel
parents:
diff changeset
1933 }
e78566595089 initial import
mandel
parents:
diff changeset
1934 minimalSignature += ">";
e78566595089 initial import
mandel
parents:
diff changeset
1935 }
e78566595089 initial import
mandel
parents:
diff changeset
1936
e78566595089 initial import
mandel
parents:
diff changeset
1937 if (isReference())
e78566595089 initial import
mandel
parents:
diff changeset
1938 minimalSignature += "&";
e78566595089 initial import
mandel
parents:
diff changeset
1939 for (int j=0; j<indirections(); ++j)
e78566595089 initial import
mandel
parents:
diff changeset
1940 minimalSignature += "*";
e78566595089 initial import
mandel
parents:
diff changeset
1941
e78566595089 initial import
mandel
parents:
diff changeset
1942 return minimalSignature;
e78566595089 initial import
mandel
parents:
diff changeset
1943 }
e78566595089 initial import
mandel
parents:
diff changeset
1944
e78566595089 initial import
mandel
parents:
diff changeset
1945 bool AbstractMetaType::hasNativeId() const
e78566595089 initial import
mandel
parents:
diff changeset
1946 {
e78566595089 initial import
mandel
parents:
diff changeset
1947 return (isQObject() || isValue() || isObject()) && typeEntry()->isNativeIdBased();
e78566595089 initial import
mandel
parents:
diff changeset
1948 }
e78566595089 initial import
mandel
parents:
diff changeset
1949
e78566595089 initial import
mandel
parents:
diff changeset
1950
e78566595089 initial import
mandel
parents:
diff changeset
1951 /*******************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
1952 * Other stuff...
e78566595089 initial import
mandel
parents:
diff changeset
1953 */
e78566595089 initial import
mandel
parents:
diff changeset
1954
e78566595089 initial import
mandel
parents:
diff changeset
1955
e78566595089 initial import
mandel
parents:
diff changeset
1956 AbstractMetaEnum *AbstractMetaClassList::findEnum(const EnumTypeEntry *entry) const
e78566595089 initial import
mandel
parents:
diff changeset
1957 {
e78566595089 initial import
mandel
parents:
diff changeset
1958 Q_ASSERT(entry->isEnum());
e78566595089 initial import
mandel
parents:
diff changeset
1959
e78566595089 initial import
mandel
parents:
diff changeset
1960 QString qualified_name = entry->qualifiedCppName();
e78566595089 initial import
mandel
parents:
diff changeset
1961 int pos = qualified_name.lastIndexOf("::");
e78566595089 initial import
mandel
parents:
diff changeset
1962
e78566595089 initial import
mandel
parents:
diff changeset
1963 QString enum_name;
e78566595089 initial import
mandel
parents:
diff changeset
1964 QString class_name;
e78566595089 initial import
mandel
parents:
diff changeset
1965
e78566595089 initial import
mandel
parents:
diff changeset
1966 if (pos > 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1967 enum_name = qualified_name.mid(pos + 2);
e78566595089 initial import
mandel
parents:
diff changeset
1968 class_name = qualified_name.mid(0, pos);
e78566595089 initial import
mandel
parents:
diff changeset
1969 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1970 enum_name = qualified_name;
e78566595089 initial import
mandel
parents:
diff changeset
1971 class_name = TypeDatabase::globalNamespaceClassName(entry);
e78566595089 initial import
mandel
parents:
diff changeset
1972 }
e78566595089 initial import
mandel
parents:
diff changeset
1973
e78566595089 initial import
mandel
parents:
diff changeset
1974 AbstractMetaClass *meta_class = findClass(class_name);
e78566595089 initial import
mandel
parents:
diff changeset
1975 if (!meta_class) {
e78566595089 initial import
mandel
parents:
diff changeset
1976 ReportHandler::warning(QString("AbstractMeta::findEnum(), unknown class '%1' in '%2'")
e78566595089 initial import
mandel
parents:
diff changeset
1977 .arg(class_name).arg(entry->qualifiedCppName()));
e78566595089 initial import
mandel
parents:
diff changeset
1978 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1979 }
e78566595089 initial import
mandel
parents:
diff changeset
1980
e78566595089 initial import
mandel
parents:
diff changeset
1981 return meta_class->findEnum(enum_name);
e78566595089 initial import
mandel
parents:
diff changeset
1982 }
e78566595089 initial import
mandel
parents:
diff changeset
1983
e78566595089 initial import
mandel
parents:
diff changeset
1984 AbstractMetaEnumValue *AbstractMetaEnumValueList::find(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
1985 {
e78566595089 initial import
mandel
parents:
diff changeset
1986 for (int i=0; i<size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
1987 if (name == at(i)->name())
e78566595089 initial import
mandel
parents:
diff changeset
1988 return at(i);
e78566595089 initial import
mandel
parents:
diff changeset
1989 }
e78566595089 initial import
mandel
parents:
diff changeset
1990 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1991 }
e78566595089 initial import
mandel
parents:
diff changeset
1992
e78566595089 initial import
mandel
parents:
diff changeset
1993 AbstractMetaEnumValue *AbstractMetaClassList::findEnumValue(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
1994 {
e78566595089 initial import
mandel
parents:
diff changeset
1995 QStringList lst = name.split(QLatin1String("::"));
e78566595089 initial import
mandel
parents:
diff changeset
1996
e78566595089 initial import
mandel
parents:
diff changeset
1997 Q_ASSERT_X(lst.size() == 2, "AbstractMetaClassList::findEnumValue()", "Expected qualified enum");
e78566595089 initial import
mandel
parents:
diff changeset
1998
e78566595089 initial import
mandel
parents:
diff changeset
1999
e78566595089 initial import
mandel
parents:
diff changeset
2000 QString prefixName = lst.at(0);
e78566595089 initial import
mandel
parents:
diff changeset
2001 QString enumName = lst.at(1);
e78566595089 initial import
mandel
parents:
diff changeset
2002
e78566595089 initial import
mandel
parents:
diff changeset
2003 AbstractMetaClass *cl = findClass(prefixName);
e78566595089 initial import
mandel
parents:
diff changeset
2004 if (cl)
e78566595089 initial import
mandel
parents:
diff changeset
2005 return cl->findEnumValue(enumName, 0);
e78566595089 initial import
mandel
parents:
diff changeset
2006
e78566595089 initial import
mandel
parents:
diff changeset
2007 ReportHandler::warning(QString("no matching enum '%1'").arg(name));
e78566595089 initial import
mandel
parents:
diff changeset
2008 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
2009 }
e78566595089 initial import
mandel
parents:
diff changeset
2010
e78566595089 initial import
mandel
parents:
diff changeset
2011 /*!
e78566595089 initial import
mandel
parents:
diff changeset
2012 * Searches the list after a class that mathces \a name; either as
e78566595089 initial import
mandel
parents:
diff changeset
2013 * C++, Java base name or complete Java package.class name.
e78566595089 initial import
mandel
parents:
diff changeset
2014 */
e78566595089 initial import
mandel
parents:
diff changeset
2015
e78566595089 initial import
mandel
parents:
diff changeset
2016 AbstractMetaClass *AbstractMetaClassList::findClass(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
2017 {
e78566595089 initial import
mandel
parents:
diff changeset
2018 if (name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
2019 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
2020
e78566595089 initial import
mandel
parents:
diff changeset
2021 foreach (AbstractMetaClass *c, *this) {
e78566595089 initial import
mandel
parents:
diff changeset
2022 if (c->qualifiedCppName() == name)
e78566595089 initial import
mandel
parents:
diff changeset
2023 return c;
e78566595089 initial import
mandel
parents:
diff changeset
2024 }
e78566595089 initial import
mandel
parents:
diff changeset
2025
e78566595089 initial import
mandel
parents:
diff changeset
2026 foreach (AbstractMetaClass *c, *this) {
e78566595089 initial import
mandel
parents:
diff changeset
2027 if (c->fullName() == name)
e78566595089 initial import
mandel
parents:
diff changeset
2028 return c;
e78566595089 initial import
mandel
parents:
diff changeset
2029 }
e78566595089 initial import
mandel
parents:
diff changeset
2030
e78566595089 initial import
mandel
parents:
diff changeset
2031 foreach (AbstractMetaClass *c, *this) {
e78566595089 initial import
mandel
parents:
diff changeset
2032 if (c->name() == name)
e78566595089 initial import
mandel
parents:
diff changeset
2033 return c;
e78566595089 initial import
mandel
parents:
diff changeset
2034 }
e78566595089 initial import
mandel
parents:
diff changeset
2035
e78566595089 initial import
mandel
parents:
diff changeset
2036 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
2037 }
e78566595089 initial import
mandel
parents:
diff changeset
2038
e78566595089 initial import
mandel
parents:
diff changeset
2039 ArgumentReplace *ArgumentReplace::m_instance = 0;
e78566595089 initial import
mandel
parents:
diff changeset
2040
e78566595089 initial import
mandel
parents:
diff changeset
2041 ArgumentReplace::ArgumentReplace()
e78566595089 initial import
mandel
parents:
diff changeset
2042 {
e78566595089 initial import
mandel
parents:
diff changeset
2043 }
e78566595089 initial import
mandel
parents:
diff changeset
2044
e78566595089 initial import
mandel
parents:
diff changeset
2045 void ArgumentReplace::init()
e78566595089 initial import
mandel
parents:
diff changeset
2046 {
e78566595089 initial import
mandel
parents:
diff changeset
2047 if (m_instance)
e78566595089 initial import
mandel
parents:
diff changeset
2048 return;
e78566595089 initial import
mandel
parents:
diff changeset
2049
e78566595089 initial import
mandel
parents:
diff changeset
2050 m_instance = new ArgumentReplace();
378
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2051 m_instance->data["version"] = "version_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2052 m_instance->data["parent"] = "parent_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2053 m_instance->data["delegate"] = "delegate_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2054 m_instance->data["align"] = "align_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2055 m_instance->data["in"] = "in_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2056 m_instance->data["out"] = "out_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2057 m_instance->data["scope"] = "scope_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2058 m_instance->data["default"] = "default_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2059 m_instance->data["body"] = "body_";
7341c47790d4 binding of qwt
Eldar Insafutdinov
parents: 357
diff changeset
2060 m_instance->data["ref"] = "ref_";
1
e78566595089 initial import
mandel
parents:
diff changeset
2061 }
e78566595089 initial import
mandel
parents:
diff changeset
2062
e78566595089 initial import
mandel
parents:
diff changeset
2063 QString ArgumentReplace::translate(QString arg)
e78566595089 initial import
mandel
parents:
diff changeset
2064 {
e78566595089 initial import
mandel
parents:
diff changeset
2065 if (m_instance->data.contains(arg))
e78566595089 initial import
mandel
parents:
diff changeset
2066 return m_instance->data[arg];
e78566595089 initial import
mandel
parents:
diff changeset
2067 else
e78566595089 initial import
mandel
parents:
diff changeset
2068 return arg;
e78566595089 initial import
mandel
parents:
diff changeset
2069 }