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

📄 moc.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
            error();    }    if (scopedFunctionName) {        QByteArray msg("Function declaration ");        msg += def->name;        msg += " contains extra qualification. Ignoring as signal or slot.";        warning(msg.constData());        return false;    }    return true;}// like parseFunction, but never aborts with an errorbool Moc::parseMaybeFunction(FunctionDef *def){    def->type = parseType();    if (def->type.name.isEmpty())        return false;    bool scopedFunctionName = false;    if (test(LPAREN)) {        def->name = def->type.name;        scopedFunctionName = def->type.isScoped;        def->type = Type("int");    } else {        Type tempType = parseType();;        while (!tempType.name.isEmpty() && lookup() != LPAREN) {            if (def->type.name == "QT_MOC_COMPAT" || def->type.name == "QT3_SUPPORT")                def->isCompat = true;            else if (def->type.name == "Q_INVOKABLE")                def->isInvokable = true;            else if (def->type.name == "Q_SCRIPTABLE")                def->isInvokable = def->isScriptable = true;            else if (def->type.name == "Q_SIGNAL")                def->isSignal = true;            else if (def->type.name == "Q_SLOT")                def->isSlot = true;            else {                if (!def->tag.isEmpty())                    def->tag += ' ';                def->tag += def->type.name;            }            def->type = tempType;            tempType = parseType();        }        if (!test(LPAREN))            return false;        def->name = tempType.name;        scopedFunctionName = tempType.isScoped;    }    // we don't support references as return types, it's too dangerous    if (def->type.referenceType == Type::Reference)        def->type = Type("void");    def->normalizedType = normalizeType(def->type.name);    if (!test(RPAREN)) {        parseFunctionArguments(def);        if (!test(RPAREN))            return false;    }    def->isConst = test(CONST);    if (scopedFunctionName        && (def->isSignal || def->isSlot || def->isInvokable)) {        QByteArray msg("parsemaybe: Function declaration ");        msg += def->name;        msg += " contains extra qualification. Ignoring as signal or slot.";        warning(msg.constData());        return false;    }    return true;}void Moc::parse(){    QList<NamespaceDef> namespaceList;    bool templateClass = false;    while (hasNext()) {        Token t = next();        switch (t) {            case NAMESPACE: {                int rewind = index;                if (test(IDENTIFIER)) {                    if (test(EQ)) {                        // namespace Foo = Bar::Baz;                        until(SEMIC);                    } else if (!test(SEMIC)) {                        NamespaceDef def;                        def.name = lexem();                        next(LBRACE);                        def.begin = index - 1;                        until(RBRACE);                        def.end = index;                        index = def.begin + 1;                        namespaceList += def;                        index = rewind;                    }                }                break;            }            case SEMIC:            case RBRACE:                templateClass = false;                break;            case TEMPLATE:                templateClass = true;                break;            case MOC_INCLUDE_BEGIN:                currentFilenames.push(symbol().unquotedLexem());                break;            case MOC_INCLUDE_END:                currentFilenames.pop();                break;            case Q_DECLARE_INTERFACE_TOKEN:                parseDeclareInterface();                break;            case Q_DECLARE_METATYPE_TOKEN:                parseDeclareMetatype();                break;            case USING:                if (test(NAMESPACE)) {                    while (test(SCOPE) || test(IDENTIFIER))                        ;                    next(SEMIC);                }                break;            case CLASS:            case STRUCT: {                if (currentFilenames.size() <= 1)                    break;                ClassDef def;                if (!parseClassHead(&def))                    continue;                while (inClass(&def) && hasNext()) {                    if (next() == Q_OBJECT_TOKEN) {                        def.hasQObject = true;                        break;                    }                }                if (!def.hasQObject)                    continue;                for (int i = namespaceList.size() - 1; i >= 0; --i)                    if (inNamespace(&namespaceList.at(i)))                        def.qualified.prepend(namespaceList.at(i).name + "::");                knownQObjectClasses.insert(def.classname);                knownQObjectClasses.insert(def.qualified);                continue; }            default: break;        }        if ((t != CLASS && t != STRUCT)|| currentFilenames.size() > 1)            continue;        ClassDef def;        if (parseClassHead(&def)) {            FunctionDef::Access access = FunctionDef::Private;            for (int i = namespaceList.size() - 1; i >= 0; --i)                if (inNamespace(&namespaceList.at(i)))                    def.qualified.prepend(namespaceList.at(i).name + "::");            while (inClass(&def) && hasNext()) {                switch ((t = next())) {                case PRIVATE:                    access = FunctionDef::Private;                    if (test(Q_SIGNALS_TOKEN))                        error("Signals cannot have access specifier");                    break;                case PROTECTED:                    access = FunctionDef::Protected;                    if (test(Q_SIGNALS_TOKEN))                        error("Signals cannot have access specifier");                    break;                case PUBLIC:                    access = FunctionDef::Public;                    if (test(Q_SIGNALS_TOKEN))                        error("Signals cannot have access specifier");                    break;                case CLASS: {                    ClassDef nestedDef;                    if (parseClassHead(&nestedDef)) {                        while (inClass(&nestedDef) && inClass(&def)) {                            t = next();                            if (t >= Q_META_TOKEN_BEGIN && t < Q_META_TOKEN_END)                                error("Meta object features not supported for nested classes");                        }                    }                } break;                case Q_SIGNALS_TOKEN:                    parseSignals(&def);                    break;                case Q_SLOTS_TOKEN:                    switch (lookup(-1)) {                    case PUBLIC:                    case PROTECTED:                    case PRIVATE:                        parseSlots(&def, access);                        break;                    default:                        error("Missing access specifier for slots");                    }                    break;                case Q_OBJECT_TOKEN:                    def.hasQObject = true;                    if (templateClass)                        error("Template classes not supported by Q_OBJECT");                    if (def.classname != "Qt" && def.classname != "QObject" && def.superclassList.isEmpty())                        error("Class contains Q_OBJECT macro but does not inherit from QObject");                    break;                case Q_GADGET_TOKEN:                    def.hasQGadget = true;                    if (templateClass)                        error("Template classes not supported by Q_GADGET");                    break;                case Q_PROPERTY_TOKEN:                    parseProperty(&def);                    break;                case Q_ENUMS_TOKEN:                    parseEnumOrFlag(&def, false);                    break;                case Q_FLAGS_TOKEN:                    parseEnumOrFlag(&def, true);                    break;                case Q_DECLARE_FLAGS_TOKEN:                    parseFlag(&def);                    break;                case Q_CLASSINFO_TOKEN:                    parseClassInfo(&def);                    break;                case Q_INTERFACES_TOKEN:                    parseInterfaces(&def);                    break;                case Q_PRIVATE_SLOT_TOKEN:                    parseSlotInPrivate(&def, access);                    break;                case ENUM: {                    EnumDef enumDef;                    if (parseEnum(&enumDef))                        def.enumList += enumDef;                } break;                default:                    FunctionDef funcDef;                    funcDef.access = access;                    int rewind = index;                    if (parseMaybeFunction(&funcDef)) {                        if (access == FunctionDef::Public)                            def.publicList += funcDef;                        if (funcDef.isSlot) {                            def.slotList += funcDef;                            while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {                                funcDef.wasCloned = true;                                funcDef.arguments.removeLast();                                def.slotList += funcDef;                            }                        } else if (funcDef.isSignal) {                            def.signalList += funcDef;                            while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {                                funcDef.wasCloned = true;                                funcDef.arguments.removeLast();                                def.signalList += funcDef;                            }                        } else if (funcDef.isInvokable) {                            def.methodList += funcDef;                            while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {                                funcDef.wasCloned = true;                                funcDef.arguments.removeLast();                                def.methodList += funcDef;                            }                        }                    } else {                        index = rewind;                    }                }            }            next(RBRACE);            if (!def.hasQObject && def.signalList.isEmpty() && def.slotList.isEmpty()                && def.propertyList.isEmpty() && def.enumDeclarations.isEmpty())                continue; // no meta object code required            if (!def.hasQObject && !def.hasQGadget)                error("Class declarations lacks Q_OBJECT macro.");            checkSuperClasses(&def);            classList += def;            knownQObjectClasses.insert(def.classname);            knownQObjectClasses.insert(def.qualified);        }    }}void Moc::generate(FILE *out){    QDateTime dt = QDateTime::currentDateTime();    QByteArray dstr = dt.toString().toLatin1();    QByteArray fn = filename;    int i = filename.length()-1;    while (i>0 && filename[i-1] != '/' && filename[i-1] != '\\')        --i;                                // skip path    if (i >= 0)        fn = filename.mid(i);    fprintf(out, "/****************************************************************************\n"            "** Meta object code from reading C++ file '%s'\n**\n" , (const char*)fn);    fprintf(out, "** Created: %s\n"            "**      by: The Qt Meta Object Compiler version %d (Qt %s)\n**\n" , dstr.data(), mocOutputRevision, QT_VERSION_STR);    fprintf(out, "** WARNING! All changes made in this file will be lost!\n"            "*****************************************************************************/\n\n");    if (!noInclude) {        if (includePath.size() && includePath.right(1) != "/")            includePath += "/";        for (int i = 0; i < includeFiles.size(); ++i) {            QByteArray inc = includeFiles.at(i);            if (inc[0] != '<' && inc[0] != '"') {                if (includePath.size() && includePath != "./")                    inc.prepend(includePath);                inc = "\"" + inc + "\"";            }            fprintf(out, "#include %s\n", inc.constData());        }    }    if (classList.size() && classList.first().classname == "Qt")        fprintf(out, "#include <QtCore/qobject.h>\n");    fprintf(out, "#if !defined(Q_MOC_OUTPUT_REVISION)\n"            "#error \"The header file '%s' doesn't include <QObject>.\"\n", (const char *)fn);    fprintf(out, "#elif Q_MOC_OUTPUT_REVISION != %d\n", mocOutputRevision);    fprintf(out, "#error \"This file was generated using the moc from %s."            " It\"\n#error \"cannot be used with the include files from"            " this version of Qt.\"\n#error \"(The moc has changed too"            " much.)\"\n", QT_VERSION_STR);    fprintf(out, "#endif\n\n");    for (i = 0; i < classList.size(); ++i) {        Generator generator(&classList[i], metaTypes, out);        generator.generateCode();    }}QList<QMetaObject*> Moc::generate(bool ignoreProperties){    QList<QMetaObject*> result;    for (int i = 0; i < classList.size(); ++i) {        Generator generator(&classList[i], metaTypes);        result << generator.generateMetaObject(ignoreProperties);    }    return result;}void Moc::parseSlots(ClassDef *def, FunctionDef::Access access){    next(COLON);    while (inClass(def) && hasNext()) {        switch (next()) {        case PUBLIC:        case PROTECTED:        case PRIVATE:        case Q_SIGNALS_TOKEN:        case Q_SLOTS_TOKEN:            prev();            return;        case SEMIC:            continue;        case FRIEND:            until(SEMIC);            continue;        case USING:            error("'using' directive not supported in 'slots' section");        default:            prev();        }        FunctionDef funcDef;        funcDef.access = access;        if (!parseFunction(&funcDef))            continue;        def->slotList += funcDef;        while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {            funcDef.wasCloned = true;

⌨️ 快捷键说明

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