📄 generator.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the tools applications of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "generator.h"#include "outputrevision.h"#include "utils.h"#include <stdio.h>// if the flags change, you MUST to change it in qmetaobject.cpp tooenum PropertyFlags { Invalid = 0x00000000, Readable = 0x00000001, Writable = 0x00000002, Resetable = 0x00000004, EnumOrFlag = 0x00000008, StdCppSet = 0x00000100,// Override = 0x00000200, Designable = 0x00001000, ResolveDesignable = 0x00002000, Scriptable = 0x00004000, ResolveScriptable = 0x00008000, Stored = 0x00010000, ResolveStored = 0x00020000, Editable = 0x00040000, ResolveEditable = 0x00080000, User = 0x00100000, ResolveUser = 0x00200000};enum MethodFlags { AccessPrivate = 0x00, AccessProtected = 0x01, AccessPublic = 0x02, MethodMethod = 0x00, MethodSignal = 0x04, MethodSlot = 0x08, MethodCompatibility = 0x10, MethodCloned = 0x20, MethodScriptable = 0x40};/* Attention! This table is copied from qvariant.cpp. If you change one, change both.*/enum { CoreTypeCount = 28 };static const char* const core_type_map[CoreTypeCount] ={ 0, "bool", "int", "uint", "qlonglong", "qulonglong", "double", "QChar", "QVariantMap", "QVariantList", "QString", "QStringList", "QByteArray", "QBitArray", "QDate", "QTime", "QDateTime", "QUrl", "QLocale", "QRect", "QRectF", "QSize", "QSizeF", "QLine", "QLineF", "QPoint", "QPointF", "QRegExp"};enum { GuiTypeCount = 79 - 63 + 1 };static const char* const gui_type_map[GuiTypeCount] ={ "QColorGroup", "QFont", "QPixmap", "QBrush", "QColor", "QPalette", "QIcon", "QImage", "QPolygon", "QRegion", "QBitmap", "QCursor", "QSizePolicy", "QKeySequence", "QPen", "QTextLength", "QTextFormat"};int qvariant_nameToType(const char* name){ if (name) { if (strcmp(name, "QVariant") == 0) return 0xffffffff; if (strcmp(name, "QCString") == 0) name = "QByteArray"; else if (strcmp(name, "Q_LLONG") == 0) name = "qlonglong"; else if (strcmp(name, "Q_ULLONG") == 0) name = "qulonglong"; else if (strcmp(name, "QIconSet") == 0) name = "QIcon"; int i; for (i = 1; i < CoreTypeCount; ++i) { if (strcmp(core_type_map[i], name) == 0) return i; } for (i = 0; i < GuiTypeCount; ++i) { if (strcmp(gui_type_map[i], name) == 0) return (i + 63); } } return 0;}/* Returns true if the type is a QVariant types.*/bool isVariantType(const char* type){ return qvariant_nameToType(type) != 0;}Generator::Generator(FILE *outfile, ClassDef *classDef) :out(outfile), cdef(classDef){ if (cdef->superclassList.size()) purestSuperClass = cdef->superclassList.first().first;}int Generator::strreg(const char *s){ int idx = 0; if (!s) s = ""; for (int i = 0; i < strings.size(); ++i) { const QByteArray &str = strings.at(i); if (str == s) return idx; idx += str.length() + 1; idx -= str.count('\\'); } strings.append(s); return idx;}void Generator::generateCode(){ bool isQt = (cdef->classname == "Qt"); bool isQObject = (cdef->classname == "QObject");//// build the data array// int i = 0; // filter out undeclared enumerators and sets { QList<EnumDef> enumList; for (i = 0; i < cdef->enumList.count(); ++i) { EnumDef def = cdef->enumList.at(i); if (cdef->enumDeclarations.contains(def.name)) { enumList += def; } QByteArray alias = cdef->flagAliases.value(def.name); if (cdef->enumDeclarations.contains(alias)) { def.name = alias; enumList += def; } } cdef->enumList = enumList; } QByteArray qualifiedClassNameIdentifier = cdef->qualified; qualifiedClassNameIdentifier.replace(':', '_'); int index = 10; fprintf(out, "static const uint qt_meta_data_%s[] = {\n", qualifiedClassNameIdentifier.constData()); fprintf(out, "\n // content:\n"); fprintf(out, " %4d, // revision\n", 1); fprintf(out, " %4d, // classname\n", strreg(cdef->qualified)); fprintf(out, " %4d, %4d, // classinfo\n", cdef->classInfoList.count(), cdef->classInfoList.count() ? index : 0); index += cdef->classInfoList.count() * 2; int methodCount = cdef->signalList.count() + cdef->slotList.count() + cdef->methodList.count(); fprintf(out, " %4d, %4d, // methods\n", methodCount, methodCount ? index : 0); index += methodCount * 5; fprintf(out, " %4d, %4d, // properties\n", cdef->propertyList.count(), cdef->propertyList.count() ? index : 0); index += cdef->propertyList.count() * 3; fprintf(out, " %4d, %4d, // enums/sets\n", cdef->enumList.count(), cdef->enumList.count() ? index : 0);//// Build classinfo array// generateClassInfos();//// Build signals array first, otherwise the signal indices would be wrong// generateFunctions(cdef->signalList, "signal", MethodSignal);//// Build slots array// generateFunctions(cdef->slotList, "slot", MethodSlot);//// Build method array// generateFunctions(cdef->methodList, "method", MethodMethod);//// Build property array// generateProperties();//// Build enums array// generateEnums(index);//// Terminate data array// fprintf(out, "\n 0 // eod\n};\n\n");//// Build stringdata array// fprintf(out, "static const char qt_meta_stringdata_%s[] = {\n", qualifiedClassNameIdentifier.constData()); fprintf(out, " \""); int col = 0; int len = 0; for (i = 0; i < strings.size(); ++i) { QByteArray s = strings.at(i); len = s.length(); if (col && col + len >= 72) { fprintf(out, "\"\n \""); col = 0; } else if (len && s.at(0) >= '0' && s.at(0) <= '9') { fprintf(out, "\"\""); len += 2; } fprintf(out, "%s\\0", s.constData()); col += len + 2; } fprintf(out, "\"\n};\n\n");//// Build extra array// QList<QByteArray> extraList; for (int i = 0; i < cdef->propertyList.count(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); if (!isVariantType(p.type)) { int s = p.type.indexOf("::"); if (s > 0) { QByteArray scope = p.type.left(s); if (scope != "Qt" && scope != cdef->classname && !extraList.contains(scope)) extraList += scope; } } } if (!extraList.isEmpty()) { fprintf(out, "static const QMetaObject *qt_meta_extradata_%s[] = {\n ", qualifiedClassNameIdentifier.constData()); for (int i = 0; i < extraList.count(); ++i) { if (i) fprintf(out, ",\n ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -