⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generator.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
            fprintf(out, "    &%s::staticMetaObject", extraList.at(i).constData());        }        fprintf(out, ",0\n};\n\n");    }//// Finally create and initialize the static meta object//    if (isQt)        fprintf(out, "const QMetaObject QObject::staticQtMetaObject = {\n");    else        fprintf(out, "const QMetaObject %s::staticMetaObject = {\n", cdef->qualified.constData());    if (isQObject)        fprintf(out, "    { 0, ");    else if (cdef->superclassList.size())        fprintf(out, "    { &%s::staticMetaObject, ", purestSuperClass.constData());    else        fprintf(out, "    { 0, ");    fprintf(out, "qt_meta_stringdata_%s,\n      qt_meta_data_%s, ",             qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData());    if (extraList.isEmpty())        fprintf(out, "0 }\n");    else        fprintf(out, "qt_meta_extradata_%s }\n", qualifiedClassNameIdentifier.constData());    fprintf(out, "};\n");    if (isQt || !cdef->hasQObject)        return;    fprintf(out, "\nconst QMetaObject *%s::metaObject() const\n{\n    return &staticMetaObject;\n}\n",            cdef->qualified.constData());//// Generate smart cast function//    fprintf(out, "\nvoid *%s::qt_metacast(const char *_clname)\n{\n", cdef->qualified.constData());    fprintf(out, "    if (!_clname) return 0;\n");    fprintf(out, "    if (!strcmp(_clname, qt_meta_stringdata_%s))\n"                  "\treturn static_cast<void*>(const_cast<%s*>(this));\n",            qualifiedClassNameIdentifier.constData(), cdef->classname.constData());    for (int i = 1; i < cdef->superclassList.size(); ++i) { // for all superclasses but the first one        if (cdef->superclassList.at(i).second == FunctionDef::Private)            continue;        const char *cname = cdef->superclassList.at(i).first;        fprintf(out, "    if (!strcmp(_clname, \"%s\"))\n\treturn static_cast<%s*>(const_cast<%s*>(this));\n",                cname, cname, cdef->classname.constData());    }    for (int i = 0; i < cdef->interfaceList.size(); ++i) {        const QList<ClassDef::Interface> &iface = cdef->interfaceList.at(i);        for (int j = 0; j < iface.size(); ++j) {            fprintf(out, "    if (!strcmp(_clname, %s))\n\treturn ", iface.at(j).interfaceId.constData());            for (int k = j; k >= 0; --k)                fprintf(out, "static_cast<%s*>(", iface.at(k).className.constData());            fprintf(out, "const_cast<%s*>(this)%s;\n",                    cdef->classname.constData(), QByteArray(j+1, ')').constData());        }    }    if (!purestSuperClass.isEmpty() && !isQObject) {        QByteArray superClass = purestSuperClass;        // workaround for VC6        if (superClass.contains("::")) {            fprintf(out, "    typedef %s QMocSuperClass;\n", superClass.constData());            superClass = "QMocSuperClass";        }        fprintf(out, "    return %s::qt_metacast(_clname);\n", superClass.constData());    } else {        fprintf(out, "    return 0;\n");    }    fprintf(out, "}\n");//// Generate internal qt_metacall()  function//    generateMetacall();//// Generate internal signal functions//    for (int signalindex = 0; signalindex < cdef->signalList.size(); ++signalindex)        generateSignal(&cdef->signalList[signalindex], signalindex);}void Generator::generateClassInfos(){    if (cdef->classInfoList.isEmpty())        return;    fprintf(out, "\n // classinfo: key, value\n");    for (int i = 0; i < cdef->classInfoList.size(); ++i) {        const ClassInfoDef &c = cdef->classInfoList.at(i);        fprintf(out, "    %4d, %4d,\n", strreg(c.name), strreg(c.value));    }}void Generator::generateFunctions(QList<FunctionDef>& list, const char *functype, int type){    if (list.isEmpty())        return;    fprintf(out, "\n // %ss: signature, parameters, type, tag, flags\n", functype);    for (int i = 0; i < list.count(); ++i) {        const FunctionDef &f = list.at(i);        QByteArray sig = f.name + '(';        QByteArray arguments;        for (int j = 0; j < f.arguments.count(); ++j) {            const ArgumentDef &a = f.arguments.at(j);            if (j) {                sig += ",";                arguments += ",";            }            sig += a.normalizedType;            arguments += a.name;        }        sig += ')';        char flags = type;        if (f.access == FunctionDef::Private)            flags |= AccessPrivate;        else if (f.access == FunctionDef::Public)            flags |= AccessPublic;        else if (f.access == FunctionDef::Protected)            flags |= AccessProtected;        if (f.access == FunctionDef::Private)            flags |= AccessPrivate;        else if (f.access == FunctionDef::Public)            flags |= AccessPublic;        else if (f.access == FunctionDef::Protected)            flags |= AccessProtected;        if (f.isCompat)            flags |= MethodCompatibility;        if (f.wasCloned)            flags |= MethodCloned;        if (f.isScriptable)            flags |= MethodScriptable;        fprintf(out, "    %4d, %4d, %4d, %4d, 0x%02x,\n", strreg(sig),                strreg(arguments), strreg(f.normalizedType), strreg(f.tag), flags);    }}void Generator::generateProperties(){    //    // specify get function, for compatibiliy we accept functions    // returning pointers, or const char * for QByteArray.    //    for (int i = 0; i < cdef->propertyList.count(); ++i) {        PropertyDef &p = cdef->propertyList[i];        if (p.read.isEmpty())            continue;        for (int j = 0; j < cdef->publicList.count(); ++j) {            const FunctionDef &f = cdef->publicList.at(j);            if (f.name != p.read)                continue;            if (!f.isConst) // get  functions must be const                continue;            if (f.arguments.size()) // and must not take any arguments                continue;            PropertyDef::Specification spec = PropertyDef::ValueSpec;            QByteArray tmp = f.normalizedType;            if (p.type == "QByteArray" && tmp == "const char *")                    tmp = "QByteArray";            if (tmp.left(6) == "const ")                tmp = tmp.mid(6);            if (p.type != tmp && tmp.endsWith('*')) {                tmp.chop(1);                spec = PropertyDef::PointerSpec;            } else if (f.type.name.endsWith('&')) { // raw type, not normalized type                spec = PropertyDef::ReferenceSpec;            }            if (p.type != tmp)                continue;            p.gspec = spec;            break;        }    }    //    // Create meta data    //    if (cdef->propertyList.count())        fprintf(out, "\n // properties: name, type, flags\n");    for (int i = 0; i < cdef->propertyList.count(); ++i) {        const PropertyDef &p = cdef->propertyList.at(i);        int flags = Invalid;        if (!isVariantType(p.type)) {            flags |= EnumOrFlag;        } else {            flags |= qvariant_nameToType(p.type) << 24;        }        if (!p.read.isEmpty())            flags |= Readable;        if (!p.write.isEmpty()) {            flags |= Writable;            if (p.stdCppSet())                flags |= StdCppSet;        }        if (!p.reset.isEmpty())            flags |= Resetable;//         if (p.override)//             flags |= Override;        if (p.designable.isEmpty())            flags |= ResolveDesignable;        else if (p.designable != "false")            flags |= Designable;        if (p.scriptable.isEmpty())            flags |= ResolveScriptable;        else if (p.scriptable != "false")            flags |= Scriptable;        if (p.stored.isEmpty())            flags |= ResolveStored;        else if (p.stored != "false")            flags |= Stored;        if (p.editable.isEmpty())            flags |= ResolveEditable;        else if (p.editable != "false")            flags |= Editable;                if (p.user.isEmpty())            flags |= ResolveUser;        else if (p.user != "false")            flags |= User;                fprintf(out, "    %4d, %4d, 0x%.8x,\n",                 strreg(p.name),                 strreg(p.type),                 flags);    }}void Generator::generateEnums(int index){    if (cdef->enumDeclarations.isEmpty())        return;    fprintf(out, "\n // enums: name, flags, count, data\n");    index += 4 * cdef->enumList.count();    int i;    for (i = 0; i < cdef->enumList.count(); ++i) {        const EnumDef &e = cdef->enumList.at(i);        fprintf(out, "    %4d, 0x%.1x, %4d, %4d,\n",                 strreg(e.name),                 cdef->enumDeclarations.value(e.name) ? 1 : 0,                 e.values.count(),                 index);        index += e.values.count() * 2;    }    fprintf(out, "\n // enum data: key, value\n");    for (i = 0; i < cdef->enumList.count(); ++i) {        const EnumDef &e = cdef->enumList.at(i);        for (int j = 0; j < e.values.count(); ++j) {            const QByteArray &val = e.values.at(j);            fprintf(out, "    %4d, uint(%s::%s),\n",                    strreg(val),                    cdef->qualified.constData(),                    val.constData());        }    }}void Generator::generateMetacall(){    bool isQObject = (cdef->classname == "QObject");    fprintf(out, "\nint %s::qt_metacall(QMetaObject::Call _c, int _id, void **_a)\n{\n",             cdef->qualified.constData());    if (!purestSuperClass.isEmpty() && !isQObject) {        QByteArray superClass = purestSuperClass;        // workaround for VC6        if (superClass.contains("::")) {            fprintf(out, "    typedef %s QMocSuperClass;\n", superClass.constData());            superClass = "QMocSuperClass";        }        fprintf(out, "    _id = %s::qt_metacall(_c, _id, _a);\n", superClass.constData());    }    fprintf(out, "    if (_id < 0)\n        return _id;\n");    fprintf(out, "    ");    bool needElse = false;    QList<FunctionDef> methodList;    methodList += cdef->signalList;    methodList += cdef->slotList;    methodList += cdef->methodList;    if (methodList.size()) {        needElse = true;        fprintf(out, "if (_c == QMetaObject::InvokeMetaMethod) {\n        ");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -