annotate generator/typesystem.cpp @ 361:beaf4a2974d7

Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
author Max Samukha <maxter@maxter.com>
date Wed, 09 Jun 2010 11:08:56 +0300
parents 08c1ca7975ab
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /****************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
2 **
e78566595089 initial import
mandel
parents:
diff changeset
3 ** Copyright (C) 1992-2008 Nokia. All rights reserved.
e78566595089 initial import
mandel
parents:
diff changeset
4 **
e78566595089 initial import
mandel
parents:
diff changeset
5 ** This file is part of Qt Jambi.
e78566595089 initial import
mandel
parents:
diff changeset
6 **
e78566595089 initial import
mandel
parents:
diff changeset
7 ** * Commercial Usage
e78566595089 initial import
mandel
parents:
diff changeset
8 * Licensees holding valid Qt Commercial licenses may use this file in
e78566595089 initial import
mandel
parents:
diff changeset
9 * accordance with the Qt Commercial License Agreement provided with the
e78566595089 initial import
mandel
parents:
diff changeset
10 * Software or, alternatively, in accordance with the terms contained in
e78566595089 initial import
mandel
parents:
diff changeset
11 * a written agreement between you and Nokia.
e78566595089 initial import
mandel
parents:
diff changeset
12 *
e78566595089 initial import
mandel
parents:
diff changeset
13 *
e78566595089 initial import
mandel
parents:
diff changeset
14 * GNU General Public License Usage
e78566595089 initial import
mandel
parents:
diff changeset
15 * Alternatively, this file may be used under the terms of the GNU
e78566595089 initial import
mandel
parents:
diff changeset
16 * General Public License versions 2.0 or 3.0 as published by the Free
e78566595089 initial import
mandel
parents:
diff changeset
17 * Software Foundation and appearing in the file LICENSE.GPL included in
e78566595089 initial import
mandel
parents:
diff changeset
18 * the packaging of this file. Please review the following information
e78566595089 initial import
mandel
parents:
diff changeset
19 * to ensure GNU General Public Licensing requirements will be met:
e78566595089 initial import
mandel
parents:
diff changeset
20 * http://www.fsf.org/licensing/licenses/info/GPLv2.html and
e78566595089 initial import
mandel
parents:
diff changeset
21 * http://www.gnu.org/copyleft/gpl.html. In addition, as a special
e78566595089 initial import
mandel
parents:
diff changeset
22 * exception, Nokia gives you certain additional rights. These rights
e78566595089 initial import
mandel
parents:
diff changeset
23 * are described in the Nokia Qt GPL Exception version 1.2, included in
e78566595089 initial import
mandel
parents:
diff changeset
24 * the file GPL_EXCEPTION.txt in this package.
e78566595089 initial import
mandel
parents:
diff changeset
25 *
e78566595089 initial import
mandel
parents:
diff changeset
26 * Qt for Windows(R) Licensees
e78566595089 initial import
mandel
parents:
diff changeset
27 * As a special exception, Nokia, as the sole copyright holder for Qt
e78566595089 initial import
mandel
parents:
diff changeset
28 * Designer, grants users of the Qt/Eclipse Integration plug-in the
e78566595089 initial import
mandel
parents:
diff changeset
29 * right for the Qt/Eclipse Integration to link to functionality
e78566595089 initial import
mandel
parents:
diff changeset
30 * provided by Qt Designer and its related libraries.
e78566595089 initial import
mandel
parents:
diff changeset
31 *
e78566595089 initial import
mandel
parents:
diff changeset
32 *
e78566595089 initial import
mandel
parents:
diff changeset
33 * If you are unsure which license is appropriate for your use, please
e78566595089 initial import
mandel
parents:
diff changeset
34 * contact the sales department at qt-sales@nokia.com.
e78566595089 initial import
mandel
parents:
diff changeset
35
e78566595089 initial import
mandel
parents:
diff changeset
36 **
e78566595089 initial import
mandel
parents:
diff changeset
37 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
e78566595089 initial import
mandel
parents:
diff changeset
38 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e78566595089 initial import
mandel
parents:
diff changeset
39 **
e78566595089 initial import
mandel
parents:
diff changeset
40 ****************************************************************************/
e78566595089 initial import
mandel
parents:
diff changeset
41
e78566595089 initial import
mandel
parents:
diff changeset
42 #include "typesystem.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "generator.h"
e78566595089 initial import
mandel
parents:
diff changeset
44
e78566595089 initial import
mandel
parents:
diff changeset
45 #include "customtypes.h"
e78566595089 initial import
mandel
parents:
diff changeset
46
e78566595089 initial import
mandel
parents:
diff changeset
47 #include <reporthandler.h>
e78566595089 initial import
mandel
parents:
diff changeset
48
e78566595089 initial import
mandel
parents:
diff changeset
49 #include <QtXml>
e78566595089 initial import
mandel
parents:
diff changeset
50
e78566595089 initial import
mandel
parents:
diff changeset
51 QString strings_Object = QLatin1String("Object");
e78566595089 initial import
mandel
parents:
diff changeset
52 QString strings_String = QLatin1String("string");
e78566595089 initial import
mandel
parents:
diff changeset
53 QString strings_Thread = QLatin1String("Thread");
e78566595089 initial import
mandel
parents:
diff changeset
54 QString strings_char = QLatin1String("char");
e78566595089 initial import
mandel
parents:
diff changeset
55 QString strings_java_lang = QLatin1String("java.lang");
e78566595089 initial import
mandel
parents:
diff changeset
56 QString strings_jchar = QLatin1String("jchar");
e78566595089 initial import
mandel
parents:
diff changeset
57 QString strings_jobject = QLatin1String("jobject");
e78566595089 initial import
mandel
parents:
diff changeset
58
e78566595089 initial import
mandel
parents:
diff changeset
59 static void addRemoveFunctionToTemplates(TypeDatabase *db);
e78566595089 initial import
mandel
parents:
diff changeset
60
e78566595089 initial import
mandel
parents:
diff changeset
61 class StackElement
e78566595089 initial import
mandel
parents:
diff changeset
62 {
e78566595089 initial import
mandel
parents:
diff changeset
63 public:
e78566595089 initial import
mandel
parents:
diff changeset
64 enum ElementType {
e78566595089 initial import
mandel
parents:
diff changeset
65 None = 0x0,
e78566595089 initial import
mandel
parents:
diff changeset
66
e78566595089 initial import
mandel
parents:
diff changeset
67 // Type tags (0x1, ... , 0xff)
e78566595089 initial import
mandel
parents:
diff changeset
68 ObjectTypeEntry = 0x1,
e78566595089 initial import
mandel
parents:
diff changeset
69 ValueTypeEntry = 0x2,
e78566595089 initial import
mandel
parents:
diff changeset
70 InterfaceTypeEntry = 0x3,
e78566595089 initial import
mandel
parents:
diff changeset
71 NamespaceTypeEntry = 0x4,
e78566595089 initial import
mandel
parents:
diff changeset
72 ComplexTypeEntryMask = 0xf,
e78566595089 initial import
mandel
parents:
diff changeset
73
e78566595089 initial import
mandel
parents:
diff changeset
74 // Non-complex type tags (0x10, 0x20, ... , 0xf0)
e78566595089 initial import
mandel
parents:
diff changeset
75 PrimitiveTypeEntry = 0x10,
e78566595089 initial import
mandel
parents:
diff changeset
76 EnumTypeEntry = 0x20,
e78566595089 initial import
mandel
parents:
diff changeset
77 TypeEntryMask = 0xff,
e78566595089 initial import
mandel
parents:
diff changeset
78
e78566595089 initial import
mandel
parents:
diff changeset
79 // Simple tags (0x100, 0x200, ... , 0xf00)
e78566595089 initial import
mandel
parents:
diff changeset
80 ExtraIncludes = 0x100,
e78566595089 initial import
mandel
parents:
diff changeset
81 Include = 0x200,
e78566595089 initial import
mandel
parents:
diff changeset
82 ModifyFunction = 0x300,
e78566595089 initial import
mandel
parents:
diff changeset
83 ModifyField = 0x400,
e78566595089 initial import
mandel
parents:
diff changeset
84 Root = 0x500,
e78566595089 initial import
mandel
parents:
diff changeset
85 CustomMetaConstructor = 0x600,
e78566595089 initial import
mandel
parents:
diff changeset
86 CustomMetaDestructor = 0x700,
e78566595089 initial import
mandel
parents:
diff changeset
87 ArgumentMap = 0x800,
e78566595089 initial import
mandel
parents:
diff changeset
88 SuppressedWarning = 0x900,
e78566595089 initial import
mandel
parents:
diff changeset
89 Rejection = 0xa00,
e78566595089 initial import
mandel
parents:
diff changeset
90 LoadTypesystem = 0xb00,
e78566595089 initial import
mandel
parents:
diff changeset
91 RejectEnumValue = 0xc00,
e78566595089 initial import
mandel
parents:
diff changeset
92 Template = 0xd00,
e78566595089 initial import
mandel
parents:
diff changeset
93 TemplateInstanceEnum = 0xe00,
e78566595089 initial import
mandel
parents:
diff changeset
94 Replace = 0xf00,
e78566595089 initial import
mandel
parents:
diff changeset
95 SimpleMask = 0xf00,
e78566595089 initial import
mandel
parents:
diff changeset
96 // qtd stuff
e78566595089 initial import
mandel
parents:
diff changeset
97 AddClass = 0x1100,
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
98 PackageDepend = 0x1200,
304
04b52676b45f fixed compiling all packages
eldar_ins@eldar-laptop
parents: 297
diff changeset
99 PrivateCopyConstructor = 0x1300,
1
e78566595089 initial import
mandel
parents:
diff changeset
100
e78566595089 initial import
mandel
parents:
diff changeset
101 // Code snip tags (0x1000, 0x2000, ... , 0xf000)
e78566595089 initial import
mandel
parents:
diff changeset
102 InjectCode = 0x1000,
e78566595089 initial import
mandel
parents:
diff changeset
103 InjectCodeInFunction = 0x2000,
e78566595089 initial import
mandel
parents:
diff changeset
104 CodeSnipMask = 0xf000,
e78566595089 initial import
mandel
parents:
diff changeset
105
e78566595089 initial import
mandel
parents:
diff changeset
106 // Function modifier tags (0x010000, 0x020000, ... , 0xf00000)
e78566595089 initial import
mandel
parents:
diff changeset
107 Access = 0x010000,
e78566595089 initial import
mandel
parents:
diff changeset
108 Removal = 0x020000,
e78566595089 initial import
mandel
parents:
diff changeset
109 Rename = 0x040000,
e78566595089 initial import
mandel
parents:
diff changeset
110 ModifyArgument = 0x080000,
148
ae34188ddd84 private signals of QAbstractItemModel are now accessible
eldar
parents: 44
diff changeset
111 PrivateSignal = 0x100000,
1
e78566595089 initial import
mandel
parents:
diff changeset
112 FunctionModifiers = 0xff0000,
e78566595089 initial import
mandel
parents:
diff changeset
113 StoreResult = 0x110000,
e78566595089 initial import
mandel
parents:
diff changeset
114
e78566595089 initial import
mandel
parents:
diff changeset
115 // Argument modifier tags (0x01000000 ... 0xf0000000)
e78566595089 initial import
mandel
parents:
diff changeset
116 ConversionRule = 0x01000000,
e78566595089 initial import
mandel
parents:
diff changeset
117 ReplaceType = 0x02000000,
e78566595089 initial import
mandel
parents:
diff changeset
118 ReplaceDefaultExpression = 0x04000000,
e78566595089 initial import
mandel
parents:
diff changeset
119 RemoveArgument = 0x08000000,
e78566595089 initial import
mandel
parents:
diff changeset
120 DefineOwnership = 0x10000000,
e78566595089 initial import
mandel
parents:
diff changeset
121 RemoveDefaultExpression = 0x20000000,
e78566595089 initial import
mandel
parents:
diff changeset
122 NoNullPointers = 0x40000000,
e78566595089 initial import
mandel
parents:
diff changeset
123 ReferenceCount = 0x80000000,
e78566595089 initial import
mandel
parents:
diff changeset
124 ArgumentModifiers = 0xff000000
e78566595089 initial import
mandel
parents:
diff changeset
125
e78566595089 initial import
mandel
parents:
diff changeset
126 };
e78566595089 initial import
mandel
parents:
diff changeset
127
e78566595089 initial import
mandel
parents:
diff changeset
128 StackElement(StackElement *p) : entry(0), type(None), parent(p){ }
e78566595089 initial import
mandel
parents:
diff changeset
129
e78566595089 initial import
mandel
parents:
diff changeset
130 TypeEntry *entry;
e78566595089 initial import
mandel
parents:
diff changeset
131 ElementType type;
e78566595089 initial import
mandel
parents:
diff changeset
132 StackElement *parent;
e78566595089 initial import
mandel
parents:
diff changeset
133
e78566595089 initial import
mandel
parents:
diff changeset
134 union {
e78566595089 initial import
mandel
parents:
diff changeset
135 TemplateInstance *templateInstance;
e78566595089 initial import
mandel
parents:
diff changeset
136 TemplateEntry *templateEntry;
e78566595089 initial import
mandel
parents:
diff changeset
137 CustomFunction *customFunction;
e78566595089 initial import
mandel
parents:
diff changeset
138 } value;
e78566595089 initial import
mandel
parents:
diff changeset
139 };
e78566595089 initial import
mandel
parents:
diff changeset
140
e78566595089 initial import
mandel
parents:
diff changeset
141 class Handler : public QXmlDefaultHandler
e78566595089 initial import
mandel
parents:
diff changeset
142 {
e78566595089 initial import
mandel
parents:
diff changeset
143 public:
4
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
144 Handler(TypeDatabase *database, const QString &source_dir, bool generate)
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
145 : m_database(database), m_generate(generate ? TypeEntry::GenerateAll : TypeEntry::GenerateForSubclass), m_source_dir(source_dir)
1
e78566595089 initial import
mandel
parents:
diff changeset
146 {
e78566595089 initial import
mandel
parents:
diff changeset
147 m_current_enum = 0;
e78566595089 initial import
mandel
parents:
diff changeset
148 current = 0;
e78566595089 initial import
mandel
parents:
diff changeset
149
e78566595089 initial import
mandel
parents:
diff changeset
150 tagNames["rejection"] = StackElement::Rejection;
e78566595089 initial import
mandel
parents:
diff changeset
151 tagNames["primitive-type"] = StackElement::PrimitiveTypeEntry;
e78566595089 initial import
mandel
parents:
diff changeset
152 tagNames["object-type"] = StackElement::ObjectTypeEntry;
e78566595089 initial import
mandel
parents:
diff changeset
153 tagNames["value-type"] = StackElement::ValueTypeEntry;
e78566595089 initial import
mandel
parents:
diff changeset
154 tagNames["interface-type"] = StackElement::InterfaceTypeEntry;
e78566595089 initial import
mandel
parents:
diff changeset
155 tagNames["namespace-type"] = StackElement::NamespaceTypeEntry;
e78566595089 initial import
mandel
parents:
diff changeset
156 tagNames["enum-type"] = StackElement::EnumTypeEntry;
e78566595089 initial import
mandel
parents:
diff changeset
157 tagNames["extra-includes"] = StackElement::ExtraIncludes;
e78566595089 initial import
mandel
parents:
diff changeset
158 tagNames["include"] = StackElement::Include;
e78566595089 initial import
mandel
parents:
diff changeset
159 tagNames["inject-code"] = StackElement::InjectCode;
e78566595089 initial import
mandel
parents:
diff changeset
160 tagNames["modify-function"] = StackElement::ModifyFunction;
e78566595089 initial import
mandel
parents:
diff changeset
161 tagNames["modify-field"] = StackElement::ModifyField;
e78566595089 initial import
mandel
parents:
diff changeset
162 tagNames["access"] = StackElement::Access;
e78566595089 initial import
mandel
parents:
diff changeset
163 tagNames["remove"] = StackElement::Removal;
e78566595089 initial import
mandel
parents:
diff changeset
164 tagNames["rename"] = StackElement::Rename;
e78566595089 initial import
mandel
parents:
diff changeset
165 tagNames["typesystem"] = StackElement::Root;
e78566595089 initial import
mandel
parents:
diff changeset
166 tagNames["custom-constructor"] = StackElement::CustomMetaConstructor;
304
04b52676b45f fixed compiling all packages
eldar_ins@eldar-laptop
parents: 297
diff changeset
167 tagNames["private-copy-constructor"] = StackElement::PrivateCopyConstructor;
1
e78566595089 initial import
mandel
parents:
diff changeset
168 tagNames["custom-destructor"] = StackElement::CustomMetaDestructor;
e78566595089 initial import
mandel
parents:
diff changeset
169 tagNames["argument-map"] = StackElement::ArgumentMap;
e78566595089 initial import
mandel
parents:
diff changeset
170 tagNames["suppress-warning"] = StackElement::SuppressedWarning;
e78566595089 initial import
mandel
parents:
diff changeset
171 tagNames["load-typesystem"] = StackElement::LoadTypesystem;
e78566595089 initial import
mandel
parents:
diff changeset
172 tagNames["define-ownership"] = StackElement::DefineOwnership;
e78566595089 initial import
mandel
parents:
diff changeset
173 tagNames["replace-default-expression"] = StackElement::ReplaceDefaultExpression;
e78566595089 initial import
mandel
parents:
diff changeset
174 tagNames["reject-enum-value"] = StackElement::RejectEnumValue;
e78566595089 initial import
mandel
parents:
diff changeset
175 tagNames["replace-type"] = StackElement::ReplaceType;
e78566595089 initial import
mandel
parents:
diff changeset
176 tagNames["conversion-rule"] = StackElement::ConversionRule;
e78566595089 initial import
mandel
parents:
diff changeset
177 tagNames["modify-argument"] = StackElement::ModifyArgument;
e78566595089 initial import
mandel
parents:
diff changeset
178 tagNames["remove-argument"] = StackElement::RemoveArgument;
e78566595089 initial import
mandel
parents:
diff changeset
179 tagNames["remove-default-expression"] = StackElement::RemoveDefaultExpression;
e78566595089 initial import
mandel
parents:
diff changeset
180 tagNames["template"] = StackElement::Template;
e78566595089 initial import
mandel
parents:
diff changeset
181 tagNames["insert-template"] = StackElement::TemplateInstanceEnum;
e78566595089 initial import
mandel
parents:
diff changeset
182 tagNames["replace"] = StackElement::Replace;
e78566595089 initial import
mandel
parents:
diff changeset
183 tagNames["no-null-pointer"] = StackElement::NoNullPointers;
e78566595089 initial import
mandel
parents:
diff changeset
184 tagNames["reference-count"] = StackElement::ReferenceCount;
e78566595089 initial import
mandel
parents:
diff changeset
185 // qtd
e78566595089 initial import
mandel
parents:
diff changeset
186 tagNames["add-class"] = StackElement::AddClass;
e78566595089 initial import
mandel
parents:
diff changeset
187 tagNames["store-result"] = StackElement::StoreResult;
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
188
44
3cb15c92ac28 CMake: small cleanup.
SokoL_SD
parents: 42
diff changeset
189 tagNames["depend"] = StackElement::PackageDepend;
1
e78566595089 initial import
mandel
parents:
diff changeset
190 }
e78566595089 initial import
mandel
parents:
diff changeset
191
e78566595089 initial import
mandel
parents:
diff changeset
192 bool startElement(const QString &namespaceURI, const QString &localName,
e78566595089 initial import
mandel
parents:
diff changeset
193 const QString &qName, const QXmlAttributes &atts);
e78566595089 initial import
mandel
parents:
diff changeset
194 bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName);
e78566595089 initial import
mandel
parents:
diff changeset
195
e78566595089 initial import
mandel
parents:
diff changeset
196 QString errorString() const { return m_error; }
e78566595089 initial import
mandel
parents:
diff changeset
197 bool error(const QXmlParseException &exception);
e78566595089 initial import
mandel
parents:
diff changeset
198 bool fatalError(const QXmlParseException &exception);
e78566595089 initial import
mandel
parents:
diff changeset
199 bool warning(const QXmlParseException &exception);
e78566595089 initial import
mandel
parents:
diff changeset
200
e78566595089 initial import
mandel
parents:
diff changeset
201 bool characters(const QString &ch);
e78566595089 initial import
mandel
parents:
diff changeset
202
e78566595089 initial import
mandel
parents:
diff changeset
203 private:
e78566595089 initial import
mandel
parents:
diff changeset
204 void fetchAttributeValues(const QString &name, const QXmlAttributes &atts,
e78566595089 initial import
mandel
parents:
diff changeset
205 QHash<QString, QString> *acceptedAttributes);
e78566595089 initial import
mandel
parents:
diff changeset
206
e78566595089 initial import
mandel
parents:
diff changeset
207 bool importFileElement(const QXmlAttributes &atts);
e78566595089 initial import
mandel
parents:
diff changeset
208 bool convertBoolean(const QString &, const QString &, bool);
e78566595089 initial import
mandel
parents:
diff changeset
209
e78566595089 initial import
mandel
parents:
diff changeset
210 TypeDatabase *m_database;
e78566595089 initial import
mandel
parents:
diff changeset
211 StackElement* current;
e78566595089 initial import
mandel
parents:
diff changeset
212 QString m_defaultPackage;
e78566595089 initial import
mandel
parents:
diff changeset
213 QString m_defaultSuperclass;
e78566595089 initial import
mandel
parents:
diff changeset
214 QString m_error;
e78566595089 initial import
mandel
parents:
diff changeset
215 TypeEntry::CodeGeneration m_generate;
e78566595089 initial import
mandel
parents:
diff changeset
216
e78566595089 initial import
mandel
parents:
diff changeset
217 EnumTypeEntry *m_current_enum;
e78566595089 initial import
mandel
parents:
diff changeset
218
e78566595089 initial import
mandel
parents:
diff changeset
219 CodeSnipList m_code_snips;
e78566595089 initial import
mandel
parents:
diff changeset
220 FunctionModificationList m_function_mods;
e78566595089 initial import
mandel
parents:
diff changeset
221 FieldModificationList m_field_mods;
e78566595089 initial import
mandel
parents:
diff changeset
222
e78566595089 initial import
mandel
parents:
diff changeset
223 QHash<QString, StackElement::ElementType> tagNames;
4
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
224
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
225 QString m_source_dir;
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
226 QStringList m_defaultDepends;
1
e78566595089 initial import
mandel
parents:
diff changeset
227 };
e78566595089 initial import
mandel
parents:
diff changeset
228
e78566595089 initial import
mandel
parents:
diff changeset
229 bool Handler::error(const QXmlParseException &e)
e78566595089 initial import
mandel
parents:
diff changeset
230 {
e78566595089 initial import
mandel
parents:
diff changeset
231 qWarning("Error: line=%d, column=%d, message=%s\n",
e78566595089 initial import
mandel
parents:
diff changeset
232 e.lineNumber(), e.columnNumber(), qPrintable(e.message()));
e78566595089 initial import
mandel
parents:
diff changeset
233 return false;
e78566595089 initial import
mandel
parents:
diff changeset
234 }
e78566595089 initial import
mandel
parents:
diff changeset
235
e78566595089 initial import
mandel
parents:
diff changeset
236 bool Handler::fatalError(const QXmlParseException &e)
e78566595089 initial import
mandel
parents:
diff changeset
237 {
e78566595089 initial import
mandel
parents:
diff changeset
238 qWarning("Fatal error: line=%d, column=%d, message=%s\n",
e78566595089 initial import
mandel
parents:
diff changeset
239 e.lineNumber(), e.columnNumber(), qPrintable(e.message()));
e78566595089 initial import
mandel
parents:
diff changeset
240
e78566595089 initial import
mandel
parents:
diff changeset
241 return false;
e78566595089 initial import
mandel
parents:
diff changeset
242 }
e78566595089 initial import
mandel
parents:
diff changeset
243
e78566595089 initial import
mandel
parents:
diff changeset
244 bool Handler::warning(const QXmlParseException &e)
e78566595089 initial import
mandel
parents:
diff changeset
245 {
e78566595089 initial import
mandel
parents:
diff changeset
246 qWarning("Warning: line=%d, column=%d, message=%s\n",
e78566595089 initial import
mandel
parents:
diff changeset
247 e.lineNumber(), e.columnNumber(), qPrintable(e.message()));
e78566595089 initial import
mandel
parents:
diff changeset
248
e78566595089 initial import
mandel
parents:
diff changeset
249 return false;
e78566595089 initial import
mandel
parents:
diff changeset
250 }
e78566595089 initial import
mandel
parents:
diff changeset
251
e78566595089 initial import
mandel
parents:
diff changeset
252 void Handler::fetchAttributeValues(const QString &name, const QXmlAttributes &atts,
e78566595089 initial import
mandel
parents:
diff changeset
253 QHash<QString, QString> *acceptedAttributes)
e78566595089 initial import
mandel
parents:
diff changeset
254 {
e78566595089 initial import
mandel
parents:
diff changeset
255 Q_ASSERT(acceptedAttributes != 0);
e78566595089 initial import
mandel
parents:
diff changeset
256
e78566595089 initial import
mandel
parents:
diff changeset
257 for (int i=0; i<atts.length(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
258 QString key = atts.localName(i).toLower();
e78566595089 initial import
mandel
parents:
diff changeset
259 QString val = atts.value(i);
e78566595089 initial import
mandel
parents:
diff changeset
260
e78566595089 initial import
mandel
parents:
diff changeset
261 if (!acceptedAttributes->contains(key)) {
e78566595089 initial import
mandel
parents:
diff changeset
262 ReportHandler::warning(QString("Unknown attribute for '%1': '%2'").arg(name).arg(key));
e78566595089 initial import
mandel
parents:
diff changeset
263 } else {
e78566595089 initial import
mandel
parents:
diff changeset
264 (*acceptedAttributes)[key] = val;
e78566595089 initial import
mandel
parents:
diff changeset
265 }
e78566595089 initial import
mandel
parents:
diff changeset
266 }
e78566595089 initial import
mandel
parents:
diff changeset
267 }
e78566595089 initial import
mandel
parents:
diff changeset
268
e78566595089 initial import
mandel
parents:
diff changeset
269 bool Handler::endElement(const QString &, const QString &localName, const QString &)
e78566595089 initial import
mandel
parents:
diff changeset
270 {
e78566595089 initial import
mandel
parents:
diff changeset
271 QString tagName = localName.toLower();
e78566595089 initial import
mandel
parents:
diff changeset
272 if(tagName == "import-file")
e78566595089 initial import
mandel
parents:
diff changeset
273 return true;
e78566595089 initial import
mandel
parents:
diff changeset
274
e78566595089 initial import
mandel
parents:
diff changeset
275 if (!current)
e78566595089 initial import
mandel
parents:
diff changeset
276 return true;
e78566595089 initial import
mandel
parents:
diff changeset
277
e78566595089 initial import
mandel
parents:
diff changeset
278 switch (current->type) {
e78566595089 initial import
mandel
parents:
diff changeset
279 case StackElement::ObjectTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
280 case StackElement::ValueTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
281 case StackElement::InterfaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
282 case StackElement::NamespaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
283 {
e78566595089 initial import
mandel
parents:
diff changeset
284 ComplexTypeEntry *centry = static_cast<ComplexTypeEntry *>(current->entry);
e78566595089 initial import
mandel
parents:
diff changeset
285 centry->setFunctionModifications(m_function_mods);
e78566595089 initial import
mandel
parents:
diff changeset
286 centry->setFieldModifications(m_field_mods);
e78566595089 initial import
mandel
parents:
diff changeset
287 centry->setCodeSnips(m_code_snips);
e78566595089 initial import
mandel
parents:
diff changeset
288
e78566595089 initial import
mandel
parents:
diff changeset
289 if (centry->designatedInterface()) {
e78566595089 initial import
mandel
parents:
diff changeset
290 centry->designatedInterface()->setCodeSnips(m_code_snips);
e78566595089 initial import
mandel
parents:
diff changeset
291 centry->designatedInterface()->setFunctionModifications(m_function_mods);
e78566595089 initial import
mandel
parents:
diff changeset
292 }
e78566595089 initial import
mandel
parents:
diff changeset
293 m_code_snips = CodeSnipList();
e78566595089 initial import
mandel
parents:
diff changeset
294 m_function_mods = FunctionModificationList();
e78566595089 initial import
mandel
parents:
diff changeset
295 m_field_mods = FieldModificationList();
e78566595089 initial import
mandel
parents:
diff changeset
296 }
e78566595089 initial import
mandel
parents:
diff changeset
297 break;
e78566595089 initial import
mandel
parents:
diff changeset
298 case StackElement::CustomMetaConstructor:
e78566595089 initial import
mandel
parents:
diff changeset
299 {
e78566595089 initial import
mandel
parents:
diff changeset
300 current->entry->setCustomConstructor(*current->value.customFunction);
e78566595089 initial import
mandel
parents:
diff changeset
301 delete current->value.customFunction;
e78566595089 initial import
mandel
parents:
diff changeset
302 }
e78566595089 initial import
mandel
parents:
diff changeset
303 break;
304
04b52676b45f fixed compiling all packages
eldar_ins@eldar-laptop
parents: 297
diff changeset
304 case StackElement::PrivateCopyConstructor:
04b52676b45f fixed compiling all packages
eldar_ins@eldar-laptop
parents: 297
diff changeset
305 {
04b52676b45f fixed compiling all packages
eldar_ins@eldar-laptop
parents: 297
diff changeset
306 current->entry->setHasPrivateCopyConstructor(true);
04b52676b45f fixed compiling all packages
eldar_ins@eldar-laptop
parents: 297
diff changeset
307 }
04b52676b45f fixed compiling all packages
eldar_ins@eldar-laptop
parents: 297
diff changeset
308 break;
1
e78566595089 initial import
mandel
parents:
diff changeset
309 case StackElement::CustomMetaDestructor:
e78566595089 initial import
mandel
parents:
diff changeset
310 {
e78566595089 initial import
mandel
parents:
diff changeset
311 current->entry->setCustomDestructor(*current->value.customFunction);
e78566595089 initial import
mandel
parents:
diff changeset
312 delete current->value.customFunction;
e78566595089 initial import
mandel
parents:
diff changeset
313 }
e78566595089 initial import
mandel
parents:
diff changeset
314 break;
e78566595089 initial import
mandel
parents:
diff changeset
315 case StackElement::EnumTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
316 m_current_enum = 0;
e78566595089 initial import
mandel
parents:
diff changeset
317 break;
e78566595089 initial import
mandel
parents:
diff changeset
318 case StackElement::Template:
e78566595089 initial import
mandel
parents:
diff changeset
319 m_database->addTemplate(current->value.templateEntry);
e78566595089 initial import
mandel
parents:
diff changeset
320 break;
e78566595089 initial import
mandel
parents:
diff changeset
321 case StackElement::TemplateInstanceEnum:
e78566595089 initial import
mandel
parents:
diff changeset
322 if(current->parent->type == StackElement::InjectCode){
e78566595089 initial import
mandel
parents:
diff changeset
323 m_code_snips.last().addTemplateInstance(current->value.templateInstance);
e78566595089 initial import
mandel
parents:
diff changeset
324 }else if(current->parent->type == StackElement::Template){
e78566595089 initial import
mandel
parents:
diff changeset
325 current->parent->value.templateEntry->addTemplateInstance(current->value.templateInstance);
e78566595089 initial import
mandel
parents:
diff changeset
326 }else if(current->parent->type == StackElement::CustomMetaConstructor || current->parent->type == StackElement::CustomMetaConstructor){
e78566595089 initial import
mandel
parents:
diff changeset
327 current->parent->value.customFunction->addTemplateInstance(current->value.templateInstance);
e78566595089 initial import
mandel
parents:
diff changeset
328 }else if(current->parent->type == StackElement::ConversionRule){
e78566595089 initial import
mandel
parents:
diff changeset
329 m_function_mods.last().argument_mods.last().conversion_rules.last().addTemplateInstance(current->value.templateInstance);
e78566595089 initial import
mandel
parents:
diff changeset
330 }else if(current->parent->type == StackElement::InjectCodeInFunction){
e78566595089 initial import
mandel
parents:
diff changeset
331 m_function_mods.last().snips.last().addTemplateInstance(current->value.templateInstance);
e78566595089 initial import
mandel
parents:
diff changeset
332 }
e78566595089 initial import
mandel
parents:
diff changeset
333 break;
e78566595089 initial import
mandel
parents:
diff changeset
334 default:
e78566595089 initial import
mandel
parents:
diff changeset
335 break;
e78566595089 initial import
mandel
parents:
diff changeset
336 }
e78566595089 initial import
mandel
parents:
diff changeset
337
e78566595089 initial import
mandel
parents:
diff changeset
338 StackElement *child = current;
e78566595089 initial import
mandel
parents:
diff changeset
339 current=current->parent;
e78566595089 initial import
mandel
parents:
diff changeset
340 delete(child);
e78566595089 initial import
mandel
parents:
diff changeset
341
e78566595089 initial import
mandel
parents:
diff changeset
342 return true;
e78566595089 initial import
mandel
parents:
diff changeset
343 }
e78566595089 initial import
mandel
parents:
diff changeset
344
e78566595089 initial import
mandel
parents:
diff changeset
345 bool Handler::characters(const QString &ch)
e78566595089 initial import
mandel
parents:
diff changeset
346 {
e78566595089 initial import
mandel
parents:
diff changeset
347 if(current->type == StackElement::Template){
e78566595089 initial import
mandel
parents:
diff changeset
348 current->value.templateEntry->addCode(ch);
e78566595089 initial import
mandel
parents:
diff changeset
349 return true;
e78566595089 initial import
mandel
parents:
diff changeset
350 }
e78566595089 initial import
mandel
parents:
diff changeset
351
e78566595089 initial import
mandel
parents:
diff changeset
352 if (current->type == StackElement::CustomMetaConstructor || current->type == StackElement::CustomMetaDestructor){
e78566595089 initial import
mandel
parents:
diff changeset
353 current->value.customFunction->addCode(ch);
e78566595089 initial import
mandel
parents:
diff changeset
354 return true;
e78566595089 initial import
mandel
parents:
diff changeset
355 }
e78566595089 initial import
mandel
parents:
diff changeset
356
e78566595089 initial import
mandel
parents:
diff changeset
357 if (current->type == StackElement::ConversionRule){
e78566595089 initial import
mandel
parents:
diff changeset
358 m_function_mods.last().argument_mods.last().conversion_rules.last().addCode(ch);
e78566595089 initial import
mandel
parents:
diff changeset
359 return true;
e78566595089 initial import
mandel
parents:
diff changeset
360 }
e78566595089 initial import
mandel
parents:
diff changeset
361
e78566595089 initial import
mandel
parents:
diff changeset
362 if (current->parent){
e78566595089 initial import
mandel
parents:
diff changeset
363 if ((current->type & StackElement::CodeSnipMask) != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
364 switch (current->parent->type) {
e78566595089 initial import
mandel
parents:
diff changeset
365 case StackElement::Root:
e78566595089 initial import
mandel
parents:
diff changeset
366 ((TypeSystemTypeEntry *) current->parent->entry)->snips.last().addCode(ch);
e78566595089 initial import
mandel
parents:
diff changeset
367 break;
e78566595089 initial import
mandel
parents:
diff changeset
368 case StackElement::ModifyFunction:
e78566595089 initial import
mandel
parents:
diff changeset
369 m_function_mods.last().snips.last().addCode(ch);
e78566595089 initial import
mandel
parents:
diff changeset
370 break;
e78566595089 initial import
mandel
parents:
diff changeset
371 case StackElement::NamespaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
372 case StackElement::ObjectTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
373 case StackElement::ValueTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
374 case StackElement::InterfaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
375 m_code_snips.last().addCode(ch);
e78566595089 initial import
mandel
parents:
diff changeset
376 break;
e78566595089 initial import
mandel
parents:
diff changeset
377 default:
e78566595089 initial import
mandel
parents:
diff changeset
378 Q_ASSERT(false);
e78566595089 initial import
mandel
parents:
diff changeset
379 };
e78566595089 initial import
mandel
parents:
diff changeset
380 return true;
e78566595089 initial import
mandel
parents:
diff changeset
381 }
e78566595089 initial import
mandel
parents:
diff changeset
382 }
e78566595089 initial import
mandel
parents:
diff changeset
383
e78566595089 initial import
mandel
parents:
diff changeset
384 return true;
e78566595089 initial import
mandel
parents:
diff changeset
385 }
e78566595089 initial import
mandel
parents:
diff changeset
386
e78566595089 initial import
mandel
parents:
diff changeset
387 bool Handler::importFileElement(const QXmlAttributes &atts)
e78566595089 initial import
mandel
parents:
diff changeset
388 {
e78566595089 initial import
mandel
parents:
diff changeset
389 QString fileName = atts.value("name");
e78566595089 initial import
mandel
parents:
diff changeset
390 if(fileName.isEmpty()){
e78566595089 initial import
mandel
parents:
diff changeset
391 m_error = "Required attribute 'name' missing for include-file tag.";
e78566595089 initial import
mandel
parents:
diff changeset
392 return false;
e78566595089 initial import
mandel
parents:
diff changeset
393 }
e78566595089 initial import
mandel
parents:
diff changeset
394
e78566595089 initial import
mandel
parents:
diff changeset
395 QFile file(fileName);
e78566595089 initial import
mandel
parents:
diff changeset
396 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
e78566595089 initial import
mandel
parents:
diff changeset
397 file.setFileName(":/trolltech/generator/" + fileName);
e78566595089 initial import
mandel
parents:
diff changeset
398 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
e78566595089 initial import
mandel
parents:
diff changeset
399 m_error = QString("Could not open file: '%1'").arg(fileName);
e78566595089 initial import
mandel
parents:
diff changeset
400 return false;
e78566595089 initial import
mandel
parents:
diff changeset
401 }
e78566595089 initial import
mandel
parents:
diff changeset
402 }
e78566595089 initial import
mandel
parents:
diff changeset
403
e78566595089 initial import
mandel
parents:
diff changeset
404 QString quoteFrom = atts.value("quote-after-line");
e78566595089 initial import
mandel
parents:
diff changeset
405 bool foundFromOk = quoteFrom.isEmpty();
e78566595089 initial import
mandel
parents:
diff changeset
406 bool from = quoteFrom.isEmpty();
e78566595089 initial import
mandel
parents:
diff changeset
407
e78566595089 initial import
mandel
parents:
diff changeset
408 QString quoteTo = atts.value("quote-before-line");
e78566595089 initial import
mandel
parents:
diff changeset
409 bool foundToOk = quoteTo.isEmpty();
e78566595089 initial import
mandel
parents:
diff changeset
410 bool to = true;
e78566595089 initial import
mandel
parents:
diff changeset
411
e78566595089 initial import
mandel
parents:
diff changeset
412 QTextStream in(&file);
e78566595089 initial import
mandel
parents:
diff changeset
413 while (!in.atEnd()) {
e78566595089 initial import
mandel
parents:
diff changeset
414 QString line = in.readLine();
e78566595089 initial import
mandel
parents:
diff changeset
415 if(from && to && line.contains(quoteTo)) {
e78566595089 initial import
mandel
parents:
diff changeset
416 to = false;
e78566595089 initial import
mandel
parents:
diff changeset
417 foundToOk = true;
e78566595089 initial import
mandel
parents:
diff changeset
418 break;
e78566595089 initial import
mandel
parents:
diff changeset
419 }
e78566595089 initial import
mandel
parents:
diff changeset
420 if(from && to)
e78566595089 initial import
mandel
parents:
diff changeset
421 characters(line + "\n");
e78566595089 initial import
mandel
parents:
diff changeset
422 if(!from && line.contains(quoteFrom)) {
e78566595089 initial import
mandel
parents:
diff changeset
423 from = true;
e78566595089 initial import
mandel
parents:
diff changeset
424 foundFromOk = true;
e78566595089 initial import
mandel
parents:
diff changeset
425 }
e78566595089 initial import
mandel
parents:
diff changeset
426 }
e78566595089 initial import
mandel
parents:
diff changeset
427 if(!foundFromOk || !foundToOk){
e78566595089 initial import
mandel
parents:
diff changeset
428 QString fromError = QString("Could not find quote-after-line='%1' in file '%2'.").arg(quoteFrom).arg(fileName);
e78566595089 initial import
mandel
parents:
diff changeset
429 QString toError = QString("Could not find quote-before-line='%1' in file '%2'.").arg(quoteTo).arg(fileName);
e78566595089 initial import
mandel
parents:
diff changeset
430
e78566595089 initial import
mandel
parents:
diff changeset
431 if(!foundToOk)
e78566595089 initial import
mandel
parents:
diff changeset
432 m_error = toError;
e78566595089 initial import
mandel
parents:
diff changeset
433 if(!foundFromOk)
e78566595089 initial import
mandel
parents:
diff changeset
434 m_error = fromError;
e78566595089 initial import
mandel
parents:
diff changeset
435 if(!foundFromOk && !foundToOk)
e78566595089 initial import
mandel
parents:
diff changeset
436 m_error = fromError + " " + toError;
e78566595089 initial import
mandel
parents:
diff changeset
437 return false;
e78566595089 initial import
mandel
parents:
diff changeset
438 }
e78566595089 initial import
mandel
parents:
diff changeset
439
e78566595089 initial import
mandel
parents:
diff changeset
440 return true;
e78566595089 initial import
mandel
parents:
diff changeset
441 }
e78566595089 initial import
mandel
parents:
diff changeset
442
e78566595089 initial import
mandel
parents:
diff changeset
443 bool Handler::convertBoolean(const QString &_value, const QString &attributeName, bool defaultValue)
e78566595089 initial import
mandel
parents:
diff changeset
444 {
e78566595089 initial import
mandel
parents:
diff changeset
445 QString value = _value.toLower();
e78566595089 initial import
mandel
parents:
diff changeset
446 if (value == "true" || value == "yes") {
e78566595089 initial import
mandel
parents:
diff changeset
447 return true;
e78566595089 initial import
mandel
parents:
diff changeset
448 } else if (value == "false" || value == "no") {
e78566595089 initial import
mandel
parents:
diff changeset
449 return false;
e78566595089 initial import
mandel
parents:
diff changeset
450 } else {
e78566595089 initial import
mandel
parents:
diff changeset
451 QString warn = QString("Boolean value '%1' not supported in attribute '%2'. Use 'yes' or 'no'. Defaulting to '%3'.")
e78566595089 initial import
mandel
parents:
diff changeset
452 .arg(value).arg(attributeName).arg(defaultValue ? "yes" : "no");
e78566595089 initial import
mandel
parents:
diff changeset
453
e78566595089 initial import
mandel
parents:
diff changeset
454 ReportHandler::warning(warn);
e78566595089 initial import
mandel
parents:
diff changeset
455 return defaultValue;
e78566595089 initial import
mandel
parents:
diff changeset
456 }
e78566595089 initial import
mandel
parents:
diff changeset
457 }
e78566595089 initial import
mandel
parents:
diff changeset
458
e78566595089 initial import
mandel
parents:
diff changeset
459 bool Handler::startElement(const QString &, const QString &n,
e78566595089 initial import
mandel
parents:
diff changeset
460 const QString &, const QXmlAttributes &atts)
e78566595089 initial import
mandel
parents:
diff changeset
461 {
e78566595089 initial import
mandel
parents:
diff changeset
462 QString tagName = n.toLower();
e78566595089 initial import
mandel
parents:
diff changeset
463 if(tagName == "import-file"){
e78566595089 initial import
mandel
parents:
diff changeset
464 return importFileElement(atts);
e78566595089 initial import
mandel
parents:
diff changeset
465 }
e78566595089 initial import
mandel
parents:
diff changeset
466
e78566595089 initial import
mandel
parents:
diff changeset
467 StackElement *element = new StackElement(current);
e78566595089 initial import
mandel
parents:
diff changeset
468
e78566595089 initial import
mandel
parents:
diff changeset
469 if (!tagNames.contains(tagName)) {
e78566595089 initial import
mandel
parents:
diff changeset
470 m_error = QString("Unknown tag name: '%1'").arg(tagName);
e78566595089 initial import
mandel
parents:
diff changeset
471 return false;
e78566595089 initial import
mandel
parents:
diff changeset
472 }
e78566595089 initial import
mandel
parents:
diff changeset
473
e78566595089 initial import
mandel
parents:
diff changeset
474 element->type = tagNames[tagName];
e78566595089 initial import
mandel
parents:
diff changeset
475 if (element->type & StackElement::TypeEntryMask) {
e78566595089 initial import
mandel
parents:
diff changeset
476 if (current->type != StackElement::Root) {
e78566595089 initial import
mandel
parents:
diff changeset
477 m_error = "Nested types not supported";
e78566595089 initial import
mandel
parents:
diff changeset
478 return false;
e78566595089 initial import
mandel
parents:
diff changeset
479 }
e78566595089 initial import
mandel
parents:
diff changeset
480
e78566595089 initial import
mandel
parents:
diff changeset
481 QHash<QString, QString> attributes;
e78566595089 initial import
mandel
parents:
diff changeset
482 attributes["name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
483
e78566595089 initial import
mandel
parents:
diff changeset
484 switch (element->type) {
e78566595089 initial import
mandel
parents:
diff changeset
485 case StackElement::PrimitiveTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
486 attributes["java-name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
487 attributes["jni-name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
488 attributes["preferred-conversion"] = "yes";
e78566595089 initial import
mandel
parents:
diff changeset
489 attributes["preferred-java-type"] = "yes";
e78566595089 initial import
mandel
parents:
diff changeset
490 break;
e78566595089 initial import
mandel
parents:
diff changeset
491 case StackElement::EnumTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
492 attributes["flags"] = "no";
e78566595089 initial import
mandel
parents:
diff changeset
493 attributes["upper-bound"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
494 attributes["lower-bound"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
495 attributes["force-integer"] = "no";
e78566595089 initial import
mandel
parents:
diff changeset
496 attributes["extensible"] = "no";
e78566595089 initial import
mandel
parents:
diff changeset
497
e78566595089 initial import
mandel
parents:
diff changeset
498 break;
e78566595089 initial import
mandel
parents:
diff changeset
499
e78566595089 initial import
mandel
parents:
diff changeset
500 case StackElement::ObjectTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
501 case StackElement::ValueTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
502 attributes["force-abstract"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
503 attributes["deprecated"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
504 attributes["wrap"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
505 // fall throooough
e78566595089 initial import
mandel
parents:
diff changeset
506 case StackElement::InterfaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
507 attributes["default-superclass"] = m_defaultSuperclass;
e78566595089 initial import
mandel
parents:
diff changeset
508 attributes["polymorphic-id-expression"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
509 attributes["delete-in-main-thread"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
510 // fall through
e78566595089 initial import
mandel
parents:
diff changeset
511 case StackElement::NamespaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
512 attributes["java-name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
513 attributes["package"] = m_defaultPackage;
e78566595089 initial import
mandel
parents:
diff changeset
514 attributes["expense-cost"] = "1";
e78566595089 initial import
mandel
parents:
diff changeset
515 attributes["expense-limit"] = "none";
e78566595089 initial import
mandel
parents:
diff changeset
516 attributes["polymorphic-base"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
517 attributes["generate"] = QString("yes");
e78566595089 initial import
mandel
parents:
diff changeset
518 attributes["target-type"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
519 attributes["generic-class"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
520 break;
e78566595089 initial import
mandel
parents:
diff changeset
521 default:
e78566595089 initial import
mandel
parents:
diff changeset
522 ; // nada
e78566595089 initial import
mandel
parents:
diff changeset
523 };
e78566595089 initial import
mandel
parents:
diff changeset
524
e78566595089 initial import
mandel
parents:
diff changeset
525 fetchAttributeValues(tagName, atts, &attributes);
e78566595089 initial import
mandel
parents:
diff changeset
526
e78566595089 initial import
mandel
parents:
diff changeset
527 QString name = attributes["name"];
e78566595089 initial import
mandel
parents:
diff changeset
528
e78566595089 initial import
mandel
parents:
diff changeset
529 // We need to be able to have duplicate primitive type entries, or it's not possible to
e78566595089 initial import
mandel
parents:
diff changeset
530 // cover all primitive java types (which we need to do in order to support fake
e78566595089 initial import
mandel
parents:
diff changeset
531 // meta objects)
e78566595089 initial import
mandel
parents:
diff changeset
532 if (element->type != StackElement::PrimitiveTypeEntry) {
e78566595089 initial import
mandel
parents:
diff changeset
533 TypeEntry *tmp = m_database->findType(name);
e78566595089 initial import
mandel
parents:
diff changeset
534 if (tmp != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
535 ReportHandler::warning(QString("Duplicate type entry: '%1'").arg(name));
e78566595089 initial import
mandel
parents:
diff changeset
536 }
e78566595089 initial import
mandel
parents:
diff changeset
537 }
e78566595089 initial import
mandel
parents:
diff changeset
538
e78566595089 initial import
mandel
parents:
diff changeset
539 if (name.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
540 m_error = "no 'name' attribute specified";
e78566595089 initial import
mandel
parents:
diff changeset
541 return false;
e78566595089 initial import
mandel
parents:
diff changeset
542 }
e78566595089 initial import
mandel
parents:
diff changeset
543 switch (element->type) {
e78566595089 initial import
mandel
parents:
diff changeset
544 case StackElement::PrimitiveTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
545 {
e78566595089 initial import
mandel
parents:
diff changeset
546 QString java_name = attributes["java-name"];
e78566595089 initial import
mandel
parents:
diff changeset
547 QString jni_name = attributes["jni-name"];
e78566595089 initial import
mandel
parents:
diff changeset
548 QString preferred_conversion = attributes["preferred-conversion"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
549 QString preferred_java_type = attributes["preferred-java-type"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
550
e78566595089 initial import
mandel
parents:
diff changeset
551 if (java_name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
552 java_name = name;
e78566595089 initial import
mandel
parents:
diff changeset
553 if (jni_name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
554 jni_name = name;
e78566595089 initial import
mandel
parents:
diff changeset
555
e78566595089 initial import
mandel
parents:
diff changeset
556 PrimitiveTypeEntry *type = new PrimitiveTypeEntry(name);
e78566595089 initial import
mandel
parents:
diff changeset
557 type->setCodeGeneration(m_generate);
e78566595089 initial import
mandel
parents:
diff changeset
558 type->setTargetLangName(java_name);
e78566595089 initial import
mandel
parents:
diff changeset
559 type->setJniName(jni_name);
e78566595089 initial import
mandel
parents:
diff changeset
560
e78566595089 initial import
mandel
parents:
diff changeset
561 type->setPreferredConversion(convertBoolean(preferred_conversion, "preferred-conversion", true));
e78566595089 initial import
mandel
parents:
diff changeset
562 type->setPreferredTargetLangType(convertBoolean(preferred_java_type, "preferred-java-type", true));
e78566595089 initial import
mandel
parents:
diff changeset
563
e78566595089 initial import
mandel
parents:
diff changeset
564 element->entry = type;
e78566595089 initial import
mandel
parents:
diff changeset
565 }
e78566595089 initial import
mandel
parents:
diff changeset
566 break;
e78566595089 initial import
mandel
parents:
diff changeset
567 case StackElement::EnumTypeEntry: {
e78566595089 initial import
mandel
parents:
diff changeset
568 QStringList names = name.split(QLatin1String("::"));
e78566595089 initial import
mandel
parents:
diff changeset
569
e78566595089 initial import
mandel
parents:
diff changeset
570 if (names.size() == 1) {
e78566595089 initial import
mandel
parents:
diff changeset
571 m_current_enum = new EnumTypeEntry(QString(), name);
e78566595089 initial import
mandel
parents:
diff changeset
572 }
e78566595089 initial import
mandel
parents:
diff changeset
573 else
e78566595089 initial import
mandel
parents:
diff changeset
574 m_current_enum =
e78566595089 initial import
mandel
parents:
diff changeset
575 new EnumTypeEntry(QStringList(names.mid(0, names.size() - 1)).join("::"),
e78566595089 initial import
mandel
parents:
diff changeset
576 names.last());
e78566595089 initial import
mandel
parents:
diff changeset
577 element->entry = m_current_enum;
e78566595089 initial import
mandel
parents:
diff changeset
578 m_current_enum->setCodeGeneration(m_generate);
e78566595089 initial import
mandel
parents:
diff changeset
579 m_current_enum->setTargetLangPackage(m_defaultPackage);
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
580 //m_current_enum->setDepends(m_defaultDepends); // For enums its not needed?
1
e78566595089 initial import
mandel
parents:
diff changeset
581 m_current_enum->setUpperBound(attributes["upper-bound"]);
e78566595089 initial import
mandel
parents:
diff changeset
582 m_current_enum->setLowerBound(attributes["lower-bound"]);
e78566595089 initial import
mandel
parents:
diff changeset
583 m_current_enum->setForceInteger(convertBoolean(attributes["force-integer"], "force-integer", false));
e78566595089 initial import
mandel
parents:
diff changeset
584 m_current_enum->setExtensible(convertBoolean(attributes["extensible"], "extensible", false));
e78566595089 initial import
mandel
parents:
diff changeset
585
e78566595089 initial import
mandel
parents:
diff changeset
586 // put in the flags parallel...
e78566595089 initial import
mandel
parents:
diff changeset
587 if (!attributes["flags"].isEmpty() && attributes["flags"].toLower() != "no") {
e78566595089 initial import
mandel
parents:
diff changeset
588 FlagsTypeEntry *ftype = new FlagsTypeEntry("QFlags<" + name + ">");
e78566595089 initial import
mandel
parents:
diff changeset
589 ftype->setOriginator(m_current_enum);
e78566595089 initial import
mandel
parents:
diff changeset
590 ftype->setOriginalName(attributes["flags"]);
e78566595089 initial import
mandel
parents:
diff changeset
591 ftype->setCodeGeneration(m_generate);
e78566595089 initial import
mandel
parents:
diff changeset
592 QString n = ftype->originalName();
e78566595089 initial import
mandel
parents:
diff changeset
593
e78566595089 initial import
mandel
parents:
diff changeset
594 QStringList lst = n.split("::");
e78566595089 initial import
mandel
parents:
diff changeset
595 if (QStringList(lst.mid(0, lst.size() - 1)).join("::") != m_current_enum->javaQualifier()) {
e78566595089 initial import
mandel
parents:
diff changeset
596 ReportHandler::warning(QString("enum %1 and flags %2 differ in qualifiers")
e78566595089 initial import
mandel
parents:
diff changeset
597 .arg(m_current_enum->javaQualifier())
e78566595089 initial import
mandel
parents:
diff changeset
598 .arg(lst.at(0)));
e78566595089 initial import
mandel
parents:
diff changeset
599 }
e78566595089 initial import
mandel
parents:
diff changeset
600
e78566595089 initial import
mandel
parents:
diff changeset
601 ftype->setFlagsName(lst.last());
e78566595089 initial import
mandel
parents:
diff changeset
602 m_current_enum->setFlags(ftype);
e78566595089 initial import
mandel
parents:
diff changeset
603
e78566595089 initial import
mandel
parents:
diff changeset
604 m_database->addFlagsType(ftype);
e78566595089 initial import
mandel
parents:
diff changeset
605 m_database->addType(ftype);
e78566595089 initial import
mandel
parents:
diff changeset
606 }
e78566595089 initial import
mandel
parents:
diff changeset
607 }
e78566595089 initial import
mandel
parents:
diff changeset
608 break;
e78566595089 initial import
mandel
parents:
diff changeset
609
e78566595089 initial import
mandel
parents:
diff changeset
610 case StackElement::InterfaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
611 {
e78566595089 initial import
mandel
parents:
diff changeset
612 ObjectTypeEntry *otype = new ObjectTypeEntry(name);
e78566595089 initial import
mandel
parents:
diff changeset
613 QString javaName = attributes["java-name"];
e78566595089 initial import
mandel
parents:
diff changeset
614 if (javaName.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
615 javaName = name;
e78566595089 initial import
mandel
parents:
diff changeset
616 InterfaceTypeEntry *itype =
e78566595089 initial import
mandel
parents:
diff changeset
617 new InterfaceTypeEntry(InterfaceTypeEntry::interfaceName(javaName));
e78566595089 initial import
mandel
parents:
diff changeset
618
e78566595089 initial import
mandel
parents:
diff changeset
619 if (!convertBoolean(attributes["generate"], "generate", true))
e78566595089 initial import
mandel
parents:
diff changeset
620 itype->setCodeGeneration(TypeEntry::GenerateForSubclass);
e78566595089 initial import
mandel
parents:
diff changeset
621 else
e78566595089 initial import
mandel
parents:
diff changeset
622 itype->setCodeGeneration(m_generate);
e78566595089 initial import
mandel
parents:
diff changeset
623 otype->setDesignatedInterface(itype);
e78566595089 initial import
mandel
parents:
diff changeset
624 itype->setOrigin(otype);
e78566595089 initial import
mandel
parents:
diff changeset
625 element->entry = otype;
e78566595089 initial import
mandel
parents:
diff changeset
626 }
e78566595089 initial import
mandel
parents:
diff changeset
627 // fall through
e78566595089 initial import
mandel
parents:
diff changeset
628 case StackElement::NamespaceTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
629 if (element->entry == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
630 element->entry = new NamespaceTypeEntry(name);
e78566595089 initial import
mandel
parents:
diff changeset
631 }
e78566595089 initial import
mandel
parents:
diff changeset
632 // fall through
e78566595089 initial import
mandel
parents:
diff changeset
633 case StackElement::ObjectTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
634 if (element->entry == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
635 element->entry = new ObjectTypeEntry(name);
e78566595089 initial import
mandel
parents:
diff changeset
636 }
e78566595089 initial import
mandel
parents:
diff changeset
637 // fall through
e78566595089 initial import
mandel
parents:
diff changeset
638 case StackElement::ValueTypeEntry:
e78566595089 initial import
mandel
parents:
diff changeset
639 {
e78566595089 initial import
mandel
parents:
diff changeset
640 if (element->entry == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
641 if(name == "QVariant")
e78566595089 initial import
mandel
parents:
diff changeset
642 element->entry = new VariantTypeEntry(name);
e78566595089 initial import
mandel
parents:
diff changeset
643 else
e78566595089 initial import
mandel
parents:
diff changeset
644 element->entry = new ValueTypeEntry(name);
e78566595089 initial import
mandel
parents:
diff changeset
645 }
e78566595089 initial import
mandel
parents:
diff changeset
646
e78566595089 initial import
mandel
parents:
diff changeset
647 ComplexTypeEntry *ctype = static_cast<ComplexTypeEntry *>(element->entry);
e78566595089 initial import
mandel
parents:
diff changeset
648 ctype->setTargetLangPackage(attributes["package"]);
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
649 //ctype->setDepends(m_defaultDepends);
1
e78566595089 initial import
mandel
parents:
diff changeset
650 ctype->setDefaultSuperclass(attributes["default-superclass"]);
e78566595089 initial import
mandel
parents:
diff changeset
651 ctype->setGenericClass(convertBoolean(attributes["generic-class"], "generic-class", false));
e78566595089 initial import
mandel
parents:
diff changeset
652
e78566595089 initial import
mandel
parents:
diff changeset
653 // qtd
e78566595089 initial import
mandel
parents:
diff changeset
654 QString wrap = attributes["wrap"];
e78566595089 initial import
mandel
parents:
diff changeset
655 ctype->setStructInD(wrap == "struct" ? true : false);
e78566595089 initial import
mandel
parents:
diff changeset
656 //
e78566595089 initial import
mandel
parents:
diff changeset
657
e78566595089 initial import
mandel
parents:
diff changeset
658 if (!convertBoolean(attributes["generate"], "generate", true))
e78566595089 initial import
mandel
parents:
diff changeset
659 element->entry->setCodeGeneration(TypeEntry::GenerateForSubclass);
e78566595089 initial import
mandel
parents:
diff changeset
660 else
e78566595089 initial import
mandel
parents:
diff changeset
661 element->entry->setCodeGeneration(m_generate);
e78566595089 initial import
mandel
parents:
diff changeset
662
e78566595089 initial import
mandel
parents:
diff changeset
663 QString javaName = attributes["java-name"];
e78566595089 initial import
mandel
parents:
diff changeset
664 if (!javaName.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
665 ctype->setTargetLangName(javaName);
e78566595089 initial import
mandel
parents:
diff changeset
666
e78566595089 initial import
mandel
parents:
diff changeset
667 // The expense policy
e78566595089 initial import
mandel
parents:
diff changeset
668 QString limit = attributes["expense-limit"];
e78566595089 initial import
mandel
parents:
diff changeset
669 if (!limit.isEmpty() && limit != "none") {
e78566595089 initial import
mandel
parents:
diff changeset
670 ExpensePolicy ep;
e78566595089 initial import
mandel
parents:
diff changeset
671 ep.limit = limit.toInt();
e78566595089 initial import
mandel
parents:
diff changeset
672 ep.cost = attributes["expense-cost"];
e78566595089 initial import
mandel
parents:
diff changeset
673 ctype->setExpensePolicy(ep);
e78566595089 initial import
mandel
parents:
diff changeset
674 }
e78566595089 initial import
mandel
parents:
diff changeset
675
e78566595089 initial import
mandel
parents:
diff changeset
676 ctype->setIsPolymorphicBase(convertBoolean(attributes["polymorphic-base"], "polymorphic-base", false));
e78566595089 initial import
mandel
parents:
diff changeset
677 ctype->setPolymorphicIdValue(attributes["polymorphic-id-expression"]);
e78566595089 initial import
mandel
parents:
diff changeset
678
e78566595089 initial import
mandel
parents:
diff changeset
679 if (element->type == StackElement::ObjectTypeEntry || element->type == StackElement::ValueTypeEntry) {
e78566595089 initial import
mandel
parents:
diff changeset
680 if (convertBoolean(attributes["force-abstract"], "force-abstract", false))
e78566595089 initial import
mandel
parents:
diff changeset
681 ctype->setTypeFlags(ctype->typeFlags() | ComplexTypeEntry::ForceAbstract);
e78566595089 initial import
mandel
parents:
diff changeset
682 if (convertBoolean(attributes["deprecated"], "deprecated", false))
e78566595089 initial import
mandel
parents:
diff changeset
683 ctype->setTypeFlags(ctype->typeFlags() | ComplexTypeEntry::Deprecated);
e78566595089 initial import
mandel
parents:
diff changeset
684 }
e78566595089 initial import
mandel
parents:
diff changeset
685
e78566595089 initial import
mandel
parents:
diff changeset
686 if (element->type == StackElement::InterfaceTypeEntry ||
e78566595089 initial import
mandel
parents:
diff changeset
687 element->type == StackElement::ValueTypeEntry ||
e78566595089 initial import
mandel
parents:
diff changeset
688 element->type == StackElement::ObjectTypeEntry) {
e78566595089 initial import
mandel
parents:
diff changeset
689 if (convertBoolean(attributes["delete-in-main-thread"], "delete-in-main-thread", false))
e78566595089 initial import
mandel
parents:
diff changeset
690 ctype->setTypeFlags(ctype->typeFlags() | ComplexTypeEntry::DeleteInMainThread);
e78566595089 initial import
mandel
parents:
diff changeset
691 }
e78566595089 initial import
mandel
parents:
diff changeset
692
e78566595089 initial import
mandel
parents:
diff changeset
693 QString targetType = attributes["target-type"];
e78566595089 initial import
mandel
parents:
diff changeset
694 if (!targetType.isEmpty() && element->entry->isComplex())
e78566595089 initial import
mandel
parents:
diff changeset
695 static_cast<ComplexTypeEntry *>(element->entry)->setTargetType(targetType);
e78566595089 initial import
mandel
parents:
diff changeset
696
e78566595089 initial import
mandel
parents:
diff changeset
697 // ctype->setInclude(Include(Include::IncludePath, ctype->name()));
e78566595089 initial import
mandel
parents:
diff changeset
698 ctype = ctype->designatedInterface();
e78566595089 initial import
mandel
parents:
diff changeset
699 if (ctype != 0)
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
700 {
1
e78566595089 initial import
mandel
parents:
diff changeset
701 ctype->setTargetLangPackage(attributes["package"]);
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
702 ctype->setDepends(m_defaultDepends);
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
703 }
1
e78566595089 initial import
mandel
parents:
diff changeset
704 }
e78566595089 initial import
mandel
parents:
diff changeset
705 break;
e78566595089 initial import
mandel
parents:
diff changeset
706 default:
e78566595089 initial import
mandel
parents:
diff changeset
707 Q_ASSERT(false);
e78566595089 initial import
mandel
parents:
diff changeset
708 };
e78566595089 initial import
mandel
parents:
diff changeset
709
e78566595089 initial import
mandel
parents:
diff changeset
710 if (element->entry)
e78566595089 initial import
mandel
parents:
diff changeset
711 m_database->addType(element->entry);
e78566595089 initial import
mandel
parents:
diff changeset
712 else
e78566595089 initial import
mandel
parents:
diff changeset
713 ReportHandler::warning(QString("Type: %1 was rejected by typesystem").arg(name));
e78566595089 initial import
mandel
parents:
diff changeset
714
e78566595089 initial import
mandel
parents:
diff changeset
715 } else if (element->type != StackElement::None) {
e78566595089 initial import
mandel
parents:
diff changeset
716 bool topLevel = element->type == StackElement::Root
e78566595089 initial import
mandel
parents:
diff changeset
717 || element->type == StackElement::SuppressedWarning
e78566595089 initial import
mandel
parents:
diff changeset
718 || element->type == StackElement::Rejection
e78566595089 initial import
mandel
parents:
diff changeset
719 || element->type == StackElement::LoadTypesystem
e78566595089 initial import
mandel
parents:
diff changeset
720 || element->type == StackElement::InjectCode
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
721 || element->type == StackElement::Template
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
722 || element->type == StackElement::PackageDepend;
1
e78566595089 initial import
mandel
parents:
diff changeset
723
e78566595089 initial import
mandel
parents:
diff changeset
724 if (!topLevel && current->type == StackElement::Root) {
e78566595089 initial import
mandel
parents:
diff changeset
725 m_error = QString("Tag requires parent: '%1'").arg(tagName);
e78566595089 initial import
mandel
parents:
diff changeset
726 return false;
e78566595089 initial import
mandel
parents:
diff changeset
727 }
e78566595089 initial import
mandel
parents:
diff changeset
728
e78566595089 initial import
mandel
parents:
diff changeset
729 StackElement topElement = current==0 ? StackElement(0) : *current;
e78566595089 initial import
mandel
parents:
diff changeset
730 element->entry = topElement.entry;
e78566595089 initial import
mandel
parents:
diff changeset
731
e78566595089 initial import
mandel
parents:
diff changeset
732 QHash<QString, QString> attributes;
e78566595089 initial import
mandel
parents:
diff changeset
733 switch (element->type) {
e78566595089 initial import
mandel
parents:
diff changeset
734 case StackElement::Root:
e78566595089 initial import
mandel
parents:
diff changeset
735 attributes["package"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
736 attributes["default-superclass"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
737 break;
e78566595089 initial import
mandel
parents:
diff changeset
738 case StackElement::LoadTypesystem:
e78566595089 initial import
mandel
parents:
diff changeset
739 attributes["name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
740 attributes["generate"] = "yes";
e78566595089 initial import
mandel
parents:
diff changeset
741 break;
e78566595089 initial import
mandel
parents:
diff changeset
742 case StackElement::NoNullPointers:
e78566595089 initial import
mandel
parents:
diff changeset
743 attributes["default-value"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
744 break;
e78566595089 initial import
mandel
parents:
diff changeset
745 case StackElement::SuppressedWarning:
e78566595089 initial import
mandel
parents:
diff changeset
746 attributes["text"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
747 break;
e78566595089 initial import
mandel
parents:
diff changeset
748 case StackElement::ReplaceDefaultExpression:
e78566595089 initial import
mandel
parents:
diff changeset
749 attributes["with"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
750 break;
e78566595089 initial import
mandel
parents:
diff changeset
751 case StackElement::DefineOwnership:
e78566595089 initial import
mandel
parents:
diff changeset
752 attributes["class"] = "java";
e78566595089 initial import
mandel
parents:
diff changeset
753 attributes["owner"] = "";
e78566595089 initial import
mandel
parents:
diff changeset
754 break;
e78566595089 initial import
mandel
parents:
diff changeset
755 case StackElement::ModifyFunction:
e78566595089 initial import
mandel
parents:
diff changeset
756 attributes["signature"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
757 attributes["access"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
758 attributes["remove"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
759 attributes["rename"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
760 attributes["deprecated"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
761 attributes["associated-to"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
762 attributes["virtual-slot"] = QString("no");
148
ae34188ddd84 private signals of QAbstractItemModel are now accessible
eldar
parents: 44
diff changeset
763 attributes["allow-as-slot"] = QString("no");
ae34188ddd84 private signals of QAbstractItemModel are now accessible
eldar
parents: 44
diff changeset
764 attributes["private-signal"] = QString("no");
1
e78566595089 initial import
mandel
parents:
diff changeset
765 break;
e78566595089 initial import
mandel
parents:
diff changeset
766 case StackElement::ModifyArgument:
e78566595089 initial import
mandel
parents:
diff changeset
767 attributes["index"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
768 attributes["replace-value"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
769 attributes["invalidate-after-use"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
770 break;
e78566595089 initial import
mandel
parents:
diff changeset
771 case StackElement::ModifyField:
e78566595089 initial import
mandel
parents:
diff changeset
772 attributes["name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
773 attributes["write"] = "true";
e78566595089 initial import
mandel
parents:
diff changeset
774 attributes["read"] = "true";
e78566595089 initial import
mandel
parents:
diff changeset
775 break;
e78566595089 initial import
mandel
parents:
diff changeset
776 case StackElement::Access:
e78566595089 initial import
mandel
parents:
diff changeset
777 attributes["modifier"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
778 break;
e78566595089 initial import
mandel
parents:
diff changeset
779 case StackElement::Include:
e78566595089 initial import
mandel
parents:
diff changeset
780 attributes["file-name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
781 attributes["location"] = QString();
361
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
782 attributes["protection"] = QString();
1
e78566595089 initial import
mandel
parents:
diff changeset
783 break;
e78566595089 initial import
mandel
parents:
diff changeset
784 case StackElement::CustomMetaConstructor:
e78566595089 initial import
mandel
parents:
diff changeset
785 attributes["name"] = topElement.entry->name().toLower() + "_create";
e78566595089 initial import
mandel
parents:
diff changeset
786 attributes["param-name"] = "copy";
e78566595089 initial import
mandel
parents:
diff changeset
787 break;
e78566595089 initial import
mandel
parents:
diff changeset
788 case StackElement::CustomMetaDestructor:
e78566595089 initial import
mandel
parents:
diff changeset
789 attributes["name"] = topElement.entry->name().toLower() + "_delete";
e78566595089 initial import
mandel
parents:
diff changeset
790 attributes["param-name"] = "copy";
e78566595089 initial import
mandel
parents:
diff changeset
791 break;
e78566595089 initial import
mandel
parents:
diff changeset
792 case StackElement::ReplaceType:
e78566595089 initial import
mandel
parents:
diff changeset
793 attributes["modified-type"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
794 break;
e78566595089 initial import
mandel
parents:
diff changeset
795 case StackElement::InjectCode:
e78566595089 initial import
mandel
parents:
diff changeset
796 attributes["class"] = "java";
e78566595089 initial import
mandel
parents:
diff changeset
797 attributes["position"] = "beginning";
e78566595089 initial import
mandel
parents:
diff changeset
798 break;
e78566595089 initial import
mandel
parents:
diff changeset
799 case StackElement::ConversionRule:
e78566595089 initial import
mandel
parents:
diff changeset
800 attributes["class"] = "";
e78566595089 initial import
mandel
parents:
diff changeset
801 break;
e78566595089 initial import
mandel
parents:
diff changeset
802 case StackElement::RejectEnumValue:
e78566595089 initial import
mandel
parents:
diff changeset
803 attributes["name"] = "";
e78566595089 initial import
mandel
parents:
diff changeset
804 break;
e78566595089 initial import
mandel
parents:
diff changeset
805 case StackElement::ArgumentMap:
e78566595089 initial import
mandel
parents:
diff changeset
806 attributes["index"] = "1";
e78566595089 initial import
mandel
parents:
diff changeset
807 attributes["meta-name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
808 break;
e78566595089 initial import
mandel
parents:
diff changeset
809 case StackElement::Rename:
e78566595089 initial import
mandel
parents:
diff changeset
810 attributes["to"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
811 break;
e78566595089 initial import
mandel
parents:
diff changeset
812 case StackElement::Rejection:
e78566595089 initial import
mandel
parents:
diff changeset
813 attributes["class"] = "*";
e78566595089 initial import
mandel
parents:
diff changeset
814 attributes["function-name"] = "*";
e78566595089 initial import
mandel
parents:
diff changeset
815 attributes["field-name"] = "*";
e78566595089 initial import
mandel
parents:
diff changeset
816 attributes["enum-name"] = "*";
e78566595089 initial import
mandel
parents:
diff changeset
817 break;
e78566595089 initial import
mandel
parents:
diff changeset
818 case StackElement::Removal:
e78566595089 initial import
mandel
parents:
diff changeset
819 attributes["class"] = "all";
e78566595089 initial import
mandel
parents:
diff changeset
820 break;
e78566595089 initial import
mandel
parents:
diff changeset
821 case StackElement::Template:
e78566595089 initial import
mandel
parents:
diff changeset
822 attributes["name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
823 break;
e78566595089 initial import
mandel
parents:
diff changeset
824 case StackElement::TemplateInstanceEnum:
e78566595089 initial import
mandel
parents:
diff changeset
825 attributes["name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
826 break;
e78566595089 initial import
mandel
parents:
diff changeset
827 case StackElement::Replace:
e78566595089 initial import
mandel
parents:
diff changeset
828 attributes["from"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
829 attributes["to"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
830 break;
e78566595089 initial import
mandel
parents:
diff changeset
831 case StackElement::ReferenceCount:
e78566595089 initial import
mandel
parents:
diff changeset
832 attributes["action"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
833 attributes["variable-name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
834 attributes["thread-safe"] = QString("no");
e78566595089 initial import
mandel
parents:
diff changeset
835 attributes["declare-variable"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
836 attributes["access"] = QString("private");
e78566595089 initial import
mandel
parents:
diff changeset
837 attributes["conditional"] = QString("");
e78566595089 initial import
mandel
parents:
diff changeset
838 break;
e78566595089 initial import
mandel
parents:
diff changeset
839 // qtd
e78566595089 initial import
mandel
parents:
diff changeset
840 case StackElement::AddClass:
e78566595089 initial import
mandel
parents:
diff changeset
841 attributes["name"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
842 break;
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
843 case StackElement::PackageDepend:
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
844 attributes["package"] = QString();
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
845 break;
1
e78566595089 initial import
mandel
parents:
diff changeset
846 default:
e78566595089 initial import
mandel
parents:
diff changeset
847 ; // nada
e78566595089 initial import
mandel
parents:
diff changeset
848 };
e78566595089 initial import
mandel
parents:
diff changeset
849
e78566595089 initial import
mandel
parents:
diff changeset
850 if (attributes.count() > 0)
e78566595089 initial import
mandel
parents:
diff changeset
851 fetchAttributeValues(tagName, atts, &attributes);
e78566595089 initial import
mandel
parents:
diff changeset
852
e78566595089 initial import
mandel
parents:
diff changeset
853 switch (element->type) {
e78566595089 initial import
mandel
parents:
diff changeset
854 case StackElement::Root:
e78566595089 initial import
mandel
parents:
diff changeset
855 m_defaultPackage = attributes["package"];
e78566595089 initial import
mandel
parents:
diff changeset
856 m_defaultSuperclass = attributes["default-superclass"];
e78566595089 initial import
mandel
parents:
diff changeset
857 element->type = StackElement::Root;
e78566595089 initial import
mandel
parents:
diff changeset
858 element->entry = new TypeSystemTypeEntry(m_defaultPackage);
e78566595089 initial import
mandel
parents:
diff changeset
859 TypeDatabase::instance()->addType(element->entry);
e78566595089 initial import
mandel
parents:
diff changeset
860 break;
e78566595089 initial import
mandel
parents:
diff changeset
861 case StackElement::LoadTypesystem:
e78566595089 initial import
mandel
parents:
diff changeset
862 {
e78566595089 initial import
mandel
parents:
diff changeset
863 QString name = attributes["name"];
e78566595089 initial import
mandel
parents:
diff changeset
864 if (name.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
865 m_error = "No typesystem name specified";
e78566595089 initial import
mandel
parents:
diff changeset
866 return false;
e78566595089 initial import
mandel
parents:
diff changeset
867 }
e78566595089 initial import
mandel
parents:
diff changeset
868
4
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
869 if (!m_database->parseFile(name, m_source_dir, convertBoolean(attributes["generate"], "generate", true))) {
1
e78566595089 initial import
mandel
parents:
diff changeset
870 m_error = QString("Failed to parse: '%1'").arg(name);
e78566595089 initial import
mandel
parents:
diff changeset
871 return false;
e78566595089 initial import
mandel
parents:
diff changeset
872 }
e78566595089 initial import
mandel
parents:
diff changeset
873 }
e78566595089 initial import
mandel
parents:
diff changeset
874 break;
e78566595089 initial import
mandel
parents:
diff changeset
875 case StackElement::RejectEnumValue: {
e78566595089 initial import
mandel
parents:
diff changeset
876 if (!m_current_enum) {
e78566595089 initial import
mandel
parents:
diff changeset
877 m_error = "<reject-enum-value> node must be used inside a <enum-type> node";
e78566595089 initial import
mandel
parents:
diff changeset
878 return false;
e78566595089 initial import
mandel
parents:
diff changeset
879 }
e78566595089 initial import
mandel
parents:
diff changeset
880 QString name = attributes["name"];
e78566595089 initial import
mandel
parents:
diff changeset
881
e78566595089 initial import
mandel
parents:
diff changeset
882 bool added = false;
e78566595089 initial import
mandel
parents:
diff changeset
883 if (!name.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
884 added = true;
e78566595089 initial import
mandel
parents:
diff changeset
885 m_current_enum->addEnumValueRejection(name);
e78566595089 initial import
mandel
parents:
diff changeset
886 }
e78566595089 initial import
mandel
parents:
diff changeset
887
e78566595089 initial import
mandel
parents:
diff changeset
888 } break;
e78566595089 initial import
mandel
parents:
diff changeset
889 case StackElement::ReplaceType:
e78566595089 initial import
mandel
parents:
diff changeset
890 {
e78566595089 initial import
mandel
parents:
diff changeset
891 if (topElement.type != StackElement::ModifyArgument) {
e78566595089 initial import
mandel
parents:
diff changeset
892 m_error = "Type replacement can only be specified for argument modifications";
e78566595089 initial import
mandel
parents:
diff changeset
893 return false;
e78566595089 initial import
mandel
parents:
diff changeset
894 }
e78566595089 initial import
mandel
parents:
diff changeset
895
e78566595089 initial import
mandel
parents:
diff changeset
896 if (attributes["modified-type"].isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
897 m_error = "Type replacement requires 'modified-type' attribute";
e78566595089 initial import
mandel
parents:
diff changeset
898 return false;
e78566595089 initial import
mandel
parents:
diff changeset
899 }
e78566595089 initial import
mandel
parents:
diff changeset
900
e78566595089 initial import
mandel
parents:
diff changeset
901 m_function_mods.last().argument_mods.last().modified_type = attributes["modified-type"];
e78566595089 initial import
mandel
parents:
diff changeset
902 }
e78566595089 initial import
mandel
parents:
diff changeset
903 break;
e78566595089 initial import
mandel
parents:
diff changeset
904 case StackElement::ConversionRule:
e78566595089 initial import
mandel
parents:
diff changeset
905 {
e78566595089 initial import
mandel
parents:
diff changeset
906 if (topElement.type != StackElement::ModifyArgument) {
e78566595089 initial import
mandel
parents:
diff changeset
907 m_error = "Conversion rules can only be specified for argument modification";
e78566595089 initial import
mandel
parents:
diff changeset
908 return false;
e78566595089 initial import
mandel
parents:
diff changeset
909 }
e78566595089 initial import
mandel
parents:
diff changeset
910
e78566595089 initial import
mandel
parents:
diff changeset
911 static QHash<QString, TypeSystem::Language> languageNames;
e78566595089 initial import
mandel
parents:
diff changeset
912 if (languageNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
913 languageNames["native"] = TypeSystem::NativeCode;
e78566595089 initial import
mandel
parents:
diff changeset
914 languageNames["shell"] = TypeSystem::ShellCode;
e78566595089 initial import
mandel
parents:
diff changeset
915 }
e78566595089 initial import
mandel
parents:
diff changeset
916
e78566595089 initial import
mandel
parents:
diff changeset
917 CodeSnip snip;
e78566595089 initial import
mandel
parents:
diff changeset
918 QString languageAttribute = attributes["class"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
919 TypeSystem::Language lang = languageNames.value(languageAttribute, TypeSystem::NoLanguage);
e78566595089 initial import
mandel
parents:
diff changeset
920 if (lang == TypeSystem::NoLanguage) {
e78566595089 initial import
mandel
parents:
diff changeset
921 m_error = QString("unsupported class attribute: '%1'").arg(languageAttribute);
e78566595089 initial import
mandel
parents:
diff changeset
922 return false;
e78566595089 initial import
mandel
parents:
diff changeset
923 }
e78566595089 initial import
mandel
parents:
diff changeset
924
e78566595089 initial import
mandel
parents:
diff changeset
925 snip.language = lang;
e78566595089 initial import
mandel
parents:
diff changeset
926 m_function_mods.last().argument_mods.last().conversion_rules.append(snip);
e78566595089 initial import
mandel
parents:
diff changeset
927 }
e78566595089 initial import
mandel
parents:
diff changeset
928
e78566595089 initial import
mandel
parents:
diff changeset
929 break;
e78566595089 initial import
mandel
parents:
diff changeset
930 case StackElement::StoreResult:
e78566595089 initial import
mandel
parents:
diff changeset
931 {
e78566595089 initial import
mandel
parents:
diff changeset
932 if (topElement.type != StackElement::ModifyFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
933 m_error = QString::fromLatin1("result storage requires function"
e78566595089 initial import
mandel
parents:
diff changeset
934 " modification as parent, was %1")
e78566595089 initial import
mandel
parents:
diff changeset
935 .arg(topElement.type, 0, 16);
e78566595089 initial import
mandel
parents:
diff changeset
936 return false;
e78566595089 initial import
mandel
parents:
diff changeset
937 }
e78566595089 initial import
mandel
parents:
diff changeset
938
e78566595089 initial import
mandel
parents:
diff changeset
939 m_function_mods.last().store_result = true;
e78566595089 initial import
mandel
parents:
diff changeset
940 }
e78566595089 initial import
mandel
parents:
diff changeset
941 break;
e78566595089 initial import
mandel
parents:
diff changeset
942 case StackElement::ModifyArgument:
e78566595089 initial import
mandel
parents:
diff changeset
943 {
e78566595089 initial import
mandel
parents:
diff changeset
944 if (topElement.type != StackElement::ModifyFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
945 m_error = QString::fromLatin1("argument modification requires function"
e78566595089 initial import
mandel
parents:
diff changeset
946 " modification as parent, was %1")
e78566595089 initial import
mandel
parents:
diff changeset
947 .arg(topElement.type, 0, 16);
e78566595089 initial import
mandel
parents:
diff changeset
948 return false;
e78566595089 initial import
mandel
parents:
diff changeset
949 }
e78566595089 initial import
mandel
parents:
diff changeset
950
e78566595089 initial import
mandel
parents:
diff changeset
951 QString index = attributes["index"];
e78566595089 initial import
mandel
parents:
diff changeset
952 if (index == "return")
e78566595089 initial import
mandel
parents:
diff changeset
953 index = "0";
e78566595089 initial import
mandel
parents:
diff changeset
954 else if (index == "this")
e78566595089 initial import
mandel
parents:
diff changeset
955 index = "-1";
e78566595089 initial import
mandel
parents:
diff changeset
956
e78566595089 initial import
mandel
parents:
diff changeset
957 bool ok = false;
e78566595089 initial import
mandel
parents:
diff changeset
958 int idx = index.toInt(&ok);
e78566595089 initial import
mandel
parents:
diff changeset
959 if (!ok) {
e78566595089 initial import
mandel
parents:
diff changeset
960 m_error = QString("Cannot convert '%1' to integer").arg(index);
e78566595089 initial import
mandel
parents:
diff changeset
961 return false;
e78566595089 initial import
mandel
parents:
diff changeset
962 }
e78566595089 initial import
mandel
parents:
diff changeset
963
e78566595089 initial import
mandel
parents:
diff changeset
964 QString replace_value = attributes["replace-value"];
e78566595089 initial import
mandel
parents:
diff changeset
965
e78566595089 initial import
mandel
parents:
diff changeset
966 if (!replace_value.isEmpty() && idx != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
967 m_error = QString("replace-value is only supported for return values (index=0).");
e78566595089 initial import
mandel
parents:
diff changeset
968 return false;
e78566595089 initial import
mandel
parents:
diff changeset
969 }
e78566595089 initial import
mandel
parents:
diff changeset
970
e78566595089 initial import
mandel
parents:
diff changeset
971 ArgumentModification argumentModification = ArgumentModification(idx);
e78566595089 initial import
mandel
parents:
diff changeset
972 argumentModification.replace_value = replace_value;
e78566595089 initial import
mandel
parents:
diff changeset
973 argumentModification.reset_after_use = convertBoolean(attributes["invalidate-after-use"], "invalidate-after-use", false);
e78566595089 initial import
mandel
parents:
diff changeset
974 m_function_mods.last().argument_mods.append(argumentModification);
e78566595089 initial import
mandel
parents:
diff changeset
975 }
e78566595089 initial import
mandel
parents:
diff changeset
976 break;
e78566595089 initial import
mandel
parents:
diff changeset
977 case StackElement::NoNullPointers:
e78566595089 initial import
mandel
parents:
diff changeset
978 {
e78566595089 initial import
mandel
parents:
diff changeset
979 if (topElement.type != StackElement::ModifyArgument) {
e78566595089 initial import
mandel
parents:
diff changeset
980 m_error = "no-null-pointer requires argument modification as parent";
e78566595089 initial import
mandel
parents:
diff changeset
981 return false;
e78566595089 initial import
mandel
parents:
diff changeset
982 }
e78566595089 initial import
mandel
parents:
diff changeset
983
e78566595089 initial import
mandel
parents:
diff changeset
984 m_function_mods.last().argument_mods.last().no_null_pointers = true;
e78566595089 initial import
mandel
parents:
diff changeset
985 if (m_function_mods.last().argument_mods.last().index == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
986 m_function_mods.last().argument_mods.last().null_pointer_default_value = attributes["default-value"];
e78566595089 initial import
mandel
parents:
diff changeset
987 } else if (!attributes["default-value"].isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
988 ReportHandler::warning("default values for null pointer guards are only effective for return values");
e78566595089 initial import
mandel
parents:
diff changeset
989 }
e78566595089 initial import
mandel
parents:
diff changeset
990 }
e78566595089 initial import
mandel
parents:
diff changeset
991 break;
e78566595089 initial import
mandel
parents:
diff changeset
992 case StackElement::DefineOwnership:
e78566595089 initial import
mandel
parents:
diff changeset
993 {
e78566595089 initial import
mandel
parents:
diff changeset
994 if (topElement.type != StackElement::ModifyArgument) {
e78566595089 initial import
mandel
parents:
diff changeset
995 m_error = "define-ownership requires argument modification as parent";
e78566595089 initial import
mandel
parents:
diff changeset
996 return false;
e78566595089 initial import
mandel
parents:
diff changeset
997 }
e78566595089 initial import
mandel
parents:
diff changeset
998
e78566595089 initial import
mandel
parents:
diff changeset
999 static QHash<QString, TypeSystem::Language> languageNames;
e78566595089 initial import
mandel
parents:
diff changeset
1000 if (languageNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1001 languageNames["java"] = TypeSystem::TargetLangCode;
e78566595089 initial import
mandel
parents:
diff changeset
1002 languageNames["shell"] = TypeSystem::ShellCode;
e78566595089 initial import
mandel
parents:
diff changeset
1003 }
e78566595089 initial import
mandel
parents:
diff changeset
1004
e78566595089 initial import
mandel
parents:
diff changeset
1005 QString classAttribute = attributes["class"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1006 TypeSystem::Language lang = languageNames.value(classAttribute, TypeSystem::NoLanguage);
e78566595089 initial import
mandel
parents:
diff changeset
1007 if (lang == TypeSystem::NoLanguage) {
e78566595089 initial import
mandel
parents:
diff changeset
1008 m_error = QString("unsupported class attribute: '%1'").arg(classAttribute);
e78566595089 initial import
mandel
parents:
diff changeset
1009 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1010 }
e78566595089 initial import
mandel
parents:
diff changeset
1011
e78566595089 initial import
mandel
parents:
diff changeset
1012 static QHash<QString, TypeSystem::Ownership> ownershipNames;
e78566595089 initial import
mandel
parents:
diff changeset
1013 if (ownershipNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1014 ownershipNames["java"] = TypeSystem::TargetLangOwnership;
e78566595089 initial import
mandel
parents:
diff changeset
1015 ownershipNames["c++"] = TypeSystem::CppOwnership;
e78566595089 initial import
mandel
parents:
diff changeset
1016 ownershipNames["default"] = TypeSystem::DefaultOwnership;
e78566595089 initial import
mandel
parents:
diff changeset
1017 }
e78566595089 initial import
mandel
parents:
diff changeset
1018
e78566595089 initial import
mandel
parents:
diff changeset
1019 QString ownershipAttribute = attributes["owner"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1020 TypeSystem::Ownership owner = ownershipNames.value(ownershipAttribute, TypeSystem::InvalidOwnership);
e78566595089 initial import
mandel
parents:
diff changeset
1021 if (owner == TypeSystem::InvalidOwnership) {
e78566595089 initial import
mandel
parents:
diff changeset
1022 m_error = QString("unsupported owner attribute: '%1'").arg(ownershipAttribute);
e78566595089 initial import
mandel
parents:
diff changeset
1023 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1024 }
e78566595089 initial import
mandel
parents:
diff changeset
1025
e78566595089 initial import
mandel
parents:
diff changeset
1026 m_function_mods.last().argument_mods.last().ownerships[lang] = owner;
e78566595089 initial import
mandel
parents:
diff changeset
1027 }
e78566595089 initial import
mandel
parents:
diff changeset
1028 break;
e78566595089 initial import
mandel
parents:
diff changeset
1029 case StackElement::SuppressedWarning:
e78566595089 initial import
mandel
parents:
diff changeset
1030 if (attributes["text"].isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
1031 ReportHandler::warning("Suppressed warning with no text specified");
e78566595089 initial import
mandel
parents:
diff changeset
1032 else
e78566595089 initial import
mandel
parents:
diff changeset
1033 m_database->addSuppressedWarning(attributes["text"]);
e78566595089 initial import
mandel
parents:
diff changeset
1034 break;
e78566595089 initial import
mandel
parents:
diff changeset
1035 case StackElement::ArgumentMap:
e78566595089 initial import
mandel
parents:
diff changeset
1036 {
e78566595089 initial import
mandel
parents:
diff changeset
1037 if (!(topElement.type & StackElement::CodeSnipMask)) {
e78566595089 initial import
mandel
parents:
diff changeset
1038 m_error = "Argument maps requires code injection as parent";
e78566595089 initial import
mandel
parents:
diff changeset
1039 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1040 }
e78566595089 initial import
mandel
parents:
diff changeset
1041
e78566595089 initial import
mandel
parents:
diff changeset
1042 bool ok;
e78566595089 initial import
mandel
parents:
diff changeset
1043 int pos = attributes["index"].toInt(&ok);
e78566595089 initial import
mandel
parents:
diff changeset
1044 if (!ok) {
e78566595089 initial import
mandel
parents:
diff changeset
1045 m_error = QString("Can't convert position '%1' to integer")
e78566595089 initial import
mandel
parents:
diff changeset
1046 .arg(attributes["position"]);
e78566595089 initial import
mandel
parents:
diff changeset
1047 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1048 }
e78566595089 initial import
mandel
parents:
diff changeset
1049
e78566595089 initial import
mandel
parents:
diff changeset
1050 if (pos <= 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1051 m_error = QString("Argument position %1 must be a positive number").arg(pos);
e78566595089 initial import
mandel
parents:
diff changeset
1052 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1053 }
e78566595089 initial import
mandel
parents:
diff changeset
1054
e78566595089 initial import
mandel
parents:
diff changeset
1055 QString meta_name = attributes["meta-name"];
e78566595089 initial import
mandel
parents:
diff changeset
1056 if (meta_name.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1057 ReportHandler::warning("Empty meta name in argument map");
e78566595089 initial import
mandel
parents:
diff changeset
1058 }
e78566595089 initial import
mandel
parents:
diff changeset
1059
e78566595089 initial import
mandel
parents:
diff changeset
1060 if (topElement.type == StackElement::InjectCodeInFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
1061 m_function_mods.last().snips.last().argumentMap[pos] = meta_name;
e78566595089 initial import
mandel
parents:
diff changeset
1062 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1063 ReportHandler::warning("Argument maps are only useful for injection of code "
e78566595089 initial import
mandel
parents:
diff changeset
1064 "into functions.");
e78566595089 initial import
mandel
parents:
diff changeset
1065 }
e78566595089 initial import
mandel
parents:
diff changeset
1066 }
e78566595089 initial import
mandel
parents:
diff changeset
1067 break;
e78566595089 initial import
mandel
parents:
diff changeset
1068 case StackElement::Removal:
e78566595089 initial import
mandel
parents:
diff changeset
1069 {
e78566595089 initial import
mandel
parents:
diff changeset
1070 if (topElement.type != StackElement::ModifyFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
1071 m_error = "Function modification parent required";
e78566595089 initial import
mandel
parents:
diff changeset
1072 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1073 }
e78566595089 initial import
mandel
parents:
diff changeset
1074
e78566595089 initial import
mandel
parents:
diff changeset
1075 static QHash<QString, TypeSystem::Language> languageNames;
e78566595089 initial import
mandel
parents:
diff changeset
1076 if (languageNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1077 languageNames["java"] = TypeSystem::TargetLangAndNativeCode;
e78566595089 initial import
mandel
parents:
diff changeset
1078 languageNames["all"] = TypeSystem::All;
e78566595089 initial import
mandel
parents:
diff changeset
1079 }
e78566595089 initial import
mandel
parents:
diff changeset
1080
e78566595089 initial import
mandel
parents:
diff changeset
1081 QString languageAttribute = attributes["class"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1082 TypeSystem::Language lang = languageNames.value(languageAttribute, TypeSystem::NoLanguage);
e78566595089 initial import
mandel
parents:
diff changeset
1083 if (lang == TypeSystem::NoLanguage) {
e78566595089 initial import
mandel
parents:
diff changeset
1084 m_error = QString("unsupported class attribute: '%1'").arg(languageAttribute);
e78566595089 initial import
mandel
parents:
diff changeset
1085 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1086 }
e78566595089 initial import
mandel
parents:
diff changeset
1087
e78566595089 initial import
mandel
parents:
diff changeset
1088 m_function_mods.last().removal = lang;
e78566595089 initial import
mandel
parents:
diff changeset
1089 }
e78566595089 initial import
mandel
parents:
diff changeset
1090 break;
e78566595089 initial import
mandel
parents:
diff changeset
1091 case StackElement::Rename:
e78566595089 initial import
mandel
parents:
diff changeset
1092 case StackElement::Access:
e78566595089 initial import
mandel
parents:
diff changeset
1093 {
e78566595089 initial import
mandel
parents:
diff changeset
1094 if (topElement.type != StackElement::ModifyField
e78566595089 initial import
mandel
parents:
diff changeset
1095 && topElement.type != StackElement::ModifyFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
1096 m_error = "Function or field modification parent required";
e78566595089 initial import
mandel
parents:
diff changeset
1097 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1098 }
e78566595089 initial import
mandel
parents:
diff changeset
1099
e78566595089 initial import
mandel
parents:
diff changeset
1100 Modification *mod = 0;
e78566595089 initial import
mandel
parents:
diff changeset
1101 if (topElement.type == StackElement::ModifyFunction)
e78566595089 initial import
mandel
parents:
diff changeset
1102 mod = &m_function_mods.last();
e78566595089 initial import
mandel
parents:
diff changeset
1103 else
e78566595089 initial import
mandel
parents:
diff changeset
1104 mod = &m_field_mods.last();
e78566595089 initial import
mandel
parents:
diff changeset
1105
e78566595089 initial import
mandel
parents:
diff changeset
1106 QString modifier;
e78566595089 initial import
mandel
parents:
diff changeset
1107 if (element->type == StackElement::Rename) {
e78566595089 initial import
mandel
parents:
diff changeset
1108 modifier = "rename";
e78566595089 initial import
mandel
parents:
diff changeset
1109 QString renamed_to = attributes["to"];
e78566595089 initial import
mandel
parents:
diff changeset
1110 if (renamed_to.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1111 m_error = "Rename modifier requires 'to' attribute";
e78566595089 initial import
mandel
parents:
diff changeset
1112 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1113 }
e78566595089 initial import
mandel
parents:
diff changeset
1114
e78566595089 initial import
mandel
parents:
diff changeset
1115 if (topElement.type == StackElement::ModifyFunction)
e78566595089 initial import
mandel
parents:
diff changeset
1116 mod->setRenamedTo(renamed_to);
e78566595089 initial import
mandel
parents:
diff changeset
1117 else
e78566595089 initial import
mandel
parents:
diff changeset
1118 mod->setRenamedTo(renamed_to);
e78566595089 initial import
mandel
parents:
diff changeset
1119 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1120 modifier = attributes["modifier"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1121 }
e78566595089 initial import
mandel
parents:
diff changeset
1122
e78566595089 initial import
mandel
parents:
diff changeset
1123 if (modifier.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1124 m_error = "No access modification specified";
e78566595089 initial import
mandel
parents:
diff changeset
1125 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1126 }
e78566595089 initial import
mandel
parents:
diff changeset
1127
e78566595089 initial import
mandel
parents:
diff changeset
1128 static QHash<QString, FunctionModification::Modifiers> modifierNames;
e78566595089 initial import
mandel
parents:
diff changeset
1129 if (modifierNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1130 modifierNames["private"] = Modification::Private;
e78566595089 initial import
mandel
parents:
diff changeset
1131 modifierNames["public"] = Modification::Public;
e78566595089 initial import
mandel
parents:
diff changeset
1132 modifierNames["protected"] = Modification::Protected;
e78566595089 initial import
mandel
parents:
diff changeset
1133 modifierNames["friendly"] = Modification::Friendly;
e78566595089 initial import
mandel
parents:
diff changeset
1134 modifierNames["rename"] = Modification::Rename;
e78566595089 initial import
mandel
parents:
diff changeset
1135 modifierNames["final"] = Modification::Final;
e78566595089 initial import
mandel
parents:
diff changeset
1136 modifierNames["non-final"] = Modification::NonFinal;
e78566595089 initial import
mandel
parents:
diff changeset
1137 }
e78566595089 initial import
mandel
parents:
diff changeset
1138
e78566595089 initial import
mandel
parents:
diff changeset
1139 if (!modifierNames.contains(modifier)) {
e78566595089 initial import
mandel
parents:
diff changeset
1140 m_error = QString("Unknown access modifier: '%1'").arg(modifier);
e78566595089 initial import
mandel
parents:
diff changeset
1141 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1142 }
e78566595089 initial import
mandel
parents:
diff changeset
1143
e78566595089 initial import
mandel
parents:
diff changeset
1144 mod->modifiers |= modifierNames[modifier];
e78566595089 initial import
mandel
parents:
diff changeset
1145 }
e78566595089 initial import
mandel
parents:
diff changeset
1146 break;
e78566595089 initial import
mandel
parents:
diff changeset
1147 case StackElement::RemoveArgument:
e78566595089 initial import
mandel
parents:
diff changeset
1148 if (topElement.type != StackElement::ModifyArgument) {
e78566595089 initial import
mandel
parents:
diff changeset
1149 m_error = "Removing argument requires argument modification as parent";
e78566595089 initial import
mandel
parents:
diff changeset
1150 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1151 }
e78566595089 initial import
mandel
parents:
diff changeset
1152
e78566595089 initial import
mandel
parents:
diff changeset
1153 m_function_mods.last().argument_mods.last().removed = true;
e78566595089 initial import
mandel
parents:
diff changeset
1154
e78566595089 initial import
mandel
parents:
diff changeset
1155 break;
e78566595089 initial import
mandel
parents:
diff changeset
1156
e78566595089 initial import
mandel
parents:
diff changeset
1157 case StackElement::ModifyField:
e78566595089 initial import
mandel
parents:
diff changeset
1158 {
e78566595089 initial import
mandel
parents:
diff changeset
1159 QString name = attributes["name"];
e78566595089 initial import
mandel
parents:
diff changeset
1160 if (name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
1161 break;
e78566595089 initial import
mandel
parents:
diff changeset
1162 FieldModification fm;
e78566595089 initial import
mandel
parents:
diff changeset
1163 fm.name = name;
e78566595089 initial import
mandel
parents:
diff changeset
1164 fm.modifiers = 0;
e78566595089 initial import
mandel
parents:
diff changeset
1165
e78566595089 initial import
mandel
parents:
diff changeset
1166 QString read = attributes["read"];
e78566595089 initial import
mandel
parents:
diff changeset
1167 QString write = attributes["write"];
e78566595089 initial import
mandel
parents:
diff changeset
1168
e78566595089 initial import
mandel
parents:
diff changeset
1169 if (read == "true") fm.modifiers |= FieldModification::Readable;
e78566595089 initial import
mandel
parents:
diff changeset
1170 if (write == "true") fm.modifiers |= FieldModification::Writable;
e78566595089 initial import
mandel
parents:
diff changeset
1171
e78566595089 initial import
mandel
parents:
diff changeset
1172 m_field_mods << fm;
e78566595089 initial import
mandel
parents:
diff changeset
1173 }
e78566595089 initial import
mandel
parents:
diff changeset
1174 break;
e78566595089 initial import
mandel
parents:
diff changeset
1175 case StackElement::AddClass: // qtd - fully :)
e78566595089 initial import
mandel
parents:
diff changeset
1176 {
e78566595089 initial import
mandel
parents:
diff changeset
1177 if (!(topElement.type & StackElement::ComplexTypeEntryMask)) {
e78566595089 initial import
mandel
parents:
diff changeset
1178 m_error = QString::fromLatin1("Add class to module requires complex type as parent"
e78566595089 initial import
mandel
parents:
diff changeset
1179 ", was=%1").arg(topElement.type, 0, 16);
e78566595089 initial import
mandel
parents:
diff changeset
1180 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1181 }
e78566595089 initial import
mandel
parents:
diff changeset
1182 QString class_name = attributes["name"];
e78566595089 initial import
mandel
parents:
diff changeset
1183 ComplexTypeEntry *ctype = static_cast<ComplexTypeEntry *>(topElement.entry);
e78566595089 initial import
mandel
parents:
diff changeset
1184 if(!class_name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
1185 ctype->includedClasses << class_name;
e78566595089 initial import
mandel
parents:
diff changeset
1186 }
e78566595089 initial import
mandel
parents:
diff changeset
1187 break;
e78566595089 initial import
mandel
parents:
diff changeset
1188 case StackElement::ModifyFunction:
e78566595089 initial import
mandel
parents:
diff changeset
1189 {
e78566595089 initial import
mandel
parents:
diff changeset
1190 if (!(topElement.type & StackElement::ComplexTypeEntryMask)) {
e78566595089 initial import
mandel
parents:
diff changeset
1191 m_error = QString::fromLatin1("Modify function requires complex type as parent"
e78566595089 initial import
mandel
parents:
diff changeset
1192 ", was=%1").arg(topElement.type, 0, 16);
e78566595089 initial import
mandel
parents:
diff changeset
1193 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1194 }
e78566595089 initial import
mandel
parents:
diff changeset
1195 QString signature = attributes["signature"];
e78566595089 initial import
mandel
parents:
diff changeset
1196
e78566595089 initial import
mandel
parents:
diff changeset
1197 signature = QMetaObject::normalizedSignature(signature.toLocal8Bit().constData());
e78566595089 initial import
mandel
parents:
diff changeset
1198 if (signature.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1199 m_error = "No signature for modified function";
e78566595089 initial import
mandel
parents:
diff changeset
1200 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1201 }
e78566595089 initial import
mandel
parents:
diff changeset
1202
e78566595089 initial import
mandel
parents:
diff changeset
1203 FunctionModification mod;
e78566595089 initial import
mandel
parents:
diff changeset
1204 mod.signature = signature;
e78566595089 initial import
mandel
parents:
diff changeset
1205
e78566595089 initial import
mandel
parents:
diff changeset
1206 QString access = attributes["access"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1207 if (!access.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1208 if (access == QLatin1String("private"))
e78566595089 initial import
mandel
parents:
diff changeset
1209 mod.modifiers |= Modification::Private;
e78566595089 initial import
mandel
parents:
diff changeset
1210 else if (access == QLatin1String("protected"))
e78566595089 initial import
mandel
parents:
diff changeset
1211 mod.modifiers |= Modification::Protected;
e78566595089 initial import
mandel
parents:
diff changeset
1212 else if (access == QLatin1String("public"))
e78566595089 initial import
mandel
parents:
diff changeset
1213 mod.modifiers |= Modification::Public;
e78566595089 initial import
mandel
parents:
diff changeset
1214 else if (access == QLatin1String("final"))
e78566595089 initial import
mandel
parents:
diff changeset
1215 mod.modifiers |= Modification::Final;
e78566595089 initial import
mandel
parents:
diff changeset
1216 else if (access == QLatin1String("non-final"))
e78566595089 initial import
mandel
parents:
diff changeset
1217 mod.modifiers |= Modification::NonFinal;
e78566595089 initial import
mandel
parents:
diff changeset
1218 else {
e78566595089 initial import
mandel
parents:
diff changeset
1219 m_error = QString::fromLatin1("Bad access type '%1'").arg(access);
e78566595089 initial import
mandel
parents:
diff changeset
1220 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1221 }
e78566595089 initial import
mandel
parents:
diff changeset
1222 }
e78566595089 initial import
mandel
parents:
diff changeset
1223
e78566595089 initial import
mandel
parents:
diff changeset
1224 if (convertBoolean(attributes["deprecated"], "deprecated", false)) {
e78566595089 initial import
mandel
parents:
diff changeset
1225 mod.modifiers |= Modification::Deprecated;
e78566595089 initial import
mandel
parents:
diff changeset
1226 }
e78566595089 initial import
mandel
parents:
diff changeset
1227
e78566595089 initial import
mandel
parents:
diff changeset
1228 QString remove = attributes["remove"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1229 if (!remove.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1230 if (remove == QLatin1String("all"))
e78566595089 initial import
mandel
parents:
diff changeset
1231 mod.removal = TypeSystem::All;
e78566595089 initial import
mandel
parents:
diff changeset
1232 else if (remove == QLatin1String("java"))
e78566595089 initial import
mandel
parents:
diff changeset
1233 mod.removal = TypeSystem::TargetLangAndNativeCode;
e78566595089 initial import
mandel
parents:
diff changeset
1234 else {
e78566595089 initial import
mandel
parents:
diff changeset
1235 m_error = QString::fromLatin1("Bad removal type '%1'").arg(remove);
e78566595089 initial import
mandel
parents:
diff changeset
1236 return false;
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 QString rename = attributes["rename"];
e78566595089 initial import
mandel
parents:
diff changeset
1241 if (!rename.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1242 mod.renamedToName = rename;
e78566595089 initial import
mandel
parents:
diff changeset
1243 mod.modifiers |= Modification::Rename;
e78566595089 initial import
mandel
parents:
diff changeset
1244 }
e78566595089 initial import
mandel
parents:
diff changeset
1245
e78566595089 initial import
mandel
parents:
diff changeset
1246 QString association = attributes["associated-to"];
e78566595089 initial import
mandel
parents:
diff changeset
1247 if (!association.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
1248 mod.association = association;
e78566595089 initial import
mandel
parents:
diff changeset
1249
e78566595089 initial import
mandel
parents:
diff changeset
1250 mod.modifiers |= (convertBoolean(attributes["virtual-slot"], "virtual-slot", false) ? Modification::VirtualSlot : 0);
148
ae34188ddd84 private signals of QAbstractItemModel are now accessible
eldar
parents: 44
diff changeset
1251 mod.modifiers |= (convertBoolean(attributes["allow-as-slot"], "allow-as-slot", false) ? Modification::AllowAsSlot : 0);
ae34188ddd84 private signals of QAbstractItemModel are now accessible
eldar
parents: 44
diff changeset
1252 mod.modifiers |= (convertBoolean(attributes["private-signal"], "private-signal", false) ? Modification::PrivateSignal : 0);
1
e78566595089 initial import
mandel
parents:
diff changeset
1253
e78566595089 initial import
mandel
parents:
diff changeset
1254 m_function_mods << mod;
e78566595089 initial import
mandel
parents:
diff changeset
1255 }
e78566595089 initial import
mandel
parents:
diff changeset
1256 break;
e78566595089 initial import
mandel
parents:
diff changeset
1257 case StackElement::ReplaceDefaultExpression:
e78566595089 initial import
mandel
parents:
diff changeset
1258 if (!(topElement.type & StackElement::ModifyArgument)) {
e78566595089 initial import
mandel
parents:
diff changeset
1259 m_error = "Replace default expression only allowed as child of argument modification";
e78566595089 initial import
mandel
parents:
diff changeset
1260 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1261 }
e78566595089 initial import
mandel
parents:
diff changeset
1262
e78566595089 initial import
mandel
parents:
diff changeset
1263 if (attributes["with"].isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1264 m_error = "Default expression replaced with empty string. Use remove-default-expression instead.";
e78566595089 initial import
mandel
parents:
diff changeset
1265 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1266 }
e78566595089 initial import
mandel
parents:
diff changeset
1267
e78566595089 initial import
mandel
parents:
diff changeset
1268 m_function_mods.last().argument_mods.last().replaced_default_expression = attributes["with"];
e78566595089 initial import
mandel
parents:
diff changeset
1269 break;
e78566595089 initial import
mandel
parents:
diff changeset
1270 case StackElement::RemoveDefaultExpression:
e78566595089 initial import
mandel
parents:
diff changeset
1271 m_function_mods.last().argument_mods.last().removed_default_expression = true;
e78566595089 initial import
mandel
parents:
diff changeset
1272 break;
e78566595089 initial import
mandel
parents:
diff changeset
1273 case StackElement::CustomMetaConstructor:
e78566595089 initial import
mandel
parents:
diff changeset
1274 case StackElement::CustomMetaDestructor:
e78566595089 initial import
mandel
parents:
diff changeset
1275 {
e78566595089 initial import
mandel
parents:
diff changeset
1276 CustomFunction *func = new CustomFunction(attributes["name"]);
e78566595089 initial import
mandel
parents:
diff changeset
1277 func->param_name = attributes["param-name"];
e78566595089 initial import
mandel
parents:
diff changeset
1278 element->value.customFunction = func;
e78566595089 initial import
mandel
parents:
diff changeset
1279 }
e78566595089 initial import
mandel
parents:
diff changeset
1280 break;
e78566595089 initial import
mandel
parents:
diff changeset
1281 case StackElement::ReferenceCount:
e78566595089 initial import
mandel
parents:
diff changeset
1282 {
e78566595089 initial import
mandel
parents:
diff changeset
1283 if (topElement.type != StackElement::ModifyArgument) {
e78566595089 initial import
mandel
parents:
diff changeset
1284 m_error = "reference-count must be child of modify-argument";
e78566595089 initial import
mandel
parents:
diff changeset
1285 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1286 }
e78566595089 initial import
mandel
parents:
diff changeset
1287
e78566595089 initial import
mandel
parents:
diff changeset
1288 ReferenceCount rc;
e78566595089 initial import
mandel
parents:
diff changeset
1289 rc.threadSafe = convertBoolean(attributes["thread-safe"], "thread-safe", false);
e78566595089 initial import
mandel
parents:
diff changeset
1290
e78566595089 initial import
mandel
parents:
diff changeset
1291 static QHash<QString, ReferenceCount::Action> actions;
e78566595089 initial import
mandel
parents:
diff changeset
1292 if (actions.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1293 actions["add"] = ReferenceCount::Add;
e78566595089 initial import
mandel
parents:
diff changeset
1294 actions["add-all"] = ReferenceCount::AddAll;
e78566595089 initial import
mandel
parents:
diff changeset
1295 actions["remove"] = ReferenceCount::Remove;
e78566595089 initial import
mandel
parents:
diff changeset
1296 actions["set"] = ReferenceCount::Set;
e78566595089 initial import
mandel
parents:
diff changeset
1297 actions["ignore"] = ReferenceCount::Ignore;
e78566595089 initial import
mandel
parents:
diff changeset
1298 }
e78566595089 initial import
mandel
parents:
diff changeset
1299 rc.action = actions.value(attributes["action"].toLower(), ReferenceCount::Invalid);
e78566595089 initial import
mandel
parents:
diff changeset
1300
e78566595089 initial import
mandel
parents:
diff changeset
1301 rc.variableName = attributes["variable-name"];
e78566595089 initial import
mandel
parents:
diff changeset
1302 if (rc.action != ReferenceCount::Ignore && rc.variableName.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1303 m_error = "variable-name attribute must be specified";
e78566595089 initial import
mandel
parents:
diff changeset
1304 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1305 }
e78566595089 initial import
mandel
parents:
diff changeset
1306
e78566595089 initial import
mandel
parents:
diff changeset
1307 rc.declareVariable = attributes["declare-variable"];
e78566595089 initial import
mandel
parents:
diff changeset
1308 rc.conditional = attributes["conditional"];
e78566595089 initial import
mandel
parents:
diff changeset
1309
e78566595089 initial import
mandel
parents:
diff changeset
1310 static QHash<QString, int> accessRights;
e78566595089 initial import
mandel
parents:
diff changeset
1311 if (accessRights.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1312 accessRights["private"] = ReferenceCount::Private;
e78566595089 initial import
mandel
parents:
diff changeset
1313 accessRights["public"] = ReferenceCount::Public;
e78566595089 initial import
mandel
parents:
diff changeset
1314 accessRights["protected"] = ReferenceCount::Protected;
e78566595089 initial import
mandel
parents:
diff changeset
1315 accessRights["friendly"] = ReferenceCount::Friendly;
e78566595089 initial import
mandel
parents:
diff changeset
1316 }
e78566595089 initial import
mandel
parents:
diff changeset
1317 rc.access = accessRights.value(attributes["access"].toLower(), 0);
e78566595089 initial import
mandel
parents:
diff changeset
1318 if (rc.access == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1319 m_error = "unrecognized access value: " + attributes["access"];
e78566595089 initial import
mandel
parents:
diff changeset
1320 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1321 }
e78566595089 initial import
mandel
parents:
diff changeset
1322
e78566595089 initial import
mandel
parents:
diff changeset
1323 if (rc.action == ReferenceCount::Invalid) {
e78566595089 initial import
mandel
parents:
diff changeset
1324 m_error = "unrecognized value for action attribute. supported actions:";
e78566595089 initial import
mandel
parents:
diff changeset
1325 foreach (QString action, actions.keys())
e78566595089 initial import
mandel
parents:
diff changeset
1326 m_error += " " + action;
e78566595089 initial import
mandel
parents:
diff changeset
1327 }
e78566595089 initial import
mandel
parents:
diff changeset
1328
e78566595089 initial import
mandel
parents:
diff changeset
1329 m_function_mods.last().argument_mods.last().referenceCounts.append(rc);
e78566595089 initial import
mandel
parents:
diff changeset
1330 }
e78566595089 initial import
mandel
parents:
diff changeset
1331 break;
e78566595089 initial import
mandel
parents:
diff changeset
1332 case StackElement::InjectCode:
e78566595089 initial import
mandel
parents:
diff changeset
1333 {
e78566595089 initial import
mandel
parents:
diff changeset
1334 if (((topElement.type & StackElement::ComplexTypeEntryMask) == 0)
e78566595089 initial import
mandel
parents:
diff changeset
1335 && (topElement.type != StackElement::ModifyFunction)
e78566595089 initial import
mandel
parents:
diff changeset
1336 && (topElement.type != StackElement::Root)) {
e78566595089 initial import
mandel
parents:
diff changeset
1337 m_error = "wrong parent type for code injection";
e78566595089 initial import
mandel
parents:
diff changeset
1338 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1339 }
e78566595089 initial import
mandel
parents:
diff changeset
1340
e78566595089 initial import
mandel
parents:
diff changeset
1341 static QHash<QString, TypeSystem::Language> languageNames;
e78566595089 initial import
mandel
parents:
diff changeset
1342 if (languageNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1343 languageNames["java"] = TypeSystem::TargetLangCode;
14
5015aede8edd insert() for QPolygons
eldar
parents: 4
diff changeset
1344 languageNames["java-free"] = TypeSystem::TargetLangFreeCode;
1
e78566595089 initial import
mandel
parents:
diff changeset
1345 languageNames["native"] = TypeSystem::NativeCode;
e78566595089 initial import
mandel
parents:
diff changeset
1346 languageNames["shell"] = TypeSystem::ShellCode;
e78566595089 initial import
mandel
parents:
diff changeset
1347 languageNames["shell-declaration"] = TypeSystem::ShellDeclaration;
e78566595089 initial import
mandel
parents:
diff changeset
1348 languageNames["library-initializer"] = TypeSystem::PackageInitializer;
e78566595089 initial import
mandel
parents:
diff changeset
1349 languageNames["destructor-function"] = TypeSystem::DestructorFunction;
e78566595089 initial import
mandel
parents:
diff changeset
1350 languageNames["constructors"] = TypeSystem::Constructors;
e78566595089 initial import
mandel
parents:
diff changeset
1351 languageNames["interface"] = TypeSystem::Interface;
e78566595089 initial import
mandel
parents:
diff changeset
1352 }
e78566595089 initial import
mandel
parents:
diff changeset
1353
e78566595089 initial import
mandel
parents:
diff changeset
1354 QString className = attributes["class"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1355 if (!languageNames.contains(className)) {
e78566595089 initial import
mandel
parents:
diff changeset
1356 m_error = QString("Invalid class specifier: '%1'").arg(className);
e78566595089 initial import
mandel
parents:
diff changeset
1357 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1358 }
e78566595089 initial import
mandel
parents:
diff changeset
1359
e78566595089 initial import
mandel
parents:
diff changeset
1360
e78566595089 initial import
mandel
parents:
diff changeset
1361 static QHash<QString, CodeSnip::Position> positionNames;
e78566595089 initial import
mandel
parents:
diff changeset
1362 if (positionNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1363 positionNames["beginning"] = CodeSnip::Beginning;
e78566595089 initial import
mandel
parents:
diff changeset
1364 positionNames["end"] = CodeSnip::End;
e78566595089 initial import
mandel
parents:
diff changeset
1365 }
e78566595089 initial import
mandel
parents:
diff changeset
1366
e78566595089 initial import
mandel
parents:
diff changeset
1367 QString position = attributes["position"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1368 if (!positionNames.contains(position)) {
e78566595089 initial import
mandel
parents:
diff changeset
1369 m_error = QString("Invalid position: '%1'").arg(position);
e78566595089 initial import
mandel
parents:
diff changeset
1370 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1371 }
e78566595089 initial import
mandel
parents:
diff changeset
1372
e78566595089 initial import
mandel
parents:
diff changeset
1373 CodeSnip snip;
e78566595089 initial import
mandel
parents:
diff changeset
1374 snip.language = languageNames[className];
e78566595089 initial import
mandel
parents:
diff changeset
1375 snip.position = positionNames[position];
e78566595089 initial import
mandel
parents:
diff changeset
1376
e78566595089 initial import
mandel
parents:
diff changeset
1377 if (snip.language == TypeSystem::Interface && topElement.type != StackElement::InterfaceTypeEntry) {
e78566595089 initial import
mandel
parents:
diff changeset
1378 m_error = "Interface code injections must be direct child of an interface type entry";
e78566595089 initial import
mandel
parents:
diff changeset
1379 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1380 }
e78566595089 initial import
mandel
parents:
diff changeset
1381
e78566595089 initial import
mandel
parents:
diff changeset
1382 if (topElement.type == StackElement::ModifyFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
1383 FunctionModification mod = m_function_mods.last();
e78566595089 initial import
mandel
parents:
diff changeset
1384 if (snip.language == TypeSystem::ShellDeclaration) {
e78566595089 initial import
mandel
parents:
diff changeset
1385 m_error = "no function implementation in shell declaration in which to inject code";
e78566595089 initial import
mandel
parents:
diff changeset
1386 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1387 }
e78566595089 initial import
mandel
parents:
diff changeset
1388
e78566595089 initial import
mandel
parents:
diff changeset
1389 m_function_mods.last().snips << snip;
e78566595089 initial import
mandel
parents:
diff changeset
1390 element->type = StackElement::InjectCodeInFunction;
e78566595089 initial import
mandel
parents:
diff changeset
1391 } else if (topElement.type == StackElement::Root) {
e78566595089 initial import
mandel
parents:
diff changeset
1392 ((TypeSystemTypeEntry *) element->entry)->snips << snip;
e78566595089 initial import
mandel
parents:
diff changeset
1393
e78566595089 initial import
mandel
parents:
diff changeset
1394 } else if (topElement.type != StackElement::Root) {
e78566595089 initial import
mandel
parents:
diff changeset
1395 m_code_snips << snip;
e78566595089 initial import
mandel
parents:
diff changeset
1396 }
e78566595089 initial import
mandel
parents:
diff changeset
1397 }
e78566595089 initial import
mandel
parents:
diff changeset
1398 break;
e78566595089 initial import
mandel
parents:
diff changeset
1399 case StackElement::Include:
e78566595089 initial import
mandel
parents:
diff changeset
1400 {
e78566595089 initial import
mandel
parents:
diff changeset
1401 QString location = attributes["location"].toLower();
e78566595089 initial import
mandel
parents:
diff changeset
1402
e78566595089 initial import
mandel
parents:
diff changeset
1403 static QHash<QString, Include::IncludeType> locationNames;
e78566595089 initial import
mandel
parents:
diff changeset
1404 if (locationNames.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1405 locationNames["global"] = Include::IncludePath;
e78566595089 initial import
mandel
parents:
diff changeset
1406 locationNames["local"] = Include::LocalPath;
e78566595089 initial import
mandel
parents:
diff changeset
1407 locationNames["java"] = Include::TargetLangImport;
e78566595089 initial import
mandel
parents:
diff changeset
1408 }
e78566595089 initial import
mandel
parents:
diff changeset
1409
361
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1410 if (locationNames.isEmpty()) {
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1411 locationNames["global"] = Include::IncludePath;
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1412 locationNames["local"] = Include::LocalPath;
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1413 locationNames["java"] = Include::TargetLangImport;
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1414 }
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1415
1
e78566595089 initial import
mandel
parents:
diff changeset
1416 if (!locationNames.contains(location)) {
e78566595089 initial import
mandel
parents:
diff changeset
1417 m_error = QString("Location not recognized: '%1'").arg(location);
e78566595089 initial import
mandel
parents:
diff changeset
1418 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1419 }
e78566595089 initial import
mandel
parents:
diff changeset
1420
e78566595089 initial import
mandel
parents:
diff changeset
1421 Include::IncludeType loc = locationNames[location];
361
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1422
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1423 QString protection = attributes["protection"];
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1424 if (!protection.isEmpty()) {
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1425 if (loc != Include::TargetLangImport) {
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1426 m_error = QString("Protection attribute is allowed only if 'java' location is specified");
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1427 return false;
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1428 }
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1429
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1430 if (protection != "public"
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1431 || protection != "private"
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1432 || protection != "package") {
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1433 m_error = QString("Import protection is not recognized: '%1'").arg(protection);
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1434 }
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1435 }
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1436
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1437 Include inc(loc, protection, attributes["file-name"]);
1
e78566595089 initial import
mandel
parents:
diff changeset
1438
e78566595089 initial import
mandel
parents:
diff changeset
1439 ComplexTypeEntry *ctype = static_cast<ComplexTypeEntry *>(element->entry);
e78566595089 initial import
mandel
parents:
diff changeset
1440 if (topElement.type & StackElement::ComplexTypeEntryMask) {
e78566595089 initial import
mandel
parents:
diff changeset
1441 ctype->setInclude(inc);
e78566595089 initial import
mandel
parents:
diff changeset
1442 } else if (topElement.type == StackElement::ExtraIncludes) {
e78566595089 initial import
mandel
parents:
diff changeset
1443 ctype->addExtraInclude(inc);
e78566595089 initial import
mandel
parents:
diff changeset
1444 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1445 m_error = "Only supported parents are complex types and extra-includes";
e78566595089 initial import
mandel
parents:
diff changeset
1446 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1447 }
e78566595089 initial import
mandel
parents:
diff changeset
1448
e78566595089 initial import
mandel
parents:
diff changeset
1449 inc = ctype->include();
e78566595089 initial import
mandel
parents:
diff changeset
1450 IncludeList lst = ctype->extraIncludes();
e78566595089 initial import
mandel
parents:
diff changeset
1451 ctype = ctype->designatedInterface();
e78566595089 initial import
mandel
parents:
diff changeset
1452 if (ctype != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
1453 ctype->setExtraIncludes(lst);
e78566595089 initial import
mandel
parents:
diff changeset
1454 ctype->setInclude(inc);
e78566595089 initial import
mandel
parents:
diff changeset
1455 }
e78566595089 initial import
mandel
parents:
diff changeset
1456 }
e78566595089 initial import
mandel
parents:
diff changeset
1457 break;
e78566595089 initial import
mandel
parents:
diff changeset
1458 case StackElement::Rejection:
e78566595089 initial import
mandel
parents:
diff changeset
1459 {
e78566595089 initial import
mandel
parents:
diff changeset
1460 QString cls = attributes["class"];
e78566595089 initial import
mandel
parents:
diff changeset
1461 QString function = attributes["function-name"];
e78566595089 initial import
mandel
parents:
diff changeset
1462 QString field = attributes["field-name"];
e78566595089 initial import
mandel
parents:
diff changeset
1463 QString enum_ = attributes["enum-name"];
e78566595089 initial import
mandel
parents:
diff changeset
1464 if (cls == "*" && function == "*" && field == "*" && enum_ == "*") {
e78566595089 initial import
mandel
parents:
diff changeset
1465 m_error = "bad reject entry, neither 'class', 'function-name' nor "
e78566595089 initial import
mandel
parents:
diff changeset
1466 "'field' specified";
e78566595089 initial import
mandel
parents:
diff changeset
1467 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1468 }
e78566595089 initial import
mandel
parents:
diff changeset
1469 m_database->addRejection(cls, function, field, enum_);
e78566595089 initial import
mandel
parents:
diff changeset
1470 }
e78566595089 initial import
mandel
parents:
diff changeset
1471 break;
e78566595089 initial import
mandel
parents:
diff changeset
1472 case StackElement::Template:
e78566595089 initial import
mandel
parents:
diff changeset
1473 element->value.templateEntry = new TemplateEntry(attributes["name"]);
e78566595089 initial import
mandel
parents:
diff changeset
1474 break;
e78566595089 initial import
mandel
parents:
diff changeset
1475 case StackElement::TemplateInstanceEnum:
e78566595089 initial import
mandel
parents:
diff changeset
1476 if (!(topElement.type & StackElement::CodeSnipMask) &&
e78566595089 initial import
mandel
parents:
diff changeset
1477 (topElement.type != StackElement::Template) &&
e78566595089 initial import
mandel
parents:
diff changeset
1478 (topElement.type != StackElement::CustomMetaConstructor) &&
e78566595089 initial import
mandel
parents:
diff changeset
1479 (topElement.type != StackElement::CustomMetaDestructor) &&
e78566595089 initial import
mandel
parents:
diff changeset
1480 (topElement.type != StackElement::ConversionRule))
e78566595089 initial import
mandel
parents:
diff changeset
1481 {
e78566595089 initial import
mandel
parents:
diff changeset
1482 m_error = "Can only insert templates into code snippets, templates, custom-constructors, custom-destructors or conversion-rule.";
e78566595089 initial import
mandel
parents:
diff changeset
1483 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1484 }
e78566595089 initial import
mandel
parents:
diff changeset
1485 element->value.templateInstance = new TemplateInstance(attributes["name"]);
e78566595089 initial import
mandel
parents:
diff changeset
1486 break;
e78566595089 initial import
mandel
parents:
diff changeset
1487 case StackElement::Replace:
e78566595089 initial import
mandel
parents:
diff changeset
1488 if (topElement.type != StackElement::TemplateInstanceEnum) {
e78566595089 initial import
mandel
parents:
diff changeset
1489 m_error = "Can only insert replace rules into insert-template.";
e78566595089 initial import
mandel
parents:
diff changeset
1490 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1491 }
e78566595089 initial import
mandel
parents:
diff changeset
1492 element->parent->value.templateInstance->addReplaceRule(attributes["from"],attributes["to"]);
e78566595089 initial import
mandel
parents:
diff changeset
1493 break;
42
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1494 case StackElement::PackageDepend:
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1495 {
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1496 QString package = attributes["package"];
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1497 if (package.isEmpty()) {
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1498 m_error = "bad package depend entry";
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1499 return false;
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1500 }
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1501 m_defaultDepends << package;
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1502 }
eb3b5bbffc8f CMake: generator is not running multiple times.
SokoL_SD
parents: 27
diff changeset
1503 break;
1
e78566595089 initial import
mandel
parents:
diff changeset
1504 default:
e78566595089 initial import
mandel
parents:
diff changeset
1505 break; // nada
e78566595089 initial import
mandel
parents:
diff changeset
1506 };
e78566595089 initial import
mandel
parents:
diff changeset
1507 }
e78566595089 initial import
mandel
parents:
diff changeset
1508
e78566595089 initial import
mandel
parents:
diff changeset
1509 current = element;
e78566595089 initial import
mandel
parents:
diff changeset
1510 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1511 }
e78566595089 initial import
mandel
parents:
diff changeset
1512
e78566595089 initial import
mandel
parents:
diff changeset
1513 TypeDatabase *TypeDatabase::instance()
e78566595089 initial import
mandel
parents:
diff changeset
1514 {
e78566595089 initial import
mandel
parents:
diff changeset
1515 static TypeDatabase *db = new TypeDatabase();
e78566595089 initial import
mandel
parents:
diff changeset
1516 return db;
e78566595089 initial import
mandel
parents:
diff changeset
1517 }
e78566595089 initial import
mandel
parents:
diff changeset
1518
e78566595089 initial import
mandel
parents:
diff changeset
1519 TypeDatabase::TypeDatabase() : m_suppressWarnings(true), m_includeEclipseWarnings(false)
e78566595089 initial import
mandel
parents:
diff changeset
1520 {
e78566595089 initial import
mandel
parents:
diff changeset
1521 addType(new StringTypeEntry("QString"));
e78566595089 initial import
mandel
parents:
diff changeset
1522
e78566595089 initial import
mandel
parents:
diff changeset
1523 StringTypeEntry *e = new StringTypeEntry("QLatin1String");
e78566595089 initial import
mandel
parents:
diff changeset
1524 e->setPreferredConversion(false);
e78566595089 initial import
mandel
parents:
diff changeset
1525 addType(e);
e78566595089 initial import
mandel
parents:
diff changeset
1526
e78566595089 initial import
mandel
parents:
diff changeset
1527 e = new StringTypeEntry("QStringRef");
e78566595089 initial import
mandel
parents:
diff changeset
1528 e->setPreferredConversion(false);
e78566595089 initial import
mandel
parents:
diff changeset
1529 addType(e);
e78566595089 initial import
mandel
parents:
diff changeset
1530
e78566595089 initial import
mandel
parents:
diff changeset
1531 e = new StringTypeEntry("QXmlStreamStringRef");
e78566595089 initial import
mandel
parents:
diff changeset
1532 e->setPreferredConversion(false);
e78566595089 initial import
mandel
parents:
diff changeset
1533 addType(e);
e78566595089 initial import
mandel
parents:
diff changeset
1534
e78566595089 initial import
mandel
parents:
diff changeset
1535 addType(new CharTypeEntry("QChar"));
e78566595089 initial import
mandel
parents:
diff changeset
1536
e78566595089 initial import
mandel
parents:
diff changeset
1537 CharTypeEntry *c = new CharTypeEntry("QLatin1Char");
e78566595089 initial import
mandel
parents:
diff changeset
1538 c->setPreferredConversion(false);
e78566595089 initial import
mandel
parents:
diff changeset
1539 addType(c);
e78566595089 initial import
mandel
parents:
diff changeset
1540
e78566595089 initial import
mandel
parents:
diff changeset
1541 {
e78566595089 initial import
mandel
parents:
diff changeset
1542 VariantTypeEntry *qvariant = new VariantTypeEntry("QVariant");
e78566595089 initial import
mandel
parents:
diff changeset
1543 qvariant->setCodeGeneration(TypeEntry::GenerateAll);
e78566595089 initial import
mandel
parents:
diff changeset
1544 addType(qvariant);
e78566595089 initial import
mandel
parents:
diff changeset
1545 }
e78566595089 initial import
mandel
parents:
diff changeset
1546
e78566595089 initial import
mandel
parents:
diff changeset
1547 {
e78566595089 initial import
mandel
parents:
diff changeset
1548 JObjectWrapperTypeEntry *wrapper = new JObjectWrapperTypeEntry("JObjectWrapper");
e78566595089 initial import
mandel
parents:
diff changeset
1549 wrapper->setCodeGeneration(TypeEntry::GenerateNothing);
e78566595089 initial import
mandel
parents:
diff changeset
1550 addType(wrapper);
e78566595089 initial import
mandel
parents:
diff changeset
1551 }
e78566595089 initial import
mandel
parents:
diff changeset
1552
e78566595089 initial import
mandel
parents:
diff changeset
1553 addType(new ThreadTypeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
1554 addType(new VoidTypeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
1555
e78566595089 initial import
mandel
parents:
diff changeset
1556 // Predefined containers...
e78566595089 initial import
mandel
parents:
diff changeset
1557 addType(new ContainerTypeEntry("QList", ContainerTypeEntry::ListContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1558 addType(new ContainerTypeEntry("QStringList", ContainerTypeEntry::StringListContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1559 addType(new ContainerTypeEntry("QLinkedList", ContainerTypeEntry::LinkedListContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1560 addType(new ContainerTypeEntry("QVector", ContainerTypeEntry::VectorContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1561 addType(new ContainerTypeEntry("QStack", ContainerTypeEntry::StackContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1562 addType(new ContainerTypeEntry("QSet", ContainerTypeEntry::SetContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1563 addType(new ContainerTypeEntry("QMap", ContainerTypeEntry::MapContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1564 addType(new ContainerTypeEntry("QHash", ContainerTypeEntry::HashContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1565 addType(new ContainerTypeEntry("QPair", ContainerTypeEntry::PairContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1566 addType(new ContainerTypeEntry("QQueue", ContainerTypeEntry::QueueContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1567 addType(new ContainerTypeEntry("QMultiMap", ContainerTypeEntry::MultiMapContainer));
e78566595089 initial import
mandel
parents:
diff changeset
1568
e78566595089 initial import
mandel
parents:
diff changeset
1569 // Custom types...
e78566595089 initial import
mandel
parents:
diff changeset
1570 // addType(new QModelIndexTypeEntry());
e78566595089 initial import
mandel
parents:
diff changeset
1571
e78566595089 initial import
mandel
parents:
diff changeset
1572 addRemoveFunctionToTemplates(this);
e78566595089 initial import
mandel
parents:
diff changeset
1573 }
e78566595089 initial import
mandel
parents:
diff changeset
1574
4
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
1575 bool TypeDatabase::parseFile(const QString &filename, const QString &source_dir, bool generate)
1
e78566595089 initial import
mandel
parents:
diff changeset
1576 {
27
a9626891eca6 CMake: generator will work only for needed packages.
SokoL_SD
parents: 14
diff changeset
1577 QString name(filename);
a9626891eca6 CMake: generator will work only for needed packages.
SokoL_SD
parents: 14
diff changeset
1578 QFileInfo info(name);
a9626891eca6 CMake: generator will work only for needed packages.
SokoL_SD
parents: 14
diff changeset
1579 if(!info.exists())
a9626891eca6 CMake: generator will work only for needed packages.
SokoL_SD
parents: 14
diff changeset
1580 {
a9626891eca6 CMake: generator will work only for needed packages.
SokoL_SD
parents: 14
diff changeset
1581 Q_ASSERT(!source_dir.isEmpty());
4
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
1582 name = source_dir + "/" + filename;
27
a9626891eca6 CMake: generator will work only for needed packages.
SokoL_SD
parents: 14
diff changeset
1583 }
4
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
1584 QFile file(name);
1
e78566595089 initial import
mandel
parents:
diff changeset
1585 Q_ASSERT(file.exists());
e78566595089 initial import
mandel
parents:
diff changeset
1586 QXmlInputSource source(&file);
e78566595089 initial import
mandel
parents:
diff changeset
1587
e78566595089 initial import
mandel
parents:
diff changeset
1588 int count = m_entries.size();
e78566595089 initial import
mandel
parents:
diff changeset
1589
e78566595089 initial import
mandel
parents:
diff changeset
1590 QXmlSimpleReader reader;
4
0a29ce1ae854 CMake build script.
SokoL_SD
parents: 1
diff changeset
1591 Handler handler(this, source_dir, generate);
1
e78566595089 initial import
mandel
parents:
diff changeset
1592
e78566595089 initial import
mandel
parents:
diff changeset
1593 reader.setContentHandler(&handler);
e78566595089 initial import
mandel
parents:
diff changeset
1594 reader.setErrorHandler(&handler);
e78566595089 initial import
mandel
parents:
diff changeset
1595
e78566595089 initial import
mandel
parents:
diff changeset
1596 bool ok = reader.parse(&source, false);
e78566595089 initial import
mandel
parents:
diff changeset
1597
e78566595089 initial import
mandel
parents:
diff changeset
1598 int newCount = m_entries.size();
e78566595089 initial import
mandel
parents:
diff changeset
1599
e78566595089 initial import
mandel
parents:
diff changeset
1600 ReportHandler::debugSparse(QString::fromLatin1("Parsed: '%1', %2 new entries")
e78566595089 initial import
mandel
parents:
diff changeset
1601 .arg(filename)
e78566595089 initial import
mandel
parents:
diff changeset
1602 .arg(newCount - count));
e78566595089 initial import
mandel
parents:
diff changeset
1603
e78566595089 initial import
mandel
parents:
diff changeset
1604 return ok;
e78566595089 initial import
mandel
parents:
diff changeset
1605 }
e78566595089 initial import
mandel
parents:
diff changeset
1606
e78566595089 initial import
mandel
parents:
diff changeset
1607 QString PrimitiveTypeEntry::javaObjectName() const
e78566595089 initial import
mandel
parents:
diff changeset
1608 {
e78566595089 initial import
mandel
parents:
diff changeset
1609 static QHash<QString, QString> table;
e78566595089 initial import
mandel
parents:
diff changeset
1610 if (table.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1611 table["boolean"] = "Boolean";
e78566595089 initial import
mandel
parents:
diff changeset
1612 table["byte"] = "Byte";
e78566595089 initial import
mandel
parents:
diff changeset
1613 table["char"] = "Character";
e78566595089 initial import
mandel
parents:
diff changeset
1614 table["short"] = "Short";
e78566595089 initial import
mandel
parents:
diff changeset
1615 table["int"] = "Integer";
e78566595089 initial import
mandel
parents:
diff changeset
1616 table["long"] = "Long";
e78566595089 initial import
mandel
parents:
diff changeset
1617 table["float"] = "Float";
e78566595089 initial import
mandel
parents:
diff changeset
1618 table["double"] = "Double";
e78566595089 initial import
mandel
parents:
diff changeset
1619 }
e78566595089 initial import
mandel
parents:
diff changeset
1620 Q_ASSERT(table.contains(targetLangName()));
e78566595089 initial import
mandel
parents:
diff changeset
1621 return table[targetLangName()];
e78566595089 initial import
mandel
parents:
diff changeset
1622 }
e78566595089 initial import
mandel
parents:
diff changeset
1623
e78566595089 initial import
mandel
parents:
diff changeset
1624 ContainerTypeEntry *TypeDatabase::findContainerType(const QString &name)
e78566595089 initial import
mandel
parents:
diff changeset
1625 {
e78566595089 initial import
mandel
parents:
diff changeset
1626 QString template_name = name;
e78566595089 initial import
mandel
parents:
diff changeset
1627
e78566595089 initial import
mandel
parents:
diff changeset
1628 int pos = name.indexOf('<');
e78566595089 initial import
mandel
parents:
diff changeset
1629 if (pos > 0)
e78566595089 initial import
mandel
parents:
diff changeset
1630 template_name = name.left(pos);
e78566595089 initial import
mandel
parents:
diff changeset
1631
e78566595089 initial import
mandel
parents:
diff changeset
1632 TypeEntry *type_entry = findType(template_name);
e78566595089 initial import
mandel
parents:
diff changeset
1633 if (type_entry && type_entry->isContainer())
e78566595089 initial import
mandel
parents:
diff changeset
1634 return static_cast<ContainerTypeEntry *>(type_entry);
e78566595089 initial import
mandel
parents:
diff changeset
1635 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1636 }
e78566595089 initial import
mandel
parents:
diff changeset
1637
e78566595089 initial import
mandel
parents:
diff changeset
1638 PrimitiveTypeEntry *TypeDatabase::findTargetLangPrimitiveType(const QString &java_name)
e78566595089 initial import
mandel
parents:
diff changeset
1639 {
e78566595089 initial import
mandel
parents:
diff changeset
1640 foreach (QList<TypeEntry *> entries, m_entries.values()) {
e78566595089 initial import
mandel
parents:
diff changeset
1641 foreach (TypeEntry *e, entries) {
e78566595089 initial import
mandel
parents:
diff changeset
1642 if (e && e->isPrimitive()) {
e78566595089 initial import
mandel
parents:
diff changeset
1643 PrimitiveTypeEntry *pe = static_cast<PrimitiveTypeEntry *>(e);
e78566595089 initial import
mandel
parents:
diff changeset
1644 if (pe->targetLangName() == java_name && pe->preferredConversion())
e78566595089 initial import
mandel
parents:
diff changeset
1645 return pe;
e78566595089 initial import
mandel
parents:
diff changeset
1646 }
e78566595089 initial import
mandel
parents:
diff changeset
1647 }
e78566595089 initial import
mandel
parents:
diff changeset
1648 }
e78566595089 initial import
mandel
parents:
diff changeset
1649
e78566595089 initial import
mandel
parents:
diff changeset
1650 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1651 }
e78566595089 initial import
mandel
parents:
diff changeset
1652
e78566595089 initial import
mandel
parents:
diff changeset
1653 IncludeList TypeDatabase::extraIncludes(const QString &className)
e78566595089 initial import
mandel
parents:
diff changeset
1654 {
e78566595089 initial import
mandel
parents:
diff changeset
1655 ComplexTypeEntry *typeEntry = findComplexType(className);
e78566595089 initial import
mandel
parents:
diff changeset
1656 if (typeEntry != 0)
e78566595089 initial import
mandel
parents:
diff changeset
1657 return typeEntry->extraIncludes();
e78566595089 initial import
mandel
parents:
diff changeset
1658 else
e78566595089 initial import
mandel
parents:
diff changeset
1659 return IncludeList();
e78566595089 initial import
mandel
parents:
diff changeset
1660 }
e78566595089 initial import
mandel
parents:
diff changeset
1661
e78566595089 initial import
mandel
parents:
diff changeset
1662
e78566595089 initial import
mandel
parents:
diff changeset
1663
e78566595089 initial import
mandel
parents:
diff changeset
1664 QString Include::toString() const
e78566595089 initial import
mandel
parents:
diff changeset
1665 {
e78566595089 initial import
mandel
parents:
diff changeset
1666 if (type == IncludePath)
e78566595089 initial import
mandel
parents:
diff changeset
1667 return "#include <" + name + '>';
e78566595089 initial import
mandel
parents:
diff changeset
1668 else if (type == LocalPath)
e78566595089 initial import
mandel
parents:
diff changeset
1669 return "#include \"" + name + "\"";
361
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1670 else {
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1671 QString result;
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1672 if (!protection.isEmpty())
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1673 result += protection + " ";
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1674 return result + "import " + name + ";";
beaf4a2974d7 Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents: 355
diff changeset
1675 }
1
e78566595089 initial import
mandel
parents:
diff changeset
1676 }
e78566595089 initial import
mandel
parents:
diff changeset
1677
e78566595089 initial import
mandel
parents:
diff changeset
1678 QString Modification::accessModifierString() const
e78566595089 initial import
mandel
parents:
diff changeset
1679 {
e78566595089 initial import
mandel
parents:
diff changeset
1680 if (isPrivate()) return "private";
e78566595089 initial import
mandel
parents:
diff changeset
1681 if (isProtected()) return "protected";
e78566595089 initial import
mandel
parents:
diff changeset
1682 if (isPublic()) return "public";
e78566595089 initial import
mandel
parents:
diff changeset
1683 if (isFriendly()) return "friendly";
e78566595089 initial import
mandel
parents:
diff changeset
1684 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
1685 }
e78566595089 initial import
mandel
parents:
diff changeset
1686
e78566595089 initial import
mandel
parents:
diff changeset
1687 FunctionModificationList ComplexTypeEntry::functionModifications(const QString &signature) const
e78566595089 initial import
mandel
parents:
diff changeset
1688 {
e78566595089 initial import
mandel
parents:
diff changeset
1689 FunctionModificationList lst;
e78566595089 initial import
mandel
parents:
diff changeset
1690 for (int i=0; i<m_function_mods.count(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
1691 FunctionModification mod = m_function_mods.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
1692 if (mod.signature == signature) {
e78566595089 initial import
mandel
parents:
diff changeset
1693 lst << mod;
e78566595089 initial import
mandel
parents:
diff changeset
1694 }
e78566595089 initial import
mandel
parents:
diff changeset
1695 }
e78566595089 initial import
mandel
parents:
diff changeset
1696
e78566595089 initial import
mandel
parents:
diff changeset
1697 return lst;
e78566595089 initial import
mandel
parents:
diff changeset
1698 }
e78566595089 initial import
mandel
parents:
diff changeset
1699
e78566595089 initial import
mandel
parents:
diff changeset
1700 FieldModification ComplexTypeEntry::fieldModification(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
1701 {
e78566595089 initial import
mandel
parents:
diff changeset
1702 for (int i=0; i<m_field_mods.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
1703 if (m_field_mods.at(i).name == name)
e78566595089 initial import
mandel
parents:
diff changeset
1704 return m_field_mods.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
1705 FieldModification mod;
e78566595089 initial import
mandel
parents:
diff changeset
1706 mod.name = name;
e78566595089 initial import
mandel
parents:
diff changeset
1707 mod.modifiers = FieldModification::Readable | FieldModification::Writable;
e78566595089 initial import
mandel
parents:
diff changeset
1708 return mod;
e78566595089 initial import
mandel
parents:
diff changeset
1709 }
e78566595089 initial import
mandel
parents:
diff changeset
1710
e78566595089 initial import
mandel
parents:
diff changeset
1711 QString ContainerTypeEntry::javaPackage() const
e78566595089 initial import
mandel
parents:
diff changeset
1712 {
297
bc783e20da2b share strange dmd
eldar
parents: 148
diff changeset
1713 return "qt.core";
1
e78566595089 initial import
mandel
parents:
diff changeset
1714 }
e78566595089 initial import
mandel
parents:
diff changeset
1715
e78566595089 initial import
mandel
parents:
diff changeset
1716 QString ContainerTypeEntry::targetLangName() const
e78566595089 initial import
mandel
parents:
diff changeset
1717 {
e78566595089 initial import
mandel
parents:
diff changeset
1718
e78566595089 initial import
mandel
parents:
diff changeset
1719 switch (m_type) {
297
bc783e20da2b share strange dmd
eldar
parents: 148
diff changeset
1720 case StringListContainer: return "QList";
bc783e20da2b share strange dmd
eldar
parents: 148
diff changeset
1721 case ListContainer: return "QList";
bc783e20da2b share strange dmd
eldar
parents: 148
diff changeset
1722 case LinkedListContainer: return "QLinkedList";
bc783e20da2b share strange dmd
eldar
parents: 148
diff changeset
1723 case VectorContainer: return "QVector";
1
e78566595089 initial import
mandel
parents:
diff changeset
1724 case StackContainer: return "Stack";
e78566595089 initial import
mandel
parents:
diff changeset
1725 case QueueContainer: return "Queue";
e78566595089 initial import
mandel
parents:
diff changeset
1726 case SetContainer: return "Set";
e78566595089 initial import
mandel
parents:
diff changeset
1727 case MapContainer: return "SortedMap";
e78566595089 initial import
mandel
parents:
diff changeset
1728 case MultiMapContainer: return "SortedMap";
e78566595089 initial import
mandel
parents:
diff changeset
1729 case HashContainer: return "HashMap";
e78566595089 initial import
mandel
parents:
diff changeset
1730 // case MultiHashCollectio: return "MultiHash";
e78566595089 initial import
mandel
parents:
diff changeset
1731 case PairContainer: return "QPair";
e78566595089 initial import
mandel
parents:
diff changeset
1732 default:
e78566595089 initial import
mandel
parents:
diff changeset
1733 qWarning("bad type... %d", m_type);
e78566595089 initial import
mandel
parents:
diff changeset
1734 break;
e78566595089 initial import
mandel
parents:
diff changeset
1735 }
e78566595089 initial import
mandel
parents:
diff changeset
1736 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
1737 }
e78566595089 initial import
mandel
parents:
diff changeset
1738
e78566595089 initial import
mandel
parents:
diff changeset
1739 QString ContainerTypeEntry::qualifiedCppName() const
e78566595089 initial import
mandel
parents:
diff changeset
1740 {
e78566595089 initial import
mandel
parents:
diff changeset
1741 if (m_type == StringListContainer)
e78566595089 initial import
mandel
parents:
diff changeset
1742 return "QStringList";
e78566595089 initial import
mandel
parents:
diff changeset
1743 return ComplexTypeEntry::qualifiedCppName();
e78566595089 initial import
mandel
parents:
diff changeset
1744 }
e78566595089 initial import
mandel
parents:
diff changeset
1745
e78566595089 initial import
mandel
parents:
diff changeset
1746 QString EnumTypeEntry::javaQualifier() const
e78566595089 initial import
mandel
parents:
diff changeset
1747 {
e78566595089 initial import
mandel
parents:
diff changeset
1748 TypeEntry *te = TypeDatabase::instance()->findType(m_qualifier);
355
08c1ca7975ab obviated redundant virtual dispatch callbacks
Max Samukha <maxter@spambox.com>
parents: 341
diff changeset
1749 if (te != 0)
1
e78566595089 initial import
mandel
parents:
diff changeset
1750 return te->targetLangName();
e78566595089 initial import
mandel
parents:
diff changeset
1751 else
e78566595089 initial import
mandel
parents:
diff changeset
1752 return m_qualifier;
e78566595089 initial import
mandel
parents:
diff changeset
1753 }
e78566595089 initial import
mandel
parents:
diff changeset
1754
e78566595089 initial import
mandel
parents:
diff changeset
1755 QString EnumTypeEntry::jniName() const
e78566595089 initial import
mandel
parents:
diff changeset
1756 {
e78566595089 initial import
mandel
parents:
diff changeset
1757 return "jint";
e78566595089 initial import
mandel
parents:
diff changeset
1758 }
e78566595089 initial import
mandel
parents:
diff changeset
1759
e78566595089 initial import
mandel
parents:
diff changeset
1760 QString FlagsTypeEntry::jniName() const
e78566595089 initial import
mandel
parents:
diff changeset
1761 {
e78566595089 initial import
mandel
parents:
diff changeset
1762 return "jint";
e78566595089 initial import
mandel
parents:
diff changeset
1763 }
e78566595089 initial import
mandel
parents:
diff changeset
1764
e78566595089 initial import
mandel
parents:
diff changeset
1765 void EnumTypeEntry::addEnumValueRedirection(const QString &rejected, const QString &usedValue)
e78566595089 initial import
mandel
parents:
diff changeset
1766 {
e78566595089 initial import
mandel
parents:
diff changeset
1767 m_enum_redirections << EnumValueRedirection(rejected, usedValue);
e78566595089 initial import
mandel
parents:
diff changeset
1768 }
e78566595089 initial import
mandel
parents:
diff changeset
1769
e78566595089 initial import
mandel
parents:
diff changeset
1770 QString EnumTypeEntry::enumValueRedirection(const QString &value) const
e78566595089 initial import
mandel
parents:
diff changeset
1771 {
e78566595089 initial import
mandel
parents:
diff changeset
1772 for (int i=0; i<m_enum_redirections.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
1773 if (m_enum_redirections.at(i).rejected == value)
e78566595089 initial import
mandel
parents:
diff changeset
1774 return m_enum_redirections.at(i).used;
e78566595089 initial import
mandel
parents:
diff changeset
1775 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
1776 }
e78566595089 initial import
mandel
parents:
diff changeset
1777
e78566595089 initial import
mandel
parents:
diff changeset
1778 QString FlagsTypeEntry::qualifiedTargetLangName() const
e78566595089 initial import
mandel
parents:
diff changeset
1779 {
e78566595089 initial import
mandel
parents:
diff changeset
1780 return m_enum->javaQualifier() + "." + targetLangName();
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 void TypeDatabase::addRejection(const QString &class_name, const QString &function_name,
e78566595089 initial import
mandel
parents:
diff changeset
1785 const QString &field_name, const QString &enum_name)
e78566595089 initial import
mandel
parents:
diff changeset
1786 {
e78566595089 initial import
mandel
parents:
diff changeset
1787 TypeRejection r;
e78566595089 initial import
mandel
parents:
diff changeset
1788 r.class_name = class_name;
e78566595089 initial import
mandel
parents:
diff changeset
1789 r.function_name = function_name;
e78566595089 initial import
mandel
parents:
diff changeset
1790 r.field_name = field_name;
e78566595089 initial import
mandel
parents:
diff changeset
1791 r.enum_name = enum_name;
e78566595089 initial import
mandel
parents:
diff changeset
1792
e78566595089 initial import
mandel
parents:
diff changeset
1793 m_rejections << r;
e78566595089 initial import
mandel
parents:
diff changeset
1794 }
e78566595089 initial import
mandel
parents:
diff changeset
1795
e78566595089 initial import
mandel
parents:
diff changeset
1796 bool TypeDatabase::isClassRejected(const QString &class_name)
e78566595089 initial import
mandel
parents:
diff changeset
1797 {
e78566595089 initial import
mandel
parents:
diff changeset
1798 if (!m_rebuild_classes.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
1799 return !m_rebuild_classes.contains(class_name);
e78566595089 initial import
mandel
parents:
diff changeset
1800
e78566595089 initial import
mandel
parents:
diff changeset
1801 foreach (const TypeRejection &r, m_rejections)
e78566595089 initial import
mandel
parents:
diff changeset
1802 if (r.class_name == class_name && r.function_name == "*" && r.field_name == "*" && r.enum_name == "*") {
e78566595089 initial import
mandel
parents:
diff changeset
1803 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1804 }
e78566595089 initial import
mandel
parents:
diff changeset
1805 return 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 bool TypeDatabase::isEnumRejected(const QString &class_name, const QString &enum_name)
e78566595089 initial import
mandel
parents:
diff changeset
1809 {
e78566595089 initial import
mandel
parents:
diff changeset
1810 foreach (const TypeRejection &r, m_rejections) {
e78566595089 initial import
mandel
parents:
diff changeset
1811 if (r.enum_name == enum_name
e78566595089 initial import
mandel
parents:
diff changeset
1812 && (r.class_name == class_name || r.class_name == "*")) {
e78566595089 initial import
mandel
parents:
diff changeset
1813 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1814 }
e78566595089 initial import
mandel
parents:
diff changeset
1815 }
e78566595089 initial import
mandel
parents:
diff changeset
1816
e78566595089 initial import
mandel
parents:
diff changeset
1817 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1818 }
e78566595089 initial import
mandel
parents:
diff changeset
1819
e78566595089 initial import
mandel
parents:
diff changeset
1820 bool TypeDatabase::isFunctionRejected(const QString &class_name, const QString &function_name)
e78566595089 initial import
mandel
parents:
diff changeset
1821 {
e78566595089 initial import
mandel
parents:
diff changeset
1822 foreach (const TypeRejection &r, m_rejections)
e78566595089 initial import
mandel
parents:
diff changeset
1823 if (r.function_name == function_name &&
e78566595089 initial import
mandel
parents:
diff changeset
1824 (r.class_name == class_name || r.class_name == "*"))
e78566595089 initial import
mandel
parents:
diff changeset
1825 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1826 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1827 }
e78566595089 initial import
mandel
parents:
diff changeset
1828
e78566595089 initial import
mandel
parents:
diff changeset
1829
e78566595089 initial import
mandel
parents:
diff changeset
1830 bool TypeDatabase::isFieldRejected(const QString &class_name, const QString &field_name)
e78566595089 initial import
mandel
parents:
diff changeset
1831 {
e78566595089 initial import
mandel
parents:
diff changeset
1832 foreach (const TypeRejection &r, m_rejections)
e78566595089 initial import
mandel
parents:
diff changeset
1833 if (r.field_name == field_name &&
e78566595089 initial import
mandel
parents:
diff changeset
1834 (r.class_name == class_name || r.class_name == "*"))
e78566595089 initial import
mandel
parents:
diff changeset
1835 return true;
e78566595089 initial import
mandel
parents:
diff changeset
1836 return false;
e78566595089 initial import
mandel
parents:
diff changeset
1837 }
e78566595089 initial import
mandel
parents:
diff changeset
1838
e78566595089 initial import
mandel
parents:
diff changeset
1839 FlagsTypeEntry *TypeDatabase::findFlagsType(const QString &name) const
e78566595089 initial import
mandel
parents:
diff changeset
1840 {
e78566595089 initial import
mandel
parents:
diff changeset
1841 FlagsTypeEntry *fte = (FlagsTypeEntry *) findType(name);
e78566595089 initial import
mandel
parents:
diff changeset
1842 return fte ? fte : (FlagsTypeEntry *) m_flags_entries.value(name);
e78566595089 initial import
mandel
parents:
diff changeset
1843 }
e78566595089 initial import
mandel
parents:
diff changeset
1844
e78566595089 initial import
mandel
parents:
diff changeset
1845 QString TypeDatabase::globalNamespaceClassName(const TypeEntry * /*entry*/) {
e78566595089 initial import
mandel
parents:
diff changeset
1846 return QLatin1String("Global");
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 /*!
e78566595089 initial import
mandel
parents:
diff changeset
1851 * The Visual Studio 2002 compiler doesn't support these symbols,
e78566595089 initial import
mandel
parents:
diff changeset
1852 * which our typedefs unforntuatly expand to.
e78566595089 initial import
mandel
parents:
diff changeset
1853 */
e78566595089 initial import
mandel
parents:
diff changeset
1854 QString fixCppTypeName(const QString &name)
e78566595089 initial import
mandel
parents:
diff changeset
1855 {
e78566595089 initial import
mandel
parents:
diff changeset
1856 if (name == "long long") return "qint64";
e78566595089 initial import
mandel
parents:
diff changeset
1857 else if (name == "unsigned long long") return "quint64";
e78566595089 initial import
mandel
parents:
diff changeset
1858 return name;
e78566595089 initial import
mandel
parents:
diff changeset
1859 }
e78566595089 initial import
mandel
parents:
diff changeset
1860
e78566595089 initial import
mandel
parents:
diff changeset
1861 QString formattedCodeHelper(QTextStream &s, Indentor &indentor, QStringList &lines) {
e78566595089 initial import
mandel
parents:
diff changeset
1862 bool multilineComment = false;
e78566595089 initial import
mandel
parents:
diff changeset
1863 bool lastEmpty = true;
e78566595089 initial import
mandel
parents:
diff changeset
1864 QString lastLine;
e78566595089 initial import
mandel
parents:
diff changeset
1865 while (!lines.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1866 const QString line = lines.takeFirst().trimmed();
e78566595089 initial import
mandel
parents:
diff changeset
1867 if (line.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1868 if (!lastEmpty)
e78566595089 initial import
mandel
parents:
diff changeset
1869 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
1870 lastEmpty = true;
e78566595089 initial import
mandel
parents:
diff changeset
1871 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1872 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1873 lastEmpty = false;
e78566595089 initial import
mandel
parents:
diff changeset
1874 }
e78566595089 initial import
mandel
parents:
diff changeset
1875 if (line.startsWith("/*"))
e78566595089 initial import
mandel
parents:
diff changeset
1876 multilineComment = true;
e78566595089 initial import
mandel
parents:
diff changeset
1877
e78566595089 initial import
mandel
parents:
diff changeset
1878 if (multilineComment) {
e78566595089 initial import
mandel
parents:
diff changeset
1879 s << indentor;
e78566595089 initial import
mandel
parents:
diff changeset
1880 if (line.startsWith("*"))
e78566595089 initial import
mandel
parents:
diff changeset
1881 s << " ";
e78566595089 initial import
mandel
parents:
diff changeset
1882 s << line << endl;
e78566595089 initial import
mandel
parents:
diff changeset
1883 if (line.endsWith("*/"))
e78566595089 initial import
mandel
parents:
diff changeset
1884 multilineComment = false;
e78566595089 initial import
mandel
parents:
diff changeset
1885 } else if (line.startsWith("}")) {
e78566595089 initial import
mandel
parents:
diff changeset
1886 return line;
e78566595089 initial import
mandel
parents:
diff changeset
1887 } else if (line.endsWith("}")) {
e78566595089 initial import
mandel
parents:
diff changeset
1888 s << indentor << line << endl;
e78566595089 initial import
mandel
parents:
diff changeset
1889 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
1890 } else if(line.endsWith("{")) {
e78566595089 initial import
mandel
parents:
diff changeset
1891 s << indentor << line << endl;
e78566595089 initial import
mandel
parents:
diff changeset
1892 QString tmp;
e78566595089 initial import
mandel
parents:
diff changeset
1893 {
e78566595089 initial import
mandel
parents:
diff changeset
1894 Indentation indent(indentor);
e78566595089 initial import
mandel
parents:
diff changeset
1895 tmp = formattedCodeHelper(s, indentor, lines);
e78566595089 initial import
mandel
parents:
diff changeset
1896 }
e78566595089 initial import
mandel
parents:
diff changeset
1897 if (!tmp.isNull()) {
e78566595089 initial import
mandel
parents:
diff changeset
1898 s << indentor << tmp << endl;
e78566595089 initial import
mandel
parents:
diff changeset
1899 }
e78566595089 initial import
mandel
parents:
diff changeset
1900 lastLine = tmp;
e78566595089 initial import
mandel
parents:
diff changeset
1901 continue;
e78566595089 initial import
mandel
parents:
diff changeset
1902 } else {
e78566595089 initial import
mandel
parents:
diff changeset
1903 s << indentor;
e78566595089 initial import
mandel
parents:
diff changeset
1904 if (!lastLine.isEmpty() &&
e78566595089 initial import
mandel
parents:
diff changeset
1905 !lastLine.endsWith(";") &&
e78566595089 initial import
mandel
parents:
diff changeset
1906 !line.startsWith("@") &&
e78566595089 initial import
mandel
parents:
diff changeset
1907 !line.startsWith("//") &&
e78566595089 initial import
mandel
parents:
diff changeset
1908 !lastLine.startsWith("//") &&
e78566595089 initial import
mandel
parents:
diff changeset
1909 !lastLine.endsWith("}") &&
e78566595089 initial import
mandel
parents:
diff changeset
1910 !line.startsWith("{"))
e78566595089 initial import
mandel
parents:
diff changeset
1911 s << " ";
e78566595089 initial import
mandel
parents:
diff changeset
1912 s << line << endl;
e78566595089 initial import
mandel
parents:
diff changeset
1913 }
e78566595089 initial import
mandel
parents:
diff changeset
1914 lastLine = line;
e78566595089 initial import
mandel
parents:
diff changeset
1915 }
e78566595089 initial import
mandel
parents:
diff changeset
1916 return 0;
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 QTextStream &CodeSnip::formattedCode(QTextStream &s, Indentor &indentor) const
e78566595089 initial import
mandel
parents:
diff changeset
1921 {
e78566595089 initial import
mandel
parents:
diff changeset
1922 QStringList lst(code().split("\n"));
e78566595089 initial import
mandel
parents:
diff changeset
1923 while (!lst.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
1924 QString tmp = formattedCodeHelper(s, indentor, lst);
e78566595089 initial import
mandel
parents:
diff changeset
1925 if (!tmp.isNull()) {
e78566595089 initial import
mandel
parents:
diff changeset
1926 s << indentor << tmp << endl;
e78566595089 initial import
mandel
parents:
diff changeset
1927 }
e78566595089 initial import
mandel
parents:
diff changeset
1928 }
e78566595089 initial import
mandel
parents:
diff changeset
1929 s.flush();
e78566595089 initial import
mandel
parents:
diff changeset
1930 return s;
e78566595089 initial import
mandel
parents:
diff changeset
1931 }
e78566595089 initial import
mandel
parents:
diff changeset
1932
e78566595089 initial import
mandel
parents:
diff changeset
1933 QString TemplateInstance::expandCode() const{
e78566595089 initial import
mandel
parents:
diff changeset
1934 TemplateEntry *templateEntry = TypeDatabase::instance()->findTemplate(m_name);
e78566595089 initial import
mandel
parents:
diff changeset
1935 if(templateEntry){
e78566595089 initial import
mandel
parents:
diff changeset
1936 QString res = templateEntry->code();
e78566595089 initial import
mandel
parents:
diff changeset
1937 foreach(QString key, replaceRules.keys()){
e78566595089 initial import
mandel
parents:
diff changeset
1938 res.replace(key, replaceRules[key]);
e78566595089 initial import
mandel
parents:
diff changeset
1939 }
e78566595089 initial import
mandel
parents:
diff changeset
1940 return "// TEMPLATE - " + m_name + " - START" + res + "// TEMPLATE - " + m_name + " - END";
e78566595089 initial import
mandel
parents:
diff changeset
1941 }
e78566595089 initial import
mandel
parents:
diff changeset
1942 else{
e78566595089 initial import
mandel
parents:
diff changeset
1943 ReportHandler::warning("insert-template referring to non-existing template '" + m_name + "'");
e78566595089 initial import
mandel
parents:
diff changeset
1944 }
e78566595089 initial import
mandel
parents:
diff changeset
1945 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
1946 }
e78566595089 initial import
mandel
parents:
diff changeset
1947
e78566595089 initial import
mandel
parents:
diff changeset
1948
e78566595089 initial import
mandel
parents:
diff changeset
1949 QString CodeSnipAbstract::code() const{
e78566595089 initial import
mandel
parents:
diff changeset
1950 QString res;
e78566595089 initial import
mandel
parents:
diff changeset
1951 foreach(CodeSnipFragment *codeFrag, codeList){
e78566595089 initial import
mandel
parents:
diff changeset
1952 res.append(codeFrag->code());
e78566595089 initial import
mandel
parents:
diff changeset
1953 }
e78566595089 initial import
mandel
parents:
diff changeset
1954 return res;
e78566595089 initial import
mandel
parents:
diff changeset
1955 }
e78566595089 initial import
mandel
parents:
diff changeset
1956
e78566595089 initial import
mandel
parents:
diff changeset
1957 QString CodeSnipFragment::code() const{
e78566595089 initial import
mandel
parents:
diff changeset
1958 if(m_instance)
e78566595089 initial import
mandel
parents:
diff changeset
1959 return m_instance->expandCode();
e78566595089 initial import
mandel
parents:
diff changeset
1960 else
e78566595089 initial import
mandel
parents:
diff changeset
1961 return m_code;
e78566595089 initial import
mandel
parents:
diff changeset
1962 }
e78566595089 initial import
mandel
parents:
diff changeset
1963
e78566595089 initial import
mandel
parents:
diff changeset
1964 QString FunctionModification::toString() const
e78566595089 initial import
mandel
parents:
diff changeset
1965 {
e78566595089 initial import
mandel
parents:
diff changeset
1966 QString str = signature + QLatin1String("->");
e78566595089 initial import
mandel
parents:
diff changeset
1967 if (modifiers & AccessModifierMask) {
e78566595089 initial import
mandel
parents:
diff changeset
1968 switch (modifiers & AccessModifierMask) {
e78566595089 initial import
mandel
parents:
diff changeset
1969 case Private: str += QLatin1String("private"); break;
e78566595089 initial import
mandel
parents:
diff changeset
1970 case Protected: str += QLatin1String("protected"); break;
e78566595089 initial import
mandel
parents:
diff changeset
1971 case Public: str += QLatin1String("public"); break;
e78566595089 initial import
mandel
parents:
diff changeset
1972 case Friendly: str += QLatin1String("friendly"); break;
e78566595089 initial import
mandel
parents:
diff changeset
1973 }
e78566595089 initial import
mandel
parents:
diff changeset
1974 }
e78566595089 initial import
mandel
parents:
diff changeset
1975
e78566595089 initial import
mandel
parents:
diff changeset
1976 if (modifiers & Final) str += QLatin1String("final");
e78566595089 initial import
mandel
parents:
diff changeset
1977 if (modifiers & NonFinal) str += QLatin1String("non-final");
e78566595089 initial import
mandel
parents:
diff changeset
1978
e78566595089 initial import
mandel
parents:
diff changeset
1979 if (modifiers & Readable) str += QLatin1String("readable");
e78566595089 initial import
mandel
parents:
diff changeset
1980 if (modifiers & Writable) str += QLatin1String("writable");
e78566595089 initial import
mandel
parents:
diff changeset
1981
e78566595089 initial import
mandel
parents:
diff changeset
1982 if (modifiers & CodeInjection) {
e78566595089 initial import
mandel
parents:
diff changeset
1983 foreach (CodeSnip s, snips) {
e78566595089 initial import
mandel
parents:
diff changeset
1984 str += QLatin1String("\n//code injection:\n");
e78566595089 initial import
mandel
parents:
diff changeset
1985 str += s.code();
e78566595089 initial import
mandel
parents:
diff changeset
1986 }
e78566595089 initial import
mandel
parents:
diff changeset
1987 }
e78566595089 initial import
mandel
parents:
diff changeset
1988
e78566595089 initial import
mandel
parents:
diff changeset
1989 if (modifiers & Rename) str += QLatin1String("renamed:") + renamedToName;
e78566595089 initial import
mandel
parents:
diff changeset
1990
e78566595089 initial import
mandel
parents:
diff changeset
1991 if (modifiers & Deprecated) str += QLatin1String("deprecate");
e78566595089 initial import
mandel
parents:
diff changeset
1992
e78566595089 initial import
mandel
parents:
diff changeset
1993 if (modifiers & ReplaceExpression) str += QLatin1String("replace-expression");
e78566595089 initial import
mandel
parents:
diff changeset
1994
e78566595089 initial import
mandel
parents:
diff changeset
1995 return str;
e78566595089 initial import
mandel
parents:
diff changeset
1996 }
e78566595089 initial import
mandel
parents:
diff changeset
1997
e78566595089 initial import
mandel
parents:
diff changeset
1998 static void removeFunction(ComplexTypeEntry *e, const char *signature)
e78566595089 initial import
mandel
parents:
diff changeset
1999 {
e78566595089 initial import
mandel
parents:
diff changeset
2000 FunctionModification mod;
e78566595089 initial import
mandel
parents:
diff changeset
2001 mod.signature = QMetaObject::normalizedSignature(signature);
e78566595089 initial import
mandel
parents:
diff changeset
2002 mod.removal = TypeSystem::All;
e78566595089 initial import
mandel
parents:
diff changeset
2003
e78566595089 initial import
mandel
parents:
diff changeset
2004 e->addFunctionModification(mod);
e78566595089 initial import
mandel
parents:
diff changeset
2005 }
e78566595089 initial import
mandel
parents:
diff changeset
2006
e78566595089 initial import
mandel
parents:
diff changeset
2007
e78566595089 initial import
mandel
parents:
diff changeset
2008
e78566595089 initial import
mandel
parents:
diff changeset
2009
e78566595089 initial import
mandel
parents:
diff changeset
2010 static void injectCode(ComplexTypeEntry *e,
e78566595089 initial import
mandel
parents:
diff changeset
2011 const char *signature,
e78566595089 initial import
mandel
parents:
diff changeset
2012 const QByteArray &code,
e78566595089 initial import
mandel
parents:
diff changeset
2013 const ArgumentMap &args,
e78566595089 initial import
mandel
parents:
diff changeset
2014 TypeSystem::Language lang = TypeSystem::NativeCode)
e78566595089 initial import
mandel
parents:
diff changeset
2015 {
e78566595089 initial import
mandel
parents:
diff changeset
2016 CodeSnip snip;
e78566595089 initial import
mandel
parents:
diff changeset
2017 snip.language = lang;
e78566595089 initial import
mandel
parents:
diff changeset
2018 snip.position = CodeSnip::Beginning;
e78566595089 initial import
mandel
parents:
diff changeset
2019 snip.addCode(QString::fromLatin1(code));
e78566595089 initial import
mandel
parents:
diff changeset
2020 snip.argumentMap = args;
e78566595089 initial import
mandel
parents:
diff changeset
2021
e78566595089 initial import
mandel
parents:
diff changeset
2022 FunctionModification mod;
e78566595089 initial import
mandel
parents:
diff changeset
2023 mod.signature = QMetaObject::normalizedSignature(signature);
e78566595089 initial import
mandel
parents:
diff changeset
2024 mod.snips << snip;
e78566595089 initial import
mandel
parents:
diff changeset
2025 mod.modifiers = Modification::CodeInjection;
e78566595089 initial import
mandel
parents:
diff changeset
2026 e->addFunctionModification(mod);
e78566595089 initial import
mandel
parents:
diff changeset
2027 }
e78566595089 initial import
mandel
parents:
diff changeset
2028
e78566595089 initial import
mandel
parents:
diff changeset
2029
e78566595089 initial import
mandel
parents:
diff changeset
2030 static void addRemoveFunctionToTemplates(TypeDatabase *db)
e78566595089 initial import
mandel
parents:
diff changeset
2031 {
e78566595089 initial import
mandel
parents:
diff changeset
2032 ContainerTypeEntry *qvector = db->findContainerType(QLatin1String("QVector"));
e78566595089 initial import
mandel
parents:
diff changeset
2033 removeFunction(qvector, "constData() const");
e78566595089 initial import
mandel
parents:
diff changeset
2034 removeFunction(qvector, "data() const");
e78566595089 initial import
mandel
parents:
diff changeset
2035 removeFunction(qvector, "data()");
e78566595089 initial import
mandel
parents:
diff changeset
2036 removeFunction(qvector, "first()");
e78566595089 initial import
mandel
parents:
diff changeset
2037 removeFunction(qvector, "last()");
e78566595089 initial import
mandel
parents:
diff changeset
2038 removeFunction(qvector, "operator[](int)");
e78566595089 initial import
mandel
parents:
diff changeset
2039 removeFunction(qvector, "operator[](int) const");
e78566595089 initial import
mandel
parents:
diff changeset
2040 removeFunction(qvector, "operator=(QVector<T>)");
e78566595089 initial import
mandel
parents:
diff changeset
2041
e78566595089 initial import
mandel
parents:
diff changeset
2042 ContainerTypeEntry *qlist = db->findContainerType(QLatin1String("QList"));
e78566595089 initial import
mandel
parents:
diff changeset
2043 removeFunction(qlist, "constData() const");
e78566595089 initial import
mandel
parents:
diff changeset
2044 removeFunction(qlist, "data() const");
e78566595089 initial import
mandel
parents:
diff changeset
2045 removeFunction(qlist, "data()");
e78566595089 initial import
mandel
parents:
diff changeset
2046 removeFunction(qlist, "back()");
e78566595089 initial import
mandel
parents:
diff changeset
2047 removeFunction(qlist, "front()");
e78566595089 initial import
mandel
parents:
diff changeset
2048 removeFunction(qlist, "first()");
e78566595089 initial import
mandel
parents:
diff changeset
2049 removeFunction(qlist, "last()");
e78566595089 initial import
mandel
parents:
diff changeset
2050 removeFunction(qlist, "operator[](int)");
e78566595089 initial import
mandel
parents:
diff changeset
2051 removeFunction(qlist, "operator[](int) const");
e78566595089 initial import
mandel
parents:
diff changeset
2052 removeFunction(qlist, "operator=(QList<T>)");
e78566595089 initial import
mandel
parents:
diff changeset
2053
e78566595089 initial import
mandel
parents:
diff changeset
2054 ContainerTypeEntry *qqueue = db->findContainerType(QLatin1String("QQueue"));
e78566595089 initial import
mandel
parents:
diff changeset
2055 removeFunction(qqueue, "head() const");
e78566595089 initial import
mandel
parents:
diff changeset
2056
e78566595089 initial import
mandel
parents:
diff changeset
2057
e78566595089 initial import
mandel
parents:
diff changeset
2058 ArgumentMap args1;
e78566595089 initial import
mandel
parents:
diff changeset
2059 args1[1] = QLatin1String("$1");
e78566595089 initial import
mandel
parents:
diff changeset
2060 ArgumentMap args2 = args1;
e78566595089 initial import
mandel
parents:
diff changeset
2061 args2[2] = QLatin1String("$2");
e78566595089 initial import
mandel
parents:
diff changeset
2062
e78566595089 initial import
mandel
parents:
diff changeset
2063 QByteArray code =
e78566595089 initial import
mandel
parents:
diff changeset
2064 "\nif ($1 >= __qt_this->size() || $1 < 0) {"
e78566595089 initial import
mandel
parents:
diff changeset
2065 "\n __jni_env->ThrowNew(__jni_env->FindClass(\"java/lang/IndexOutOfBoundsException\"),"
e78566595089 initial import
mandel
parents:
diff changeset
2066 "\n QString::fromLatin1(\"Accessing container of size %3 at %4\")"
e78566595089 initial import
mandel
parents:
diff changeset
2067 "\n .arg(__qt_this->size()).arg($1).toLatin1());"
e78566595089 initial import
mandel
parents:
diff changeset
2068 "\n return;"
e78566595089 initial import
mandel
parents:
diff changeset
2069 "\n}";
e78566595089 initial import
mandel
parents:
diff changeset
2070
e78566595089 initial import
mandel
parents:
diff changeset
2071 QByteArray code_with_return = QByteArray(code).replace("return;", "return 0;");
e78566595089 initial import
mandel
parents:
diff changeset
2072
e78566595089 initial import
mandel
parents:
diff changeset
2073 QByteArray code_index_length =
e78566595089 initial import
mandel
parents:
diff changeset
2074 "\nif ($1 < 0 || $2 < 0 || ($1 + $2) >= __qt_this->size()) {"
e78566595089 initial import
mandel
parents:
diff changeset
2075 "\n __jni_env->ThrowNew(__jni_env->FindClass(\"java/lang/IndexOutOfBoundsException\"),"
e78566595089 initial import
mandel
parents:
diff changeset
2076 "\n QString::fromLatin1(\"Accessing container of size %3 from %4 to %5\")"
e78566595089 initial import
mandel
parents:
diff changeset
2077 "\n .arg(__qt_this->size()).arg($1).arg($1+$2).toLatin1());"
e78566595089 initial import
mandel
parents:
diff changeset
2078 "\n return;"
e78566595089 initial import
mandel
parents:
diff changeset
2079 "\n}";
e78566595089 initial import
mandel
parents:
diff changeset
2080
e78566595089 initial import
mandel
parents:
diff changeset
2081 QByteArray code_non_empty =
e78566595089 initial import
mandel
parents:
diff changeset
2082 "\nif (__qt_this->isEmpty()) {"
e78566595089 initial import
mandel
parents:
diff changeset
2083 "\n __jni_env->ThrowNew(__jni_env->FindClass(\"java/lang/IndexOutOfBoundsException\"),"
e78566595089 initial import
mandel
parents:
diff changeset
2084 "\n QString::fromLatin1(\"Accessing empty container...\").toLatin1());"
e78566595089 initial import
mandel
parents:
diff changeset
2085 "\n return;"
e78566595089 initial import
mandel
parents:
diff changeset
2086 "\n}";
e78566595089 initial import
mandel
parents:
diff changeset
2087
e78566595089 initial import
mandel
parents:
diff changeset
2088 QByteArray code_two_indices =
e78566595089 initial import
mandel
parents:
diff changeset
2089 "\nif ($1 < 0 || $2 < 0 || $1 >= __qt_this->size() || $2 >= __qt_this->size()) {"
e78566595089 initial import
mandel
parents:
diff changeset
2090 "\n __jni_env->ThrowNew(__jni_env->FindClass(\"java/lang/IndexOutOfBoundsException\"),"
e78566595089 initial import
mandel
parents:
diff changeset
2091 "\n QString::fromLatin1(\"Accessing container of size %3 from %4 to %5\")"
e78566595089 initial import
mandel
parents:
diff changeset
2092 "\n .arg(__qt_this->size()).arg($1).arg($1+$2).toLatin1());"
e78566595089 initial import
mandel
parents:
diff changeset
2093 "\n return;"
e78566595089 initial import
mandel
parents:
diff changeset
2094 "\n}";
e78566595089 initial import
mandel
parents:
diff changeset
2095 /* qtd2
e78566595089 initial import
mandel
parents:
diff changeset
2096 { // QVector safty...
e78566595089 initial import
mandel
parents:
diff changeset
2097 injectCode(qvector, "at(int) const", code_with_return, args1, TypeSystem::TargetLangCode);
e78566595089 initial import
mandel
parents:
diff changeset
2098 injectCode(qvector, "replace(int,T)", code, args1, TypeSystem::TargetLangCode);
e78566595089 initial import
mandel
parents:
diff changeset
2099 injectCode(qvector, "remove(int)", code, args1, TypeSystem::TargetLangCode);
e78566595089 initial import
mandel
parents:
diff changeset
2100 injectCode(qvector, "remove(int, int)", code_index_length, args2, TypeSystem::TargetLangCode);
e78566595089 initial import
mandel
parents:
diff changeset
2101 injectCode(qvector, "pop_back()", code_non_empty, ArgumentMap(), TypeSystem::TargetLangCode);
e78566595089 initial import
mandel
parents:
diff changeset
2102 injectCode(qvector, "pop_front()", code_non_empty, ArgumentMap(), TypeSystem::TargetLangCode);
e78566595089 initial import
mandel
parents:
diff changeset
2103 }
e78566595089 initial import
mandel
parents:
diff changeset
2104
e78566595089 initial import
mandel
parents:
diff changeset
2105 { // QList safty...
e78566595089 initial import
mandel
parents:
diff changeset
2106 injectCode(qlist, "at(int) const", code_with_return, args1);
e78566595089 initial import
mandel
parents:
diff changeset
2107 injectCode(qlist, "replace(int, T)", code, args1);
e78566595089 initial import
mandel
parents:
diff changeset
2108 injectCode(qlist, "pop_back()", code_non_empty, ArgumentMap());
e78566595089 initial import
mandel
parents:
diff changeset
2109 injectCode(qlist, "pop_front()", code_non_empty, ArgumentMap());
e78566595089 initial import
mandel
parents:
diff changeset
2110 injectCode(qlist, "swap(int, int)", code_two_indices, args2);
e78566595089 initial import
mandel
parents:
diff changeset
2111 injectCode(qlist, "move(int, int)", code_two_indices, args2);
e78566595089 initial import
mandel
parents:
diff changeset
2112 injectCode(qlist, "removeAt(int)", code, args1);
e78566595089 initial import
mandel
parents:
diff changeset
2113 injectCode(qlist, "takeAt(int)", code_with_return, args1);
e78566595089 initial import
mandel
parents:
diff changeset
2114 }
e78566595089 initial import
mandel
parents:
diff changeset
2115 */
e78566595089 initial import
mandel
parents:
diff changeset
2116 }