annotate generator/abstractmetalang.cpp @ 282:256ab6cb8e85

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