diff options
Diffstat (limited to 'src/tools')
50 files changed, 1952 insertions, 1286 deletions
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index 527a932c4d..e0f5546966 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -130,9 +130,15 @@ win32:SOURCES += ../../corelib/io/qfilesystemengine_win.cpp \ ../../corelib/plugin/qsystemlibrary.cpp \ mac { - SOURCES += ../../corelib/kernel/qcoreapplication_mac.cpp \ - ../../corelib/kernel/qcore_mac.cpp - LIBS += -framework CoreServices -framework Foundation + SOURCES += \ + ../../corelib/kernel/qcoreapplication_mac.cpp \ + ../../corelib/kernel/qcore_mac.cpp + OBJECTIVE_SOURCES += \ + ../../corelib/kernel/qcore_mac_objc.mm + + LIBS += -framework Foundation + osx: LIBS_PRIVATE += -framework CoreServices + ios: LIBS_PRIVATE += -framework UIKit } macx { diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 6c5e772e8c..fcc43aca68 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -230,13 +230,23 @@ void Generator::generateCode() // // Build stringdata struct // + const int constCharArraySizeLimit = 65535; fprintf(out, "struct qt_meta_stringdata_%s_t {\n", qualifiedClassNameIdentifier.constData()); fprintf(out, " QByteArrayData data[%d];\n", strings.size()); { - int len = 0; - for (int i = 0; i < strings.size(); ++i) - len += strings.at(i).length() + 1; - fprintf(out, " char stringdata[%d];\n", len); + int stringDataLength = 0; + int stringDataCounter = 0; + for (int i = 0; i < strings.size(); ++i) { + int thisLength = strings.at(i).length() + 1; + stringDataLength += thisLength; + if (stringDataLength / constCharArraySizeLimit) { + // save previous stringdata and start computing the next one. + fprintf(out, " char stringdata%d[%d];\n", stringDataCounter++, stringDataLength - thisLength); + stringDataLength = thisLength; + } + } + fprintf(out, " char stringdata%d[%d];\n", stringDataCounter, stringDataLength); + } fprintf(out, "};\n"); @@ -247,7 +257,7 @@ void Generator::generateCode() // QByteArrayData::data() implementation returning simply "this + offset". fprintf(out, "#define QT_MOC_LITERAL(idx, ofs, len) \\\n" " Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \\\n" - " qptrdiff(offsetof(qt_meta_stringdata_%s_t, stringdata) + ofs \\\n" + " qptrdiff(offsetof(qt_meta_stringdata_%s_t, stringdata0) + ofs \\\n" " - idx * sizeof(QByteArrayData)) \\\n" " )\n", qualifiedClassNameIdentifier.constData()); @@ -282,9 +292,18 @@ void Generator::generateCode() fprintf(out, " \""); int col = 0; int len = 0; + int stringDataLength = 0; for (int i = 0; i < strings.size(); ++i) { QByteArray s = strings.at(i); len = s.length(); + stringDataLength += len + 1; + if (stringDataLength >= constCharArraySizeLimit) { + fprintf(out, "\",\n \""); + stringDataLength = len + 1; + col = 0; + } else if (i) + fputs("\\0", out); // add \0 at the end of each string + if (col && col + len >= 72) { fprintf(out, "\"\n \""); col = 0; @@ -309,9 +328,6 @@ void Generator::generateCode() idx += spanLen; col += spanLen; } - - if (i != strings.size() - 1) // skip the last \0 the c++ will add it for us - fputs("\\0", out); col += len + 2; } @@ -359,7 +375,13 @@ void Generator::generateCode() fprintf(out, " %4d, %4d, // constructors\n", isConstructible ? cdef->constructorList.count() : 0, isConstructible ? index : 0); - fprintf(out, " %4d, // flags\n", 0); + int flags = 0; + if (cdef->hasQGadget) { + // Ideally, all the classes could have that flag. But this broke classes generated + // by qdbusxml2cpp which generate code that require that we call qt_metacall for properties + flags |= PropertyAccessInStaticMetaCall; + } + fprintf(out, " %4d, // flags\n", flags); fprintf(out, " %4d, // signalCount\n", cdef->signalList.count()); @@ -425,7 +447,9 @@ void Generator::generateCode() // // Generate internal qt_static_metacall() function // - if (cdef->hasQObject && !isQt) + const bool hasStaticMetaCall = !isQt && + (cdef->hasQObject || !cdef->methodList.isEmpty() || !cdef->propertyList.isEmpty()); + if (hasStaticMetaCall) generateStaticMetacall(); // @@ -513,7 +537,7 @@ void Generator::generateCode() fprintf(out, "qt_meta_stringdata_%s.data,\n" " qt_meta_data_%s, ", qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData()); - if (cdef->hasQObject && !isQt) + if (hasStaticMetaCall) fprintf(out, " qt_static_metacall, "); else fprintf(out, " Q_NULLPTR, "); @@ -538,7 +562,7 @@ void Generator::generateCode() // fprintf(out, "\nvoid *%s::qt_metacast(const char *_clname)\n{\n", cdef->qualified.constData()); fprintf(out, " if (!_clname) return Q_NULLPTR;\n"); - fprintf(out, " if (!strcmp(_clname, qt_meta_stringdata_%s.stringdata))\n" + fprintf(out, " if (!strcmp(_clname, qt_meta_stringdata_%s.stringdata0))\n" " return 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 @@ -919,10 +943,6 @@ void Generator::generateMetacall() } if (cdef->propertyList.size()) { - bool needGet = false; - bool needTempVarForGet = false; - bool needSet = false; - bool needReset = false; bool needDesignable = false; bool needScriptable = false; bool needStored = false; @@ -930,132 +950,21 @@ void Generator::generateMetacall() bool needUser = false; for (int i = 0; i < cdef->propertyList.size(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); - needGet |= !p.read.isEmpty() || !p.member.isEmpty(); - if (!p.read.isEmpty() || !p.member.isEmpty()) - needTempVarForGet |= (p.gspec != PropertyDef::PointerSpec - && p.gspec != PropertyDef::ReferenceSpec); - - needSet |= !p.write.isEmpty() || (!p.member.isEmpty() && !p.constant); - needReset |= !p.reset.isEmpty(); needDesignable |= p.designable.endsWith(')'); needScriptable |= p.scriptable.endsWith(')'); needStored |= p.stored.endsWith(')'); needEditable |= p.editable.endsWith(')'); needUser |= p.user.endsWith(')'); } - fprintf(out, "\n#ifndef QT_NO_PROPERTIES\n "); + fprintf(out, "\n#ifndef QT_NO_PROPERTIES\n "); if (needElse) - fprintf(out, " else "); - fprintf(out, "if (_c == QMetaObject::ReadProperty) {\n"); - if (needGet) { - if (needTempVarForGet) - fprintf(out, " void *_v = _a[0];\n"); - fprintf(out, " switch (_id) {\n"); - for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { - const PropertyDef &p = cdef->propertyList.at(propindex); - if (p.read.isEmpty() && p.member.isEmpty()) - continue; - QByteArray prefix; - if (p.inPrivateClass.size()) { - prefix = p.inPrivateClass; - prefix.append("->"); - } - if (p.gspec == PropertyDef::PointerSpec) - fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%s%s())); break;\n", - propindex, prefix.constData(), p.read.constData()); - else if (p.gspec == PropertyDef::ReferenceSpec) - fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(&%s%s())); break;\n", - propindex, prefix.constData(), p.read.constData()); - else if (cdef->enumDeclarations.value(p.type, false)) - fprintf(out, " case %d: *reinterpret_cast<int*>(_v) = QFlag(%s%s()); break;\n", - propindex, prefix.constData(), p.read.constData()); - else if (!p.read.isEmpty()) - fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n", - propindex, p.type.constData(), prefix.constData(), p.read.constData()); - else - fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s; break;\n", - propindex, p.type.constData(), prefix.constData(), p.member.constData()); - } - fprintf(out, " default: break;\n"); - fprintf(out, " }\n"); - } - - fprintf(out, - " _id -= %d;\n" - " }", cdef->propertyList.count()); - - fprintf(out, " else "); - fprintf(out, "if (_c == QMetaObject::WriteProperty) {\n"); - - if (needSet) { - fprintf(out, " void *_v = _a[0];\n"); - fprintf(out, " switch (_id) {\n"); - for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { - const PropertyDef &p = cdef->propertyList.at(propindex); - if (p.constant) - continue; - if (p.write.isEmpty() && p.member.isEmpty()) - continue; - QByteArray prefix; - if (p.inPrivateClass.size()) { - prefix = p.inPrivateClass; - prefix.append("->"); - } - if (cdef->enumDeclarations.value(p.type, false)) { - fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast<int*>(_v))); break;\n", - propindex, prefix.constData(), p.write.constData()); - } else if (!p.write.isEmpty()) { - fprintf(out, " case %d: %s%s(*reinterpret_cast< %s*>(_v)); break;\n", - propindex, prefix.constData(), p.write.constData(), p.type.constData()); - } else { - fprintf(out, " case %d:\n", propindex); - fprintf(out, " if (%s%s != *reinterpret_cast< %s*>(_v)) {\n", - prefix.constData(), p.member.constData(), p.type.constData()); - fprintf(out, " %s%s = *reinterpret_cast< %s*>(_v);\n", - prefix.constData(), p.member.constData(), p.type.constData()); - if (!p.notify.isEmpty() && p.notifyId != -1) { - const FunctionDef &f = cdef->signalList.at(p.notifyId); - if (f.arguments.size() == 0) - fprintf(out, " Q_EMIT %s();\n", p.notify.constData()); - else if (f.arguments.size() == 1 && f.arguments.at(0).normalizedType == p.type) - fprintf(out, " Q_EMIT %s(%s%s);\n", - p.notify.constData(), prefix.constData(), p.member.constData()); - } - fprintf(out, " }\n"); - fprintf(out, " break;\n"); - } - } - fprintf(out, " default: break;\n"); - fprintf(out, " }\n"); - } - + fprintf(out, "else "); fprintf(out, - " _id -= %d;\n" - " }", cdef->propertyList.count()); - - fprintf(out, " else "); - fprintf(out, "if (_c == QMetaObject::ResetProperty) {\n"); - if (needReset) { - fprintf(out, " switch (_id) {\n"); - for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { - const PropertyDef &p = cdef->propertyList.at(propindex); - if (!p.reset.endsWith(')')) - continue; - QByteArray prefix; - if (p.inPrivateClass.size()) { - prefix = p.inPrivateClass; - prefix.append("->"); - } - fprintf(out, " case %d: %s%s; break;\n", - propindex, prefix.constData(), p.reset.constData()); - } - fprintf(out, " default: break;\n"); - fprintf(out, " }\n"); - } - fprintf(out, - " _id -= %d;\n" - " }", cdef->propertyList.count()); + "if (_c == QMetaObject::ReadProperty || _c == QMetaObject::WriteProperty\n" + " || _c == QMetaObject::ResetProperty || _c == QMetaObject::RegisterPropertyMetaType) {\n" + " qt_static_metacall(this, _c, _id, _a);\n" + " _id -= %d;\n }", cdef->propertyList.count()); fprintf(out, " else "); fprintf(out, "if (_c == QMetaObject::QueryPropertyDesignable) {\n"); @@ -1153,16 +1062,6 @@ void Generator::generateMetacall() " _id -= %d;\n" " }", cdef->propertyList.count()); - fprintf(out, " else "); - fprintf(out, "if (_c == QMetaObject::RegisterPropertyMetaType) {\n"); - fprintf(out, " if (_id < %d)\n", cdef->propertyList.size()); - - if (automaticPropertyMetaTypesHelper().isEmpty()) - fprintf(out, " *reinterpret_cast<int*>(_a[0]) = -1;\n"); - else - fprintf(out, " qt_static_metacall(this, _c, _id, _a);\n"); - fprintf(out, " _id -= %d;\n }", cdef->propertyList.size()); - fprintf(out, "\n#endif // QT_NO_PROPERTIES"); } if (methodList.size() || cdef->signalList.size() || cdef->propertyList.size()) @@ -1246,10 +1145,14 @@ void Generator::generateStaticMetacall() else fprintf(out, " "); fprintf(out, "if (_c == QMetaObject::InvokeMetaMethod) {\n"); + if (cdef->hasQObject) { #ifndef QT_NO_DEBUG - fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n"); + fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n"); #endif - fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } else { + fprintf(out, " %s *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } fprintf(out, " switch (_id) {\n"); for (int methodindex = 0; methodindex < methodList.size(); ++methodindex) { const FunctionDef &f = methodList.at(methodindex); @@ -1377,6 +1280,153 @@ void Generator::generateStaticMetacall() needElse = true; } + if (!cdef->propertyList.empty()) { + bool needGet = false; + bool needTempVarForGet = false; + bool needSet = false; + bool needReset = false; + for (int i = 0; i < cdef->propertyList.size(); ++i) { + const PropertyDef &p = cdef->propertyList.at(i); + needGet |= !p.read.isEmpty() || !p.member.isEmpty(); + if (!p.read.isEmpty() || !p.member.isEmpty()) + needTempVarForGet |= (p.gspec != PropertyDef::PointerSpec + && p.gspec != PropertyDef::ReferenceSpec); + + needSet |= !p.write.isEmpty() || (!p.member.isEmpty() && !p.constant); + needReset |= !p.reset.isEmpty(); + } + fprintf(out, "\n#ifndef QT_NO_PROPERTIES\n "); + + if (needElse) + fprintf(out, "else "); + fprintf(out, "if (_c == QMetaObject::ReadProperty) {\n"); + if (needGet) { + if (cdef->hasQObject) { +#ifndef QT_NO_DEBUG + fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n"); +#endif + fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } else { + fprintf(out, " %s *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } + if (needTempVarForGet) + fprintf(out, " void *_v = _a[0];\n"); + fprintf(out, " switch (_id) {\n"); + for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { + const PropertyDef &p = cdef->propertyList.at(propindex); + if (p.read.isEmpty() && p.member.isEmpty()) + continue; + QByteArray prefix = "_t->"; + if (p.inPrivateClass.size()) { + prefix += p.inPrivateClass + "->"; + } + if (p.gspec == PropertyDef::PointerSpec) + fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%s%s())); break;\n", + propindex, prefix.constData(), p.read.constData()); + else if (p.gspec == PropertyDef::ReferenceSpec) + fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(&%s%s())); break;\n", + propindex, prefix.constData(), p.read.constData()); + else if (cdef->enumDeclarations.value(p.type, false)) + fprintf(out, " case %d: *reinterpret_cast<int*>(_v) = QFlag(%s%s()); break;\n", + propindex, prefix.constData(), p.read.constData()); + else if (!p.read.isEmpty()) + fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n", + propindex, p.type.constData(), prefix.constData(), p.read.constData()); + else + fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s; break;\n", + propindex, p.type.constData(), prefix.constData(), p.member.constData()); + } + fprintf(out, " default: break;\n"); + fprintf(out, " }\n"); + } + + fprintf(out, " }"); + + fprintf(out, " else "); + fprintf(out, "if (_c == QMetaObject::WriteProperty) {\n"); + + if (needSet) { + if (cdef->hasQObject) { +#ifndef QT_NO_DEBUG + fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n"); +#endif + fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } else { + fprintf(out, " %s *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } + fprintf(out, " void *_v = _a[0];\n"); + fprintf(out, " switch (_id) {\n"); + for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { + const PropertyDef &p = cdef->propertyList.at(propindex); + if (p.constant) + continue; + if (p.write.isEmpty() && p.member.isEmpty()) + continue; + QByteArray prefix = "_t->"; + if (p.inPrivateClass.size()) { + prefix += p.inPrivateClass + "->"; + } + if (cdef->enumDeclarations.value(p.type, false)) { + fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast<int*>(_v))); break;\n", + propindex, prefix.constData(), p.write.constData()); + } else if (!p.write.isEmpty()) { + fprintf(out, " case %d: %s%s(*reinterpret_cast< %s*>(_v)); break;\n", + propindex, prefix.constData(), p.write.constData(), p.type.constData()); + } else { + fprintf(out, " case %d:\n", propindex); + fprintf(out, " if (%s%s != *reinterpret_cast< %s*>(_v)) {\n", + prefix.constData(), p.member.constData(), p.type.constData()); + fprintf(out, " %s%s = *reinterpret_cast< %s*>(_v);\n", + prefix.constData(), p.member.constData(), p.type.constData()); + if (!p.notify.isEmpty() && p.notifyId != -1) { + const FunctionDef &f = cdef->signalList.at(p.notifyId); + if (f.arguments.size() == 0) + fprintf(out, " Q_EMIT _t->%s();\n", p.notify.constData()); + else if (f.arguments.size() == 1 && f.arguments.at(0).normalizedType == p.type) + fprintf(out, " Q_EMIT _t->%s(%s%s);\n", + p.notify.constData(), prefix.constData(), p.member.constData()); + } + fprintf(out, " }\n"); + fprintf(out, " break;\n"); + } + } + fprintf(out, " default: break;\n"); + fprintf(out, " }\n"); + } + + fprintf(out, " }"); + + fprintf(out, " else "); + fprintf(out, "if (_c == QMetaObject::ResetProperty) {\n"); + if (needReset) { + if (cdef->hasQObject) { +#ifndef QT_NO_DEBUG + fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n"); +#endif + fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } else { + fprintf(out, " %s *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData()); + } + fprintf(out, " switch (_id) {\n"); + for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { + const PropertyDef &p = cdef->propertyList.at(propindex); + if (!p.reset.endsWith(')')) + continue; + QByteArray prefix = "_t->"; + if (p.inPrivateClass.size()) { + prefix += p.inPrivateClass + "->"; + } + fprintf(out, " case %d: %s%s; break;\n", + propindex, prefix.constData(), p.reset.constData()); + } + fprintf(out, " default: break;\n"); + fprintf(out, " }\n"); + } + fprintf(out, " }"); + fprintf(out, "\n#endif // QT_NO_PROPERTIES"); + needElse = true; + } + if (needElse) fprintf(out, "\n"); diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp index c5d6b58412..687c4f8474 100644 --- a/src/tools/moc/preprocessor.cpp +++ b/src/tools/moc/preprocessor.cpp @@ -52,11 +52,12 @@ static QByteArray cleaned(const QByteArray &input) QByteArray result; result.reserve(input.size()); const char *data = input.constData(); + const char *end = input.constData() + input.size(); char *output = result.data(); int newlines = 0; - while (*data) { - while (*data && is_space(*data)) + while (data != end) { + while (data != end && is_space(*data)) ++data; bool takeLine = (*data == '#'); if (*data == '%' && *(data+1) == ':') { @@ -66,15 +67,15 @@ static QByteArray cleaned(const QByteArray &input) if (takeLine) { *output = '#'; ++output; - do ++data; while (*data && is_space(*data)); + do ++data; while (data != end && is_space(*data)); } - while (*data) { + while (data != end) { // handle \\\n, \\\r\n and \\\r if (*data == '\\') { if (*(data + 1) == '\r') { ++data; } - if (*data && (*(data + 1) == '\n' || (*data) == '\r')) { + if (data != end && (*(data + 1) == '\n' || (*data) == '\r')) { ++newlines; data += 1; if (*data != '\r') @@ -201,7 +202,7 @@ Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocesso data = skipQuote(data); token = STRING_LITERAL; // concatenate multi-line strings for easier - // STRING_LITERAAL handling in moc + // STRING_LITERAL handling in moc if (!Preprocessor::preprocessOnly && !symbols.isEmpty() && symbols.last().token == STRING_LITERAL) { @@ -964,6 +965,43 @@ int Preprocessor::evaluateCondition() return expression.value(); } +static QByteArray readOrMapFile(QFile *file) +{ + const qint64 size = file->size(); + char *rawInput = reinterpret_cast<char*>(file->map(0, size)); + return rawInput ? QByteArray::fromRawData(rawInput, size) : file->readAll(); +} + +static void mergeStringLiterals(Symbols *_symbols) +{ + Symbols &symbols = *_symbols; + for (Symbols::iterator i = symbols.begin(); i != symbols.end(); ++i) { + if (i->token == STRING_LITERAL) { + Symbols::Iterator mergeSymbol = i; + int literalsLength = mergeSymbol->len; + while (++i != symbols.end() && i->token == STRING_LITERAL) + literalsLength += i->len - 2; // no quotes + + if (literalsLength != mergeSymbol->len) { + QByteArray mergeSymbolOriginalLexem = mergeSymbol->unquotedLexem(); + QByteArray &mergeSymbolLexem = mergeSymbol->lex; + mergeSymbolLexem.resize(0); + mergeSymbolLexem.reserve(literalsLength); + mergeSymbolLexem.append('"'); + mergeSymbolLexem.append(mergeSymbolOriginalLexem); + for (Symbols::const_iterator j = mergeSymbol + 1; j != i; ++j) + mergeSymbolLexem.append(j->lex.constData() + j->from + 1, j->len - 2); // append j->unquotedLexem() + mergeSymbolLexem.append('"'); + mergeSymbol->len = mergeSymbol->lex.length(); + mergeSymbol->from = 0; + i = symbols.erase(mergeSymbol + 1, i); + } + if (i == symbols.end()) + break; + } + } +} + void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) { currentFilenames.push(filename); @@ -1020,7 +1058,8 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) if (!file.open(QFile::ReadOnly)) continue; - QByteArray input = file.readAll(); + QByteArray input = readOrMapFile(&file); + file.close(); if (input.isEmpty()) continue; @@ -1153,9 +1192,10 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) currentFilenames.pop(); } -Symbols Preprocessor::preprocessed(const QByteArray &filename, QIODevice *file) +Symbols Preprocessor::preprocessed(const QByteArray &filename, QFile *file) { - QByteArray input = file->readAll(); + QByteArray input = readOrMapFile(file); + if (input.isEmpty()) return symbols; @@ -1176,6 +1216,7 @@ Symbols Preprocessor::preprocessed(const QByteArray &filename, QIODevice *file) // phase 3: preprocess conditions and substitute macros Symbols result; preprocess(filename, result); + mergeStringLiterals(&result); #if 0 for (int j = 0; j < result.size(); ++j) diff --git a/src/tools/moc/preprocessor.h b/src/tools/moc/preprocessor.h index fc86781be8..77f3a30ac0 100644 --- a/src/tools/moc/preprocessor.h +++ b/src/tools/moc/preprocessor.h @@ -57,7 +57,7 @@ typedef SubArray MacroName; #endif typedef QHash<MacroName, Macro> Macros; -class QIODevice; +class QFile; class Preprocessor : public Parser { @@ -67,7 +67,7 @@ public: QList<QByteArray> frameworks; QSet<QByteArray> preprocessedIncludes; Macros macros; - Symbols preprocessed(const QByteArray &filename, QIODevice *device); + Symbols preprocessed(const QByteArray &filename, QFile *device); void parseDefineArguments(Macro *m); diff --git a/src/tools/qdoc/atom.cpp b/src/tools/qdoc/atom.cpp index 1af31afedd..9aaa1af319 100644 --- a/src/tools/qdoc/atom.cpp +++ b/src/tools/qdoc/atom.cpp @@ -97,6 +97,9 @@ QT_BEGIN_NAMESPACE \value ImageText \value ImportantNote \value InlineImage + \value JavaScript + \value EndJavaScript + \value Keyword \value LineBreak \value Link \value LinkNode @@ -107,6 +110,8 @@ QT_BEGIN_NAMESPACE \value ListItemLeft \value ListItemRight \value ListRight + \value NavAutoLink + \value NavLink \value Nop \value Note \value ParaLeft @@ -181,6 +186,7 @@ static const struct { { "InlineImage", Atom::InlineImage }, { "JavaScript", Atom::JavaScript }, { "EndJavaScript", Atom::EndJavaScript }, + { "Keyword", Atom::Keyword }, { "LegaleseLeft", Atom::LegaleseLeft }, { "LegaleseRight", Atom::LegaleseRight }, { "LineBreak", Atom::LineBreak }, @@ -193,6 +199,8 @@ static const struct { { "ListItemLeft", Atom::ListItemLeft }, { "ListItemRight", Atom::ListItemRight }, { "ListRight", Atom::ListRight }, + { "NavAutoLink", Atom::NavAutoLink }, + { "NavLink", Atom::NavLink }, { "Nop", Atom::Nop }, { "NoteLeft", Atom::NoteLeft }, { "NoteRight", Atom::NoteRight }, diff --git a/src/tools/qdoc/atom.h b/src/tools/qdoc/atom.h index 3a7e992f7b..859ea3e740 100644 --- a/src/tools/qdoc/atom.h +++ b/src/tools/qdoc/atom.h @@ -57,7 +57,7 @@ public: BriefRight, C, CaptionLeft, - CaptionRight, // 10 + CaptionRight, Code, CodeBad, CodeNew, @@ -67,7 +67,7 @@ public: DivLeft, DivRight, EndQmlText, - FootnoteLeft, // 20 + FootnoteLeft, FootnoteRight, FormatElse, FormatEndif, @@ -77,17 +77,18 @@ public: GeneratedList, GuidLink, HR, - Image, // 30 + Image, ImageText, ImportantLeft, ImportantRight, InlineImage, JavaScript, EndJavaScript, + Keyword, LegaleseLeft, LegaleseRight, LineBreak, - Link, // 40 + Link, LinkNode, ListLeft, ListItemNumber, @@ -96,8 +97,10 @@ public: ListItemLeft, ListItemRight, ListRight, + NavAutoLink, + NavLink, Nop, - NoteLeft, // 50 + NoteLeft, NoteRight, ParaLeft, ParaRight, @@ -107,7 +110,7 @@ public: QuotationRight, RawString, SectionLeft, - SectionRight, // 60 + SectionRight, SectionHeadingLeft, SectionHeadingRight, SidebarLeft, @@ -117,7 +120,7 @@ public: SnippetIdentifier, SnippetLocation, String, - TableLeft, // 70 + TableLeft, TableRight, TableHeaderLeft, TableHeaderRight, @@ -127,7 +130,7 @@ public: TableItemRight, TableOfContents, Target, - UnhandledFormat, // 80 + UnhandledFormat, UnknownCommand, Last = UnknownCommand }; @@ -212,12 +215,12 @@ class LinkAtom : public Atom LinkAtom(Atom* previous, const LinkAtom& t); virtual ~LinkAtom() { } - virtual bool isLinkAtom() const { return true; } - virtual Node::Genus genus() const { return genus_; } - virtual bool specifiesDomain() const { return (domain_ != 0); } - virtual Tree* domain() const { return domain_; } - virtual Node::Type goal() const { return goal_; } - virtual const QString& error() { return error_; } + virtual bool isLinkAtom() const Q_DECL_OVERRIDE { return true; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return genus_; } + virtual bool specifiesDomain() const Q_DECL_OVERRIDE { return (domain_ != 0); } + virtual Tree* domain() const Q_DECL_OVERRIDE { return domain_; } + virtual Node::Type goal() const Q_DECL_OVERRIDE { return goal_; } + virtual const QString& error() Q_DECL_OVERRIDE { return error_; } protected: Node::Genus genus_; diff --git a/src/tools/qdoc/codeparser.cpp b/src/tools/qdoc/codeparser.cpp index 00341940da..acb297d5f9 100644 --- a/src/tools/qdoc/codeparser.cpp +++ b/src/tools/qdoc/codeparser.cpp @@ -65,9 +65,9 @@ QT_BEGIN_NAMESPACE #define COMMAND_TITLE Doc::alias(QLatin1String("title")) #define COMMAND_WRAPPER Doc::alias(QLatin1String("wrapper")) -QString CodeParser::currentSubDir_; QList<CodeParser *> CodeParser::parsers; -bool CodeParser::showInternal = false; +bool CodeParser::showInternal_ = false; +bool CodeParser::singleExec_ = false; /*! The constructor adds this code parser to the static @@ -93,7 +93,8 @@ CodeParser::~CodeParser() */ void CodeParser::initializeParser(const Config& config) { - showInternal = config.getBool(CONFIG_SHOWINTERNAL); + showInternal_ = config.getBool(CONFIG_SHOWINTERNAL); + singleExec_ = config.getBool(CONFIG_SINGLEEXEC); } /*! @@ -262,7 +263,7 @@ void CodeParser::processCommonMetaCommand(const Location& location, node->setStatus(Node::Preliminary); } else if (command == COMMAND_INTERNAL) { - if (!showInternal) { + if (!showInternal_) { node->setAccess(Node::Private); node->setStatus(Node::Internal); if (node->type() == Node::QmlPropertyGroup) { diff --git a/src/tools/qdoc/codeparser.h b/src/tools/qdoc/codeparser.h index 5b3b1192f3..c9a9b746b1 100644 --- a/src/tools/qdoc/codeparser.h +++ b/src/tools/qdoc/codeparser.h @@ -74,7 +74,6 @@ public: static CodeParser *parserForHeaderFile(const QString &filePath); static CodeParser *parserForSourceFile(const QString &filePath); static void setLink(Node* node, Node::LinkType linkType, const QString& arg); - static const QString& currentOutputSubdirectory() { return currentSubDir_; } protected: const QSet<QString>& commonMetaCommands(); @@ -89,9 +88,9 @@ protected: QDocDatabase* qdb_; private: - static QString currentSubDir_; static QList<CodeParser *> parsers; - static bool showInternal; + static bool showInternal_; + static bool singleExec_; }; QT_END_NAMESPACE diff --git a/src/tools/qdoc/config.cpp b/src/tools/qdoc/config.cpp index 51ab341869..f73ac147b8 100644 --- a/src/tools/qdoc/config.cpp +++ b/src/tools/qdoc/config.cpp @@ -98,6 +98,7 @@ QString ConfigStrings::QUOTINGINFORMATION = QStringLiteral("quotinginformation") QString ConfigStrings::SCRIPTDIRS = QStringLiteral("scriptdirs"); QString ConfigStrings::SCRIPTS = QStringLiteral("scripts"); QString ConfigStrings::SHOWINTERNAL = QStringLiteral("showinternal"); +QString ConfigStrings::SINGLEEXEC = QStringLiteral("singleexec"); QString ConfigStrings::SOURCEDIRS = QStringLiteral("sourcedirs"); QString ConfigStrings::SOURCEENCODING = QStringLiteral("sourceencoding"); QString ConfigStrings::SOURCES = QStringLiteral("sources"); @@ -118,6 +119,7 @@ QString ConfigStrings::FILEEXTENSIONS = QStringLiteral("fileextensions"); QString ConfigStrings::IMAGEEXTENSIONS = QStringLiteral("imageextensions"); QString ConfigStrings::QMLONLY = QStringLiteral("qmlonly"); QString ConfigStrings::QMLTYPESPAGE = QStringLiteral("qmltypespage"); +QString ConfigStrings::WRITEQAPAGES = QStringLiteral("writeqapages"); /*! An entry in a stack, where each entry is a list @@ -350,6 +352,10 @@ QString Config::getOutputDir() const t = getString(CONFIG_OUTPUTDIR); else t = overrideOutputDir; + if (Generator::singleExec()) { + QString project = getString(CONFIG_PROJECT); + t += QLatin1Char('/') + project.toLower(); + } if (!Generator::useOutputSubdirs()) { t = t.left(t.lastIndexOf('/')); QString singleOutputSubdir = getString("HTML.outputsubdir"); @@ -869,6 +875,36 @@ bool Config::isMetaKeyChar(QChar ch) } /*! + \a fileName is a master qdocconf file. It contains a list of + qdocconf files and nothing else. Read the list and return it. + */ +QStringList Config::loadMaster(const QString& fileName) +{ + Location location = Location::null; + QFile fin(fileName); + if (!fin.open(QFile::ReadOnly | QFile::Text)) { + if (!Config::installDir.isEmpty()) { + int prefix = location.filePath().length() - location.fileName().length(); + fin.setFileName(Config::installDir + "/" + fileName.right(fileName.length() - prefix)); + } + if (!fin.open(QFile::ReadOnly | QFile::Text)) + location.fatal(tr("Cannot open master qdocconf file '%1': %2").arg(fileName).arg(fin.errorString())); + } + QTextStream stream(&fin); +#ifndef QT_NO_TEXTCODEC + stream.setCodec("UTF-8"); +#endif + QStringList qdocFiles; + QString line = stream.readLine(); + while (!line.isNull()) { + qdocFiles.append(line); + line = stream.readLine(); + } + fin.close(); + return qdocFiles; +} + +/*! Load, parse, and process a qdoc configuration file. This function is only called by the other load() function, but this one is recursive, i.e., it calls itself when it sees diff --git a/src/tools/qdoc/config.h b/src/tools/qdoc/config.h index 70b5adfd68..a836448719 100644 --- a/src/tools/qdoc/config.h +++ b/src/tools/qdoc/config.h @@ -108,6 +108,7 @@ public: QStringList getExampleQdocFiles(const QSet<QString> &excludedDirs, const QSet<QString> &excludedFiles); QStringList getExampleImageFiles(const QSet<QString> &excludedDirs, const QSet<QString> &excludedFiles); + static QStringList loadMaster(const QString& fileName); static QStringList getFilesHere(const QString& dir, const QString& nameFilter, const Location &location = Location(), @@ -209,6 +210,7 @@ struct ConfigStrings static QString SCRIPTDIRS; static QString SCRIPTS; static QString SHOWINTERNAL; + static QString SINGLEEXEC; static QString SOURCEDIRS; static QString SOURCEENCODING; static QString SOURCES; @@ -229,6 +231,7 @@ struct ConfigStrings static QString IMAGEEXTENSIONS; static QString QMLONLY; static QString QMLTYPESPAGE; + static QString WRITEQAPAGES; }; #define CONFIG_ALIAS ConfigStrings::ALIAS @@ -282,6 +285,7 @@ struct ConfigStrings #define CONFIG_SCRIPTDIRS ConfigStrings::SCRIPTDIRS #define CONFIG_SCRIPTS ConfigStrings::SCRIPTS #define CONFIG_SHOWINTERNAL ConfigStrings::SHOWINTERNAL +#define CONFIG_SINGLEEXEC ConfigStrings::SINGLEEXEC #define CONFIG_SOURCEDIRS ConfigStrings::SOURCEDIRS #define CONFIG_SOURCEENCODING ConfigStrings::SOURCEENCODING #define CONFIG_SOURCES ConfigStrings::SOURCES @@ -302,6 +306,7 @@ struct ConfigStrings #define CONFIG_IMAGEEXTENSIONS ConfigStrings::IMAGEEXTENSIONS #define CONFIG_QMLONLY ConfigStrings::QMLONLY #define CONFIG_QMLTYPESPAGE ConfigStrings::QMLTYPESPAGE +#define CONFIG_WRITEQAPAGES ConfigStrings::WRITEQAPAGES QT_END_NAMESPACE diff --git a/src/tools/qdoc/cppcodemarker.h b/src/tools/qdoc/cppcodemarker.h index ec2ee124d4..899c2018fe 100644 --- a/src/tools/qdoc/cppcodemarker.h +++ b/src/tools/qdoc/cppcodemarker.h @@ -50,29 +50,29 @@ public: CppCodeMarker(); ~CppCodeMarker(); - virtual bool recognizeCode(const QString& code); - virtual bool recognizeExtension(const QString& ext); - virtual bool recognizeLanguage(const QString& lang); - virtual Atom::Type atomType() const; + virtual bool recognizeCode(const QString& code) Q_DECL_OVERRIDE; + virtual bool recognizeExtension(const QString& ext) Q_DECL_OVERRIDE; + virtual bool recognizeLanguage(const QString& lang) Q_DECL_OVERRIDE; + virtual Atom::Type atomType() const Q_DECL_OVERRIDE; virtual QString markedUpCode(const QString& code, const Node *relative, - const Location &location); + const Location &location) Q_DECL_OVERRIDE; virtual QString markedUpSynopsis(const Node *node, const Node *relative, - SynopsisStyle style); - virtual QString markedUpQmlItem(const Node *node, bool summary); - virtual QString markedUpName(const Node *node); - virtual QString markedUpFullName(const Node *node, const Node *relative); - virtual QString markedUpEnumValue(const QString &enumValue, const Node *relative); - virtual QString markedUpIncludes(const QStringList& includes); - virtual QString functionBeginRegExp(const QString& funcName); - virtual QString functionEndRegExp(const QString& funcName); + SynopsisStyle style) Q_DECL_OVERRIDE; + virtual QString markedUpQmlItem(const Node *node, bool summary) Q_DECL_OVERRIDE; + virtual QString markedUpName(const Node *node) Q_DECL_OVERRIDE; + virtual QString markedUpFullName(const Node *node, const Node *relative) Q_DECL_OVERRIDE; + virtual QString markedUpEnumValue(const QString &enumValue, const Node *relative) Q_DECL_OVERRIDE; + virtual QString markedUpIncludes(const QStringList& includes) Q_DECL_OVERRIDE; + virtual QString functionBeginRegExp(const QString& funcName) Q_DECL_OVERRIDE; + virtual QString functionEndRegExp(const QString& funcName) Q_DECL_OVERRIDE; virtual QList<Section> sections(const InnerNode *innerNode, SynopsisStyle style, - Status status); + Status status) Q_DECL_OVERRIDE; virtual QList<Section> qmlSections(QmlClassNode* qmlClassNode, SynopsisStyle style, - Status status = Okay); + Status status = Okay) Q_DECL_OVERRIDE; private: QString addMarkUp(const QString& protectedCode, diff --git a/src/tools/qdoc/cppcodeparser.h b/src/tools/qdoc/cppcodeparser.h index 7499575d13..03b55c7775 100644 --- a/src/tools/qdoc/cppcodeparser.h +++ b/src/tools/qdoc/cppcodeparser.h @@ -65,15 +65,15 @@ public: CppCodeParser(); ~CppCodeParser(); - virtual void initializeParser(const Config& config); - virtual void terminateParser(); - virtual QString language(); - virtual QStringList headerFileNameFilter(); - virtual QStringList sourceFileNameFilter(); - virtual void parseHeaderFile(const Location& location, const QString& filePath); - virtual void parseSourceFile(const Location& location, const QString& filePath); - virtual void doneParsingHeaderFiles(); - virtual void doneParsingSourceFiles(); + virtual void initializeParser(const Config& config) Q_DECL_OVERRIDE; + virtual void terminateParser() Q_DECL_OVERRIDE; + virtual QString language() Q_DECL_OVERRIDE; + virtual QStringList headerFileNameFilter() Q_DECL_OVERRIDE; + virtual QStringList sourceFileNameFilter() Q_DECL_OVERRIDE; + virtual void parseHeaderFile(const Location& location, const QString& filePath) Q_DECL_OVERRIDE; + virtual void parseSourceFile(const Location& location, const QString& filePath) Q_DECL_OVERRIDE; + virtual void doneParsingHeaderFiles() Q_DECL_OVERRIDE; + virtual void doneParsingSourceFiles() Q_DECL_OVERRIDE; protected: const QSet<QString>& topicCommands(); diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp index d9cf56769b..54b358e170 100644 --- a/src/tools/qdoc/ditaxmlgenerator.cpp +++ b/src/tools/qdoc/ditaxmlgenerator.cpp @@ -663,10 +663,10 @@ GuidMap* DitaXmlGenerator::lookupGuidMap(const QString& fileName) */ void DitaXmlGenerator::generateDocs() { - if (!runPrepareOnly()) + if (!preparing()) Generator::generateDocs(); - if (!runGenerateOnly()) { + if (!generating()) { QString fileBase = project.toLower().simplified().replace(QLatin1Char(' '), QLatin1Char('-')); qdb_->generateIndex(outputDir() + QLatin1Char('/') + fileBase + ".index", projectUrl, @@ -675,7 +675,7 @@ void DitaXmlGenerator::generateDocs() true); } - if (!runPrepareOnly()) { + if (!preparing()) { writeDitaMap(); /* Generate the XML tag file, if it was requested. diff --git a/src/tools/qdoc/ditaxmlgenerator.h b/src/tools/qdoc/ditaxmlgenerator.h index 4514f19bc8..d2f445dd5b 100644 --- a/src/tools/qdoc/ditaxmlgenerator.h +++ b/src/tools/qdoc/ditaxmlgenerator.h @@ -290,11 +290,11 @@ public: DitaXmlGenerator(); ~DitaXmlGenerator(); - virtual void initializeGenerator(const Config& config); - virtual void terminateGenerator(); - virtual QString format(); - virtual bool canHandleFormat(const QString& format); - virtual void generateDocs(); + virtual void initializeGenerator(const Config& config) Q_DECL_OVERRIDE; + virtual void terminateGenerator() Q_DECL_OVERRIDE; + virtual QString format() Q_DECL_OVERRIDE; + virtual bool canHandleFormat(const QString& format) Q_DECL_OVERRIDE; + virtual void generateDocs() Q_DECL_OVERRIDE; QString protectEnc(const QString& string); static QString protect(const QString& string, const QString& encoding = "ISO-8859-1"); @@ -304,12 +304,12 @@ public: protected: virtual int generateAtom(const Atom* atom, const Node* relative, - CodeMarker* marker); - virtual void generateClassLikeNode(InnerNode* inner, CodeMarker* marker); - virtual void generateQmlBasicTypePage(QmlBasicTypeNode* qbtn, CodeMarker* marker); - virtual void generateDocNode(DocNode* dn, CodeMarker* marker); - virtual void generateCollectionNode(CollectionNode* cn, CodeMarker* marker); - virtual QString fileExtension() const; + CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateClassLikeNode(InnerNode* inner, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateQmlBasicTypePage(QmlBasicTypeNode* qbtn, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateDocNode(DocNode* dn, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateCollectionNode(CollectionNode* cn, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual QString fileExtension() const Q_DECL_OVERRIDE; virtual QString guidForNode(const Node* node); virtual QString linkForNode(const Node* node, const Node* relative); @@ -394,8 +394,8 @@ private: void generateDetailedQmlMember(Node* node, const InnerNode* relative, CodeMarker* marker); - void generateQmlInherits(QmlClassNode* qcn, CodeMarker* marker); - void generateQmlInheritedBy(const QmlClassNode* qcn, CodeMarker* marker); + void generateQmlInherits(QmlClassNode* qcn, CodeMarker* marker) Q_DECL_OVERRIDE; + void generateQmlInheritedBy(const QmlClassNode* qcn, CodeMarker* marker) Q_DECL_OVERRIDE; void generateQmlInstantiates(QmlClassNode* qcn, CodeMarker* marker); void generateInstantiatedBy(ClassNode* cn, CodeMarker* marker); void generateQmlModuleDef(QmlClassNode* qcn); @@ -420,7 +420,7 @@ private: QString getAutoLink(const Atom *atom, const Node *relative, const Node** node); QString registerRef(const QString& ref); - virtual QString fileBase(const Node *node) const; + virtual QString fileBase(const Node *node) const Q_DECL_OVERRIDE; QString fileName(const Node *node); static int hOffset(const Node *node); static bool isThreeColumnEnumValueTable(const Atom *atom); @@ -434,9 +434,9 @@ private: QString lookupGuid(QString text); QString lookupGuid(const QString& fileName, const QString& text); GuidMap* lookupGuidMap(const QString& fileName); - virtual void beginSubPage(const InnerNode* node, const QString& fileName); - virtual void endSubPage(); - virtual void generateInnerNode(InnerNode* node); + virtual void beginSubPage(const InnerNode* node, const QString& fileName) Q_DECL_OVERRIDE; + virtual void endSubPage() Q_DECL_OVERRIDE; + virtual void generateInnerNode(InnerNode* node) Q_DECL_OVERRIDE; QXmlStreamWriter& xmlWriter(); void writeApiDesc(const Node* node, CodeMarker* marker, const QString& title); void addLink(const QString& href, const QStringRef& text, DitaTag t = DT_xref); diff --git a/src/tools/qdoc/doc.cpp b/src/tools/qdoc/doc.cpp index 5a3ad959d2..c10e3b4669 100644 --- a/src/tools/qdoc/doc.cpp +++ b/src/tools/qdoc/doc.cpp @@ -1611,12 +1611,14 @@ void DocParser::parse(const QString& source, QString word = in.mid(startPos, pos - startPos); // is word a C++ symbol or an English word? if ((numInternalUppercase >= 1 && numLowercase >= 2) - || numStrangeSymbols >= 1) { - append(Atom::AutoLink, word); + || numStrangeSymbols > 0) { + if (word.startsWith(QString("__"))) + appendWord(word); + else + append(Atom::AutoLink, word); } - else { + else appendWord(word); - } } } } @@ -1690,12 +1692,15 @@ void DocParser::insertTarget(const QString &target, bool keyword) } else { targetMap_.insert(target, location()); - append(Atom::Target, target); priv->constructExtra(); - if (keyword) + if (keyword) { + append(Atom::Keyword, target); priv->extra->keywords_.append(priv->text.lastAtom()); - else + } + else { + append(Atom::Target, target); priv->extra->targets_.append(priv->text.lastAtom()); + } } } @@ -1991,7 +1996,7 @@ void DocParser::append(const QString &string) Atom::Type lastType = priv->text.lastAtom()->type(); if ((lastType == Atom::Code) && priv->text.lastAtom()->string().endsWith(QLatin1String("\n\n"))) priv->text.lastAtom()->chopString(); - priv->text << Atom(string); + priv->text << Atom(string); // The Atom type is Link. } void DocParser::append(Atom::Type type, const QString& p1, const QString& p2) @@ -2008,7 +2013,7 @@ void DocParser::append(const QString& p1, const QString& p2) if ((lastType == Atom::Code) && priv->text.lastAtom()->string().endsWith(QLatin1String("\n\n"))) priv->text.lastAtom()->chopString(); if (p2.isEmpty()) - priv->text << Atom(p1); + priv->text << Atom(p1); // The Atom type is Link. else priv->text << LinkAtom(p1, p2); } @@ -2319,7 +2324,10 @@ QString DocParser::getBracedArgument(bool verbatim) } break; default: - arg += in[pos]; + if (in[pos].isSpace() && !verbatim) + arg += QChar(' '); + else + arg += in[pos]; pos++; } } @@ -2816,18 +2824,6 @@ QString DocParser::slashed(const QString& str) #define COMMAND_BRIEF Doc::alias("brief") #define COMMAND_QMLBRIEF Doc::alias("qmlbrief") -#if 0 -Doc::Doc(const Location& start_loc, - const Location& end_loc, - const QString& source, - const QSet<QString>& metaCommandSet) -{ - priv = new DocPrivate(start_loc,end_loc,source); - DocParser parser; - parser.parse(source,priv,metaCommandSet,QSet<QString>()); -} -#endif - /*! Parse the qdoc comment \a source. Build up a list of all the topic commands found including their arguments. This constructor is used @@ -3234,6 +3230,9 @@ void Doc::initialize(const Config& config) } } +/*! + All the heap allocated variables are deleted. + */ void Doc::terminate() { DocParser::exampleFiles.clear(); diff --git a/src/tools/qdoc/doc.h b/src/tools/qdoc/doc.h index 1c13c0f026..72db2c882c 100644 --- a/src/tools/qdoc/doc.h +++ b/src/tools/qdoc/doc.h @@ -97,9 +97,9 @@ public: TopicRef() { } ~TopicRef(); - virtual bool isMapRef() const { return false; } - virtual const DitaRefList* subrefs() const { return &subrefs_; } - virtual void appendSubref(DitaRef* t) { subrefs_.append(t); } + virtual bool isMapRef() const Q_DECL_OVERRIDE { return false; } + virtual const DitaRefList* subrefs() const Q_DECL_OVERRIDE { return &subrefs_; } + virtual void appendSubref(DitaRef* t) Q_DECL_OVERRIDE { subrefs_.append(t); } private: DitaRefList subrefs_; @@ -111,7 +111,7 @@ public: MapRef() { } ~MapRef() { } - virtual bool isMapRef() const { return true; } + virtual bool isMapRef() const Q_DECL_OVERRIDE { return true; } }; class Doc diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp index 5aff19e121..db531e3936 100644 --- a/src/tools/qdoc/generator.cpp +++ b/src/tools/qdoc/generator.cpp @@ -64,7 +64,7 @@ QString Generator::outSubdir_; QStringList Generator::outFileNames_; QSet<QString> Generator::outputFormats; QHash<QString, QString> Generator::outputPrefixes; -QString Generator::project; +QString Generator::project_; QStringList Generator::scriptDirs; QStringList Generator::scriptFiles; QString Generator::sinceTitles[] = @@ -92,7 +92,9 @@ bool Generator::debugging_ = false; bool Generator::noLinkErrors_ = false; bool Generator::autolinkErrors_ = false; bool Generator::redirectDocumentationToDevNull_ = false; -Generator::Passes Generator::qdocPass_ = Both; +Generator::QDocPass Generator::qdocPass_ = Generator::Neither; +bool Generator::qdocSingleExec_ = false; +bool Generator::qdocWriteQaPages_ = false; bool Generator::useOutputSubdirs_ = true; void Generator::startDebugging(const QString& message) @@ -134,6 +136,7 @@ Generator::Generator() inTableHeader_(false), threeColumnEnumValueTable_(true), showInternal_(false), + singleExec_(false), numTableRows_(0) { qdb_ = QDocDatabase::qdocDB(); @@ -259,7 +262,8 @@ void Generator::writeOutFileNames() void Generator::beginSubPage(const InnerNode* node, const QString& fileName) { QString path = outputDir() + QLatin1Char('/'); - if (Generator::useOutputSubdirs() && !node->outputSubdirectory().isEmpty()) + if (Generator::useOutputSubdirs() && !node->outputSubdirectory().isEmpty() && + !outputDir().endsWith(node->outputSubdirectory())) path += node->outputSubdirectory() + QLatin1Char('/'); path += fileName; @@ -314,7 +318,7 @@ QString Generator::fileBase(const Node *node) const if (node->isExample() || node->isExampleFile()) { QString modPrefix(node->moduleName()); if (modPrefix.isEmpty()) { - modPrefix = project; + modPrefix = project_; } base.prepend(modPrefix.toLower() + QLatin1Char('-')); } @@ -1529,7 +1533,7 @@ void Generator::initialize(const Config &config) QDir dirInfo; if (dirInfo.exists(outDir_)) { - if (!runGenerateOnly() && Generator::useOutputSubdirs()) { + if (!generating() && Generator::useOutputSubdirs()) { if (!Config::removeDirContents(outDir_)) config.lastLocation().error(tr("Cannot empty output directory '%1'").arg(outDir_)); } @@ -1643,7 +1647,7 @@ void Generator::initialize(const Config &config) ++n; } - project = config.getString(CONFIG_PROJECT); + project_ = config.getString(CONFIG_PROJECT); QStringList prefixes = config.getStringList(CONFIG_OUTPUTPREFIXES); if (!prefixes.isEmpty()) { @@ -1678,6 +1682,7 @@ void Generator::initializeGenerator(const Config& config) { config_ = &config; showInternal_ = config.getBool(CONFIG_SHOWINTERNAL); + singleExec_ = config.getBool(CONFIG_SINGLEEXEC); } bool Generator::matchAhead(const Atom *atom, Atom::Type expectedAtomType) diff --git a/src/tools/qdoc/generator.h b/src/tools/qdoc/generator.h index 110a8d9e73..b1faf02ae9 100644 --- a/src/tools/qdoc/generator.h +++ b/src/tools/qdoc/generator.h @@ -61,7 +61,7 @@ class Generator Q_DECLARE_TR_FUNCTIONS(QDoc::Generator) public: - enum Passes { Both, Prepare, Generate }; + enum QDocPass { Neither, Prepare, Generate }; enum ListType { Generic, Obsolete }; Generator(); @@ -91,10 +91,14 @@ public: static bool debugging() { return debugging_; } static bool noLinkErrors() { return noLinkErrors_; } static bool autolinkErrors() { return autolinkErrors_; } - static void setQDocPass(Passes pass) { qdocPass_ = pass; } - static bool runPrepareOnly() { return (qdocPass_ == Prepare); } - static bool runGenerateOnly() { return (qdocPass_ == Generate); } - static QString defaultModuleName() { return project; } + static void setQDocPass(QDocPass t) { qdocPass_ = t; } + static bool preparing() { return (qdocPass_ == Prepare); } + static bool generating() { return (qdocPass_ == Generate); } + static bool singleExec() { return qdocSingleExec_; } + static bool writeQaPages() { return qdocWriteQaPages_; } + static void setSingleExec() { qdocSingleExec_ = true; } + static void setWriteQaPages() { qdocWriteQaPages_ = true; } + static QString defaultModuleName() { return project_; } static void resetUseOutputSubdirs() { useOutputSubdirs_ = false; } static bool useOutputSubdirs() { return useOutputSubdirs_; } @@ -103,6 +107,7 @@ protected: virtual void endSubPage(); virtual QString fileBase(const Node* node) const; virtual QString fileExtension() const = 0; + virtual void generateQAPage() { } virtual void generateAlsoList(const Node *node, CodeMarker *marker); virtual int generateAtom(const Atom *atom, const Node *relative, CodeMarker *marker); virtual void generateBody(const Node *node, CodeMarker *marker); @@ -198,7 +203,7 @@ private: static QStringList imageDirs; static QStringList imageFiles; static QMap<QString, QStringList> imgFileExts; - static QString project; + static QString project_; static QString outDir_; static QString outSubdir_; static QStringList outFileNames_; @@ -212,7 +217,9 @@ private: static bool noLinkErrors_; static bool autolinkErrors_; static bool redirectDocumentationToDevNull_; - static Passes qdocPass_; + static QDocPass qdocPass_; + static bool qdocSingleExec_; + static bool qdocWriteQaPages_; static bool useOutputSubdirs_; void generateReimplementedFrom(const FunctionNode *func, CodeMarker *marker); @@ -232,6 +239,7 @@ private: bool inTableHeader_; bool threeColumnEnumValueTable_; bool showInternal_; + bool singleExec_; int numTableRows_; QString link_; QString sectionNumber_; diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp index ced7e637b3..bb1f9cd651 100644 --- a/src/tools/qdoc/htmlgenerator.cpp +++ b/src/tools/qdoc/htmlgenerator.cpp @@ -100,8 +100,10 @@ HtmlGenerator::HtmlGenerator() */ HtmlGenerator::~HtmlGenerator() { - if (helpProjectWriter) + if (helpProjectWriter) { delete helpProjectWriter; + helpProjectWriter = 0; + } } /*! @@ -130,6 +132,11 @@ void HtmlGenerator::initializeGenerator(const Config &config) Generator::initializeGenerator(config); obsoleteLinks = config.getBool(CONFIG_OBSOLETELINKS); setImageFileExtensions(QStringList() << "png" << "jpg" << "jpeg" << "gif"); + + /* + The formatting maps are owned by Generator. They are cleared in + Generator::terminate(). + */ int i = 0; while (defaults[i].key) { formattingLeftMap().insert(defaults[i].key, defaults[i].left); @@ -215,7 +222,12 @@ void HtmlGenerator::initializeGenerator(const Config &config) // The following line was changed to fix QTBUG-27798 //codeIndent = config.getInt(CONFIG_CODEINDENT); - helpProjectWriter = new HelpProjectWriter(config, project.toLower() + ".qhp", this); + /* + The help file write should be allocated once and only once + per qdoc execution. + */ + if (helpProjectWriter == 0) + helpProjectWriter = new HelpProjectWriter(config, project.toLower() + ".qhp", this); // Documentation template handling headerScripts = config.getString(HtmlGenerator::format() + Config::dot + CONFIG_HEADERSCRIPTS); @@ -263,6 +275,20 @@ QString HtmlGenerator::format() } /*! + Generate targets for any \keyword commands that were seen + in the qdoc comment for the \a node. + */ +void HtmlGenerator::generateKeywordAnchors(const Node* node) +{ + if (!node->doc().isEmpty()) { + const QList<Atom*>& keywords = node->doc().keywords(); + foreach (Atom* a, keywords) { + out() << "<a name=\"" << Doc::canonicalTitle(a->string()) << "\"></a>"; + } + } +} + +/*! Traverses the current tree generating all the HTML documentation. */ void HtmlGenerator::generateDocs() @@ -270,10 +296,12 @@ void HtmlGenerator::generateDocs() Node* qflags = qdb_->findClassNode(QStringList("QFlags")); if (qflags) qflagsHref_ = linkForNode(qflags,0); - if (!runPrepareOnly()) + if (!preparing()) Generator::generateDocs(); + if (Generator::generating() && Generator::writeQaPages()) + generateQAPage(); - if (!runGenerateOnly()) { + if (!generating()) { QString fileBase = project.toLower().simplified().replace(QLatin1Char(' '), QLatin1Char('-')); qdb_->generateIndex(outputDir() + QLatin1Char('/') + fileBase + ".index", projectUrl, @@ -282,7 +310,7 @@ void HtmlGenerator::generateDocs() true); } - if (!runPrepareOnly()) { + if (!preparing()) { helpProjectWriter->generate(); generateManifestFiles(); /* @@ -293,6 +321,144 @@ void HtmlGenerator::generateDocs() } /*! + Output the module's Quality Assurance page. + */ +void HtmlGenerator::generateQAPage() +{ + NamespaceNode* node = qdb_->primaryTreeRoot(); + beginSubPage(node, "aaa-" + defaultModuleName().toLower() + "-qa-page.html"); + CodeMarker* marker = CodeMarker::markerForFileName(node->location().filePath()); + QString title = "Quality Assurance Page for " + defaultModuleName(); + QString t = "Quality assurance information for checking the " + defaultModuleName() + " documentation."; + generateHeader(title, node, marker); + generateTitle(title, Text() << t, LargeSubTitle, node, marker); + + QStringList strings; + QVector<int> counts; + QString depends = qdb_->getLinkCounts(strings, counts); + if (!strings.isEmpty()) { + t = "Intermodule Link Counts"; + QString ref = registerRef(t); + out() << "<a name=\"" << ref << "\"></a>" << divNavTop << '\n'; + out() << "<h2 id=\"" << ref << "\">" << protectEnc(t) << "</h2>\n"; + out() << "<table class=\"valuelist\"><tr valign=\"top\" " + << "class=\"even\"><th class=\"tblConst\">Destination Module</th>" + << "<th class=\"tblval\">Link Count</th></tr>\n"; + QString fileName; + for (int i = 0; i< strings.size(); ++i) { + fileName = generateLinksToLinksPage(strings.at(i), marker); + out() << "<tr><td class=\"topAlign\"><tt>" + << "<a href=\"" << fileName << "\">" + << strings.at(i) << "</a>" + << "</tt></td><td class=\"topAlign\"><tt>" << counts.at(i) + << "</tt></td></tr>\n"; + } + int count = 0; + fileName = generateLinksToBrokenLinksPage(marker, count); + if (count != 0) { + out() << "<tr><td class=\"topAlign\"><tt>" + << "<a href=\"" << fileName << "\">" + << "Broken Links" << "</a>" + << "</tt></td><td class=\"topAlign\"><tt>" << count + << "</tt></td></tr>\n"; + + } + + out() << "</table>\n"; + t = "The Optimal \"depends\" Variable"; + out() << "<h2>" << protectEnc(t) << "</h2>\n"; + t = "Consider replacing the depends variable in " + defaultModuleName().toLower() + + ".qdocconf with this one, if the two are not identical:"; + out() << "<p>" << protectEnc(t) << "</p>\n"; + out() << "<p>" << protectEnc(depends) << "</p>\n"; + } + generateFooter(); + endSubPage(); +} + +/*! + This function writes an html file containing a list of + links to links that originate in the current module and + go to targets in the specified \a module. The \a marker + is used for the same thing the marker is always used for. + */ +QString HtmlGenerator::generateLinksToLinksPage(const QString& module, CodeMarker* marker) +{ + NamespaceNode* node = qdb_->primaryTreeRoot(); + QString fileName = "aaa-links-to-" + module + ".html"; + beginSubPage(node, fileName); + QString title = "Links from " + defaultModuleName() + " to " + module; + generateHeader(title, node, marker); + generateTitle(title, Text(), SmallSubTitle, node, marker); + out() << "<p>This is a list of links from " << defaultModuleName() + << " to " << module << ". "; + out() << "Click on a link to go to the location of the link. The link is marked "; + out() << "with red asterisks. "; + out() << "Click on the marked link to see if it goes to the right place.</p>\n"; + TargetList* tlist = qdb_->getTargetList(module); + if (tlist) { + out() << "<table class=\"valuelist\"><tr valign=\"top\" class=\"odd\"><th class=\"tblConst\">Link to link...</th><th class=\"tblval\">In file...</th><th class=\"tbldscr\">Somewhere after line number...</th></tr>\n"; + foreach (TargetLoc* t, *tlist) { + // e.g.: <a name="link-8421"></a><a href="layout.html">Layout Management</a> + out() << "<tr><td class=\"topAlign\">"; + out() << "<a href=\"" << t->fileName_ << "#" << t->target_ << "\">"; + out() << t->text_ << "</a></td>"; + out() << "<td class=\"topAlign\">"; + QString f = t->loc_->doc().location().filePath(); + out() << f << "</td>"; + out() << "<td class=\"topAlign\">"; + out() << t->loc_->doc().location().lineNo() << "</td></tr>\n"; + } + out() << "</table>\n"; + } + generateFooter(); + endSubPage(); + return fileName; +} + +/*! + This function writes an html file containing a list of + links to broken links that originate in the current + module and go nowwhere. It returns the name of the file + it generates, and it sets \a count to the number of + broken links that were found. The \a marker is used for + the same thing the marker is always used for. + */ +QString HtmlGenerator::generateLinksToBrokenLinksPage(CodeMarker* marker, int& count) +{ + QString fileName; + NamespaceNode* node = qdb_->primaryTreeRoot(); + TargetList* tlist = qdb_->getTargetList("broken"); + if (tlist && !tlist->isEmpty()) { + count = tlist->size(); + fileName = "aaa-links-to-broken-links.html"; + beginSubPage(node, fileName); + QString title = "Broken links in " + defaultModuleName(); + generateHeader(title, node, marker); + generateTitle(title, Text(), SmallSubTitle, node, marker); + out() << "<p>This is a list of broken links in " << defaultModuleName() << ". "; + out() << "Click on a link to go to the broken link. "; + out() << "The link's target could not be found.</p>\n"; + out() << "<table class=\"valuelist\"><tr valign=\"top\" class=\"odd\"><th class=\"tblConst\">Link to broken link...</th><th class=\"tblval\">In file...</th><th class=\"tbldscr\">Somewhere after line number...</th></tr>\n"; + foreach (TargetLoc* t, *tlist) { + // e.g.: <a name="link-8421"></a><a href="layout.html">Layout Management</a> + out() << "<tr><td class=\"topAlign\">"; + out() << "<a href=\"" << t->fileName_ << "#" << t->target_ << "\">"; + out() << t->text_ << "</a></td>"; + out() << "<td class=\"topAlign\">"; + QString f = t->loc_->doc().location().filePath(); + out() << f << "</td>"; + out() << "<td class=\"topAlign\">"; + out() << t->loc_->doc().location().lineNo() << "</td></tr>\n"; + } + out() << "</table>\n"; + generateFooter(); + endSubPage(); + } + return fileName; +} + +/*! Generate html from an instance of Atom. */ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMarker *marker) @@ -310,6 +476,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark case Atom::AbstractRight: break; case Atom::AutoLink: + case Atom::NavAutoLink: if (!inLink_ && !inContents_ && !inSectionHeading_) { const Node *node = 0; QString link = getAutoLink(atom, relative, &node); @@ -321,9 +488,15 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark if ((relative->parent() != node) && !relative->isObsolete()) link.clear(); } - if (link.isEmpty()) + if (link.isEmpty()) { out() << protectEnc(atom->string()); + } else { + if (Generator::writeQaPages() && node && (atom->type() != Atom::NavAutoLink)) { + QString text = atom->string(); + QString target = qdb_->getNewLinkTarget(relative, node, outFileName(), text); + out() << "<a id=\"" << Doc::canonicalTitle(target) << "\" class=\"qa-mark\"></a>"; + } beginLink(link, node, relative); generateLink(atom, marker); endLink(); @@ -806,14 +979,31 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark out() << "<br/>"; break; case Atom::Link: + case Atom::NavLink: { inObsoleteLink = false; const Node *node = 0; QString link = getLink(atom, relative, &node); if (link.isEmpty() && (node != relative) && !noLinkErrors()) { relative->doc().location().warning(tr("Can't link to '%1'").arg(atom->string())); + if (Generator::writeQaPages() && (atom->type() != Atom::NavAutoLink)) { + QString text = atom->next()->next()->string(); + QString target = qdb_->getNewLinkTarget(relative, node, outFileName(), text, true); + out() << "<a id=\"" << Doc::canonicalTitle(target) << "\" class=\"qa-mark\"></a>"; + } } else { + if (Generator::writeQaPages() && node && (atom->type() != Atom::NavLink)) { + QString text = atom->next()->next()->string(); + QString target = qdb_->getNewLinkTarget(relative, node, outFileName(), text); + out() << "<a id=\"" << Doc::canonicalTitle(target) << "\" class=\"qa-mark\"></a>"; + } + /* + mws saw this on 17/10/2014. + Is this correct? Setting node to 0 means the + following test always fails. Did we decide to + no longer warn about linking to obsolete things? + */ node = 0; if (node && node->status() == Node::Obsolete) { if ((relative->parent() != node) && !relative->isObsolete()) { @@ -1126,6 +1316,8 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark break; case Atom::TableOfContents: break; + case Atom::Keyword: + break; case Atom::Target: out() << "<a name=\"" << Doc::canonicalTitle(atom->string()) << "\"></a>"; break; @@ -1173,8 +1365,10 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker) subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")" << Atom(Atom::LineBreak); generateHeader(title, inner, marker); + sections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay); generateTableOfContents(inner,marker,§ions); + generateKeywordAnchors(inner); generateTitle(title, subtitleText, SmallSubTitle, inner, marker); generateBrief(inner, marker); generateRequisites(inner, marker); @@ -1346,6 +1540,7 @@ void HtmlGenerator::generateQmlTypePage(QmlClassNode* qcn, CodeMarker* marker) QList<Section> sections = marker->qmlSections(qcn, CodeMarker::Summary); generateTableOfContents(qcn, marker, §ions); marker = CodeMarker::markerForLanguage(QLatin1String("QML")); + generateKeywordAnchors(qcn); generateTitle(htmlTitle, Text() << qcn->subTitle(), subTitleSize, qcn, marker); generateBrief(qcn, marker); generateQmlRequisites(qcn, marker); @@ -1417,6 +1612,7 @@ void HtmlGenerator::generateQmlBasicTypePage(QmlBasicTypeNode* qbtn, CodeMarker* generateHeader(htmlTitle, qbtn, marker); QList<Section> sections = marker->sections(qbtn, CodeMarker::Summary, CodeMarker::Okay); generateTableOfContents(qbtn,marker,§ions); + generateKeywordAnchors(qbtn); generateTitle(htmlTitle, Text() << qbtn->subTitle(), subTitleSize, @@ -1462,6 +1658,7 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker) if ((dn->name() != QStringLiteral("index.html"))) generateTableOfContents(dn,marker,0); + generateKeywordAnchors(dn); generateTitle(fullTitle, Text() << dn->subTitle(), subTitleSize, @@ -1546,6 +1743,7 @@ void HtmlGenerator::generateCollectionNode(CollectionNode* cn, CodeMarker* marke generateHeader(fullTitle, cn, marker); generateTableOfContents(cn,marker,0); + generateKeywordAnchors(cn); generateTitle(fullTitle, Text() << cn->subTitle(), subTitleSize, cn, marker); if (cn->isModule()) { @@ -1646,11 +1844,11 @@ void HtmlGenerator::generateNavigationBar(const QString &title, return; if (!homepage.isEmpty()) navigationbar << Atom(Atom::ListItemLeft) - << Atom(Atom::AutoLink, homepage) + << Atom(Atom::NavAutoLink, homepage) << Atom(Atom::ListItemRight); if (!landingpage.isEmpty() && landingpage != title) navigationbar << Atom(Atom::ListItemLeft) - << Atom(Atom::AutoLink, landingpage) + << Atom(Atom::NavAutoLink, landingpage) << Atom(Atom::ListItemRight); if (node->isClass()) { @@ -1659,7 +1857,7 @@ void HtmlGenerator::generateNavigationBar(const QString &title, if (!cppclassespage.isEmpty()) navigationbar << Atom(Atom::ListItemLeft) - << Atom(Atom::Link, cppclassespage) + << Atom(Atom::NavLink, cppclassespage) << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) << Atom(Atom::String, QLatin1String("C++ Classes")) << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) @@ -1673,7 +1871,7 @@ void HtmlGenerator::generateNavigationBar(const QString &title, else if (node->isQmlType() || node->isQmlBasicType()) { if (!qmltypespage.isEmpty()) navigationbar << Atom(Atom::ListItemLeft) - << Atom(Atom::Link, qmltypespage) + << Atom(Atom::NavLink, qmltypespage) << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) << Atom(Atom::String, QLatin1String("QML Types")) << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) @@ -1685,7 +1883,7 @@ void HtmlGenerator::generateNavigationBar(const QString &title, else { if (node->isExampleFile()) { navigationbar << Atom(Atom::ListItemLeft) - << Atom(Atom::Link, node->parent()->name()) + << Atom(Atom::NavLink, node->parent()->name()) << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) << Atom(Atom::String, node->parent()->title()) << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) @@ -2329,7 +2527,7 @@ QString HtmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, out() << ", including inherited members.</p>\n"; Section section = sections.first(); - generateSectionList(section, 0, marker, CodeMarker::Subpage); + generateSectionList(section, inner, marker, CodeMarker::Subpage); generateFooter(); endSubPage(); @@ -2386,7 +2584,7 @@ QString HtmlGenerator::generateAllQmlMembersFile(QmlClassNode* qml_cn, CodeMarke prefix = keys.at(j).mid(1); prefix = prefix.left(keys.at(j).indexOf("::")+1); } - generateQmlItem(nodes[j], qcn, marker, true); + generateQmlItem(nodes[j], qml_cn, marker, true); if (nodes[j]->isAttached()) out() << " [attached]"; //generateSynopsis(nodes[j], qcn, marker, CodeMarker::Subpage, false, &prefix); @@ -2815,8 +3013,9 @@ void HtmlGenerator::generateCompactList(ListType listType, else if (listType == Obsolete) { QString fileName = fileBase(it.value()) + "-obsolete." + fileExtension(); QString link; - if (useOutputSubdirs()) + if (useOutputSubdirs()) { link = QString("../" + it.value()->outputSubdirectory() + QLatin1Char('/')); + } link += fileName; out() << "<a href=\"" << link << "\">"; } @@ -2856,7 +3055,7 @@ void HtmlGenerator::generateFunctionIndex(const Node *relative) char currentLetter; out() << "<ul>\n"; - NodeMapMap funcIndex = qdb_->getFunctionIndex(); + NodeMapMap& funcIndex = qdb_->getFunctionIndex(); QMap<QString, NodeMap >::ConstIterator f = funcIndex.constBegin(); while (f != funcIndex.constEnd()) { out() << "<li>"; @@ -3675,34 +3874,7 @@ QString HtmlGenerator::getLink(const Atom *atom, const Node *relative, const Nod if (t.startsWith("mailto:")) return t; } - - QString ref; - - *node = qdb_->findNodeForAtom(atom, relative, ref); - if (!(*node)) - return QString(); - - QString url = (*node)->url(); - if (!url.isEmpty()) { - if (ref.isEmpty()) - return url; - int hashtag = url.lastIndexOf(QChar('#')); - if (hashtag != -1) - url.truncate(hashtag); - return url + "#" + ref; - } - /* - Given that *node is not null, we now cconstruct a link - to the page that *node represents, and then if we found - a target on that page, we connect the target to the link - with '#'. - */ - QString link = linkForNode(*node, relative); - if (*node && (*node)->subType() == Node::Image) - link = "images/used-in-examples/" + link; - if (!ref.isEmpty()) - link += QLatin1Char('#') + ref; - return link; + return getAutoLink(atom, relative, node); } /*! @@ -3720,29 +3892,28 @@ QString HtmlGenerator::getLink(const Atom *atom, const Node *relative, const Nod QString HtmlGenerator::getAutoLink(const Atom *atom, const Node *relative, const Node** node) { QString ref; - QString link; *node = qdb_->findNodeForAtom(atom, relative, ref); if (!(*node)) return QString(); - QString url = (*node)->url(); - if (!url.isEmpty()) { - if (ref.isEmpty()) - return url; - int hashtag = url.lastIndexOf(QChar('#')); + QString link = (*node)->url(); + if (link.isEmpty()) { + link = linkForNode(*node, relative); + if ((*node)->subType() == Node::Image) + link = "images/used-in-examples/" + link; + if (!ref.isEmpty()) + link += QLatin1Char('#') + ref; + } + else if (!ref.isEmpty()) { + int hashtag = link.lastIndexOf(QChar('#')); if (hashtag != -1) - url.truncate(hashtag); - return url + "#" + ref; + link.truncate(hashtag); + link += "#" + ref; } - - link = linkForNode(*node, relative); - if (!ref.isEmpty()) - link += QLatin1Char('#') + ref; return link; } - /*! Construct the link string for the \a node and return it. The \a relative node is use to decide the link we are @@ -3797,7 +3968,12 @@ QString HtmlGenerator::linkForNode(const Node *node, const Node *relative) if (node && relative && (node != relative)) { if (useOutputSubdirs() && !node->isExternalPage() && node->outputSubdirectory() != relative->outputSubdirectory()) { - link.prepend(QString("../" + node->outputSubdirectory() + QLatin1Char('/'))); + if (link.startsWith(QString(node->outputSubdirectory() + QLatin1Char('/')))) { + link.prepend(QString("../")); + } + else { + link.prepend(QString("../" + node->outputSubdirectory() + QLatin1Char('/'))); + } } } return link; @@ -3835,6 +4011,7 @@ void HtmlGenerator::generateDetailedMember(const Node *node, generateMacRef(node, marker); #endif generateExtractionMark(node, MemberMark); + generateKeywordAnchors(node); QString nodeRef = refForNode(node); if (node->type() == Node::Enum && (enume = static_cast<const EnumNode *>(node))->flagsType()) { @@ -4071,6 +4248,7 @@ void HtmlGenerator::generateDetailedQmlMember(Node *node, generateMacRef(node, marker); #endif generateExtractionMark(node, MemberMark); + generateKeywordAnchors(node); out() << "<div class=\"qmlitem\">"; QString nodeRef = refForNode(node); if (node->type() == Node::QmlPropertyGroup) { @@ -4524,6 +4702,9 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element) Reads metacontent - additional attributes and tags to apply when generating manifest files, read from config. Takes the configuration class \a config as a parameter. + + The manifest metacontent map is cleared immediately after + the manifest files have been generated. */ void HtmlGenerator::readManifestMetaContent(const Config &config) { diff --git a/src/tools/qdoc/htmlgenerator.h b/src/tools/qdoc/htmlgenerator.h index 40360da02e..4d93822db1 100644 --- a/src/tools/qdoc/htmlgenerator.h +++ b/src/tools/qdoc/htmlgenerator.h @@ -77,10 +77,10 @@ public: HtmlGenerator(); ~HtmlGenerator(); - virtual void initializeGenerator(const Config& config); - virtual void terminateGenerator(); - virtual QString format(); - virtual void generateDocs(); + virtual void initializeGenerator(const Config& config) Q_DECL_OVERRIDE; + virtual void terminateGenerator() Q_DECL_OVERRIDE; + virtual QString format() Q_DECL_OVERRIDE; + virtual void generateDocs() Q_DECL_OVERRIDE; void generateManifestFiles(); QString protectEnc(const QString &string); @@ -89,20 +89,24 @@ public: static QString sinceTitle(int i) { return sinceTitles[i]; } protected: + virtual void generateQAPage() Q_DECL_OVERRIDE; + QString generateLinksToLinksPage(const QString& module, CodeMarker* marker); + QString generateLinksToBrokenLinksPage(CodeMarker* marker, int& count); virtual int generateAtom(const Atom *atom, const Node *relative, - CodeMarker *marker); - virtual void generateClassLikeNode(InnerNode* inner, CodeMarker* marker); - virtual void generateQmlTypePage(QmlClassNode* qcn, CodeMarker* marker); - virtual void generateQmlBasicTypePage(QmlBasicTypeNode* qbtn, CodeMarker* marker); - virtual void generateDocNode(DocNode* dn, CodeMarker* marker); - virtual void generateCollectionNode(CollectionNode* cn, CodeMarker* marker); - virtual QString fileExtension() const; + CodeMarker *marker) Q_DECL_OVERRIDE; + virtual void generateClassLikeNode(InnerNode* inner, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateQmlTypePage(QmlClassNode* qcn, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateQmlBasicTypePage(QmlBasicTypeNode* qbtn, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateDocNode(DocNode* dn, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual void generateCollectionNode(CollectionNode* cn, CodeMarker* marker) Q_DECL_OVERRIDE; + virtual QString fileExtension() const Q_DECL_OVERRIDE; virtual QString refForNode(const Node *node); virtual QString linkForNode(const Node *node, const Node *relative); void generateManifestFile(QString manifest, QString element); void readManifestMetaContent(const Config &config); + void generateKeywordAnchors(const Node* node); private: enum SubTitleSize { SmallSubTitle, LargeSubTitle }; @@ -179,7 +183,7 @@ private: void generateDetailedQmlMember(Node *node, const InnerNode *relative, CodeMarker *marker); - void generateQmlInherits(QmlClassNode* qcn, CodeMarker* marker); + void generateQmlInherits(QmlClassNode* qcn, CodeMarker* marker) Q_DECL_OVERRIDE; void generateQmlInstantiates(QmlClassNode* qcn, CodeMarker* marker); void generateInstantiatedBy(ClassNode* cn, CodeMarker* marker); @@ -210,7 +214,7 @@ private: QString getAutoLink(const Atom *atom, const Node *relative, const Node** node); QString registerRef(const QString& ref); - virtual QString fileBase(const Node *node) const; + virtual QString fileBase(const Node *node) const Q_DECL_OVERRIDE; QString fileName(const Node *node); static int hOffset(const Node *node); static bool isThreeColumnEnumValueTable(const Atom *atom); diff --git a/src/tools/qdoc/jscodemarker.h b/src/tools/qdoc/jscodemarker.h index 52fe8855af..70bf38d67d 100644 --- a/src/tools/qdoc/jscodemarker.h +++ b/src/tools/qdoc/jscodemarker.h @@ -50,14 +50,14 @@ public: JsCodeMarker(); ~JsCodeMarker(); - virtual bool recognizeCode(const QString &code); - virtual bool recognizeExtension(const QString &ext); - virtual bool recognizeLanguage(const QString &language); - virtual Atom::Type atomType() const; + virtual bool recognizeCode(const QString &code) Q_DECL_OVERRIDE; + virtual bool recognizeExtension(const QString &ext) Q_DECL_OVERRIDE; + virtual bool recognizeLanguage(const QString &language) Q_DECL_OVERRIDE; + virtual Atom::Type atomType() const Q_DECL_OVERRIDE; virtual QString markedUpCode(const QString &code, const Node *relative, - const Location &location); + const Location &location) Q_DECL_OVERRIDE; private: QString addMarkUp(const QString &code, const Node *relative, diff --git a/src/tools/qdoc/location.cpp b/src/tools/qdoc/location.cpp index 040dd0cd88..923901fc34 100644 --- a/src/tools/qdoc/location.cpp +++ b/src/tools/qdoc/location.cpp @@ -256,7 +256,7 @@ QString Location::canonicalRelativePath(const QString &path) */ void Location::warning(const QString& message, const QString& details) const { - if (!Generator::runPrepareOnly()) + if (!Generator::preparing()) emitMessage(Warning, message, details); } @@ -267,7 +267,7 @@ void Location::warning(const QString& message, const QString& details) const */ void Location::error(const QString& message, const QString& details) const { - if (!Generator::runPrepareOnly()) + if (!Generator::preparing()) emitMessage(Error, message, details); } @@ -286,6 +286,15 @@ void Location::fatal(const QString& message, const QString& details) const } /*! + Writes \a message and \a detals to stderr as a formatted + report message. + */ +void Location::report(const QString& message, const QString& details) const +{ + emitMessage(Report, message, details); +} + +/*! Gets several parameters from the \a config, including tab size, program name, and a regular expression that appears to be used for matching certain error messages @@ -371,7 +380,8 @@ void Location::emitMessage(MessageType type, result.prepend(tr(": error: ")); else if (type == Warning) result.prepend(tr(": warning: ")); - result.prepend(toString()); + if (type != Report) + result.prepend(toString()); fprintf(stderr, "%s\n", result.toLatin1().data()); fflush(stderr); } diff --git a/src/tools/qdoc/location.h b/src/tools/qdoc/location.h index eb4dbbae98..b6589fd6ab 100644 --- a/src/tools/qdoc/location.h +++ b/src/tools/qdoc/location.h @@ -81,6 +81,8 @@ public: const QString& details = QString()) const; void fatal(const QString& message, const QString& details = QString()) const; + void report(const QString& message, + const QString& details = QString()) const; static const Location null; @@ -94,7 +96,7 @@ public: static QString canonicalRelativePath(const QString &path); private: - enum MessageType { Warning, Error }; + enum MessageType { Warning, Error, Report }; struct StackEntry { diff --git a/src/tools/qdoc/main.cpp b/src/tools/qdoc/main.cpp index 118c206f16..186fd3195b 100644 --- a/src/tools/qdoc/main.cpp +++ b/src/tools/qdoc/main.cpp @@ -63,7 +63,6 @@ QT_BEGIN_NAMESPACE - bool creationTimeBefore(const QFileInfo &fi1, const QFileInfo &fi2) { return fi1.lastModified() < fi2.lastModified(); @@ -71,6 +70,8 @@ bool creationTimeBefore(const QFileInfo &fi1, const QFileInfo &fi2) static bool highlighting = false; static bool showInternal = false; +static bool singleExec = false; +static bool writeQaPages = false; static bool redirectDocumentationToDevNull = false; static bool noLinkErrors = false; static bool autolinkErrors = false; @@ -80,14 +81,22 @@ static QStringList dependModules; static QStringList indexDirs; static QString currentDir; static QString prevCurrentDir; +static QHash<QString,QString> defaults; +#ifndef QT_NO_TRANSLATION +typedef QPair<QString, QTranslator*> Translator; +static QList<Translator> translators; +#endif - +/*! + Read some XML indexes containing definitions from other + documentation sets. \a config contains a variable that + lists directories where index files can bge found. It also + contains the \c depends variable, which lists the modules + that the current module depends on. +*/ static void loadIndexFiles(Config& config) { QDocDatabase* qdb = QDocDatabase::qdocDB(); - /* - Read some XML indexes containing definitions from other documentation sets. - */ QStringList indexFiles; QStringList configIndexes = config.getStringList(CONFIG_INDEXES); foreach (const QString &index, configIndexes) { @@ -194,35 +203,17 @@ static void loadIndexFiles(Config& config) */ static void processQdocconfFile(const QString &fileName) { -#ifndef QT_NO_TRANSLATION - QList<QTranslator *> translators; -#endif - /* The Config instance represents the configuration data for qdoc. - All the other classes are initialized with the config. Here we + All the other classes are initialized with the config. Below, we initialize the configuration with some default values. - */ - Config config(QCoreApplication::translate("QDoc", "qdoc")); - /* - The default indent for code is 4. - The default value for false is 0. - The default supported file extensions are cpp, h, qdoc and qml. - The default language is c++. - The default output format is html. - The default tab size is 8. - And those are all the default values for configuration variables. + I don't think the call to translate() does anything here. For one + thing, the translators haven't been installed at this point. And + I doubt any translator would translate QDoc anyway. But I left it + here because it does no harm. */ - static QHash<QString,QString> defaults; - if (defaults.isEmpty()) { - defaults.insert(CONFIG_CODEINDENT, QLatin1String("4")); - defaults.insert(CONFIG_FALSEHOODS, QLatin1String("0")); - defaults.insert(CONFIG_FILEEXTENSIONS, QLatin1String("*.cpp *.h *.qdoc *.qml")); - defaults.insert(CONFIG_LANGUAGE, QLatin1String("Cpp")); - defaults.insert(CONFIG_OUTPUTFORMATS, QLatin1String("HTML")); - defaults.insert(CONFIG_TABSIZE, QLatin1String("8")); - } + Config config(QCoreApplication::translate("QDoc", "qdoc")); QHash<QString,QString>::iterator iter; for (iter = defaults.begin(); iter != defaults.end(); ++iter) @@ -230,6 +221,8 @@ static void processQdocconfFile(const QString &fileName) config.setStringList(CONFIG_SYNTAXHIGHLIGHTING, QStringList(highlighting ? "true" : "false")); config.setStringList(CONFIG_SHOWINTERNAL, QStringList(showInternal ? "true" : "false")); + config.setStringList(CONFIG_SINGLEEXEC, QStringList(singleExec ? "true" : "false")); + config.setStringList(CONFIG_WRITEQAPAGES, QStringList(writeQaPages ? "true" : "false")); config.setStringList(CONFIG_REDIRECTDOCUMENTATIONTODEVNULL, QStringList(redirectDocumentationToDevNull ? "true" : "false")); config.setStringList(CONFIG_NOLINKERRORS, QStringList(noLinkErrors ? "true" : "false")); config.setStringList(CONFIG_AUTOLINKERRORS, QStringList(autolinkErrors ? "true" : "false")); @@ -247,8 +240,8 @@ static void processQdocconfFile(const QString &fileName) currentDir = QFileInfo(fileName).path(); Location::initialize(config); config.load(fileName); - QString project = config.getString(CONFIG_PROJECT).toLower(); - //qDebug() << "\nStart project:" << project; + QString project = config.getString(CONFIG_PROJECT); + //qDebug() << "Start project:" << project; /* Add the defines to the configuration variables. */ @@ -261,17 +254,24 @@ static void processQdocconfFile(const QString &fileName) if (!currentDir.isEmpty()) QDir::setCurrent(currentDir); - QString phase; - if (Generator::runPrepareOnly()) - phase = " in -prepare mode "; - else if (Generator::runGenerateOnly()) - phase = " in -generate mode "; + QString phase = " in -"; + if (Generator::singleExec()) + phase += "single exec mode, "; + else + phase += "separate exec mode, "; + if (Generator::preparing()) + phase += "prepare phase "; + else if (Generator::generating()) + phase += "generate phase "; QString msg = "Running qdoc for " + config.getString(CONFIG_PROJECT) + phase; Location::logToStdErr(msg); /* Initialize all the classes and data structures with the - qdoc configuration. + qdoc configuration. This is safe to do for each qdocconf + file processed, because all the data structures created + are either cleared after they have been used, or they + are cleared in the terminate() functions below. */ Location::initialize(config); Tokenizer::initialize(config); @@ -282,16 +282,32 @@ static void processQdocconfFile(const QString &fileName) #ifndef QT_NO_TRANSLATION /* - Load the language translators, if the configuration specifies any. + Load the language translators, if the configuration specifies any, + but only if they haven't already been loaded. This works in both + -prepare/-generate mode and -singleexec mode. */ QStringList fileNames = config.getStringList(CONFIG_TRANSLATORS); QStringList::ConstIterator fn = fileNames.constBegin(); while (fn != fileNames.constEnd()) { - QTranslator *translator = new QTranslator(0); - if (!translator->load(*fn)) - config.lastLocation().error(QCoreApplication::translate("QDoc", "Cannot load translator '%1'").arg(*fn)); - QCoreApplication::instance()->installTranslator(translator); - translators.append(translator); + bool found = false; + if (!translators.isEmpty()) { + for (int i=0; i<translators.size(); ++i) { + if (translators.at(i).first == *fn) { + found = true; + break; + } + } + } + if (!found) { + QTranslator *translator = new QTranslator(0); + if (!translator->load(*fn)) { + config.lastLocation().error(QCoreApplication::translate("QDoc", "Cannot load translator '%1'").arg(*fn)); + } + else { + QCoreApplication::instance()->installTranslator(translator); + translators.append(Translator(*fn, translator)); + } + } ++fn; } #endif @@ -311,175 +327,228 @@ static void processQdocconfFile(const QString &fileName) will be stored. The database includes a tree of nodes, which gets built as the source files are parsed. The documentation output is generated by traversing that tree. + + Note: qdocDB() allocates a new instance only if no instance exists. + So it is safe to call qdocDB() any time. */ QDocDatabase* qdb = QDocDatabase::qdocDB(); qdb->setVersion(config.getString(CONFIG_VERSION)); qdb->setShowInternal(config.getBool(CONFIG_SHOWINTERNAL)); + qdb->setSingleExec(config.getBool(CONFIG_SINGLEEXEC)); /* By default, the only output format is HTML. */ QSet<QString> outputFormats = config.getOutputFormats(); Location outputFormatsLocation = config.lastLocation(); - //if (!Generator::runPrepareOnly()) - Generator::debug(" loading index files"); - loadIndexFiles(config); - qdb->newPrimaryTree(config.getString(CONFIG_PROJECT)); - qdb->setSearchOrder(); - Generator::debug(" done loading index files"); + qdb->clearSearchOrder(); + QString p = config.getString(CONFIG_PROJECT).toLower(); + if (!Generator::singleExec()) { + Generator::debug(" loading index files"); + loadIndexFiles(config); + Generator::debug(" done loading index files"); + qdb->newPrimaryTree(p); + } + else if (Generator::preparing()) + qdb->newPrimaryTree(p); + else + qdb->setPrimaryTree(p); + + dependModules = config.getStringList(CONFIG_DEPENDS); + dependModules.removeDuplicates(); + qdb->setSearchOrder(dependModules); QSet<QString> excludedDirs; QSet<QString> excludedFiles; - QStringList headerList; - QStringList sourceList; QStringList excludedDirsList; QStringList excludedFilesList; - Generator::debug("Reading excludedirs"); - excludedDirsList = config.getCanonicalPathList(CONFIG_EXCLUDEDIRS); - foreach (const QString &excludeDir, excludedDirsList) { - QString p = QDir::fromNativeSeparators(excludeDir); - QDir tmp(p); - if (tmp.exists()) - excludedDirs.insert(p); - } + if (!Generator::singleExec() || !Generator::generating()) { + QStringList headerList; + QStringList sourceList; + + Generator::debug("Reading excludedirs"); + excludedDirsList = config.getCanonicalPathList(CONFIG_EXCLUDEDIRS); + foreach (const QString &excludeDir, excludedDirsList) { + QString p = QDir::fromNativeSeparators(excludeDir); + QDir tmp(p); + if (tmp.exists()) + excludedDirs.insert(p); + } - Generator::debug("Reading excludefiles"); - excludedFilesList = config.getCanonicalPathList(CONFIG_EXCLUDEFILES); - foreach (const QString& excludeFile, excludedFilesList) { - QString p = QDir::fromNativeSeparators(excludeFile); - excludedFiles.insert(p); - } + Generator::debug("Reading excludefiles"); + excludedFilesList = config.getCanonicalPathList(CONFIG_EXCLUDEFILES); + foreach (const QString& excludeFile, excludedFilesList) { + QString p = QDir::fromNativeSeparators(excludeFile); + excludedFiles.insert(p); + } - Generator::debug("Reading headerdirs"); - headerList = config.getAllFiles(CONFIG_HEADERS,CONFIG_HEADERDIRS,excludedDirs,excludedFiles); - QMap<QString,QString> headers; - QMultiMap<QString,QString> headerFileNames; - for (int i=0; i<headerList.size(); ++i) { - if (headerList[i].contains(QString("doc/snippets"))) - continue; - if (headers.contains(headerList[i])) - continue; - headers.insert(headerList[i],headerList[i]); - QString t = headerList[i].mid(headerList[i].lastIndexOf('/')+1); - headerFileNames.insert(t,t); - } + Generator::debug("Reading headerdirs"); + headerList = config.getAllFiles(CONFIG_HEADERS,CONFIG_HEADERDIRS,excludedDirs,excludedFiles); + QMap<QString,QString> headers; + QMultiMap<QString,QString> headerFileNames; + for (int i=0; i<headerList.size(); ++i) { + if (headerList[i].contains(QString("doc/snippets"))) + continue; + if (headers.contains(headerList[i])) + continue; + headers.insert(headerList[i],headerList[i]); + QString t = headerList[i].mid(headerList[i].lastIndexOf('/')+1); + headerFileNames.insert(t,t); + } - Generator::debug("Reading sourcedirs"); - sourceList = config.getAllFiles(CONFIG_SOURCES,CONFIG_SOURCEDIRS,excludedDirs,excludedFiles); - QMap<QString,QString> sources; - QMultiMap<QString,QString> sourceFileNames; - for (int i=0; i<sourceList.size(); ++i) { - if (sourceList[i].contains(QString("doc/snippets"))) - continue; - if (sources.contains(sourceList[i])) - continue; - sources.insert(sourceList[i],sourceList[i]); - QString t = sourceList[i].mid(sourceList[i].lastIndexOf('/')+1); - sourceFileNames.insert(t,t); - } - /* - Find all the qdoc files in the example dirs, and add - them to the source files to be parsed. - */ - Generator::debug("Reading exampledirs"); - QStringList exampleQdocList = config.getExampleQdocFiles(excludedDirs, excludedFiles); - for (int i=0; i<exampleQdocList.size(); ++i) { - if (!sources.contains(exampleQdocList[i])) { - sources.insert(exampleQdocList[i],exampleQdocList[i]); - QString t = exampleQdocList[i].mid(exampleQdocList[i].lastIndexOf('/')+1); + Generator::debug("Reading sourcedirs"); + sourceList = config.getAllFiles(CONFIG_SOURCES,CONFIG_SOURCEDIRS,excludedDirs,excludedFiles); + QMap<QString,QString> sources; + QMultiMap<QString,QString> sourceFileNames; + for (int i=0; i<sourceList.size(); ++i) { + if (sourceList[i].contains(QString("doc/snippets"))) + continue; + if (sources.contains(sourceList[i])) + continue; + sources.insert(sourceList[i],sourceList[i]); + QString t = sourceList[i].mid(sourceList[i].lastIndexOf('/')+1); sourceFileNames.insert(t,t); } - } + /* + Find all the qdoc files in the example dirs, and add + them to the source files to be parsed. + */ + Generator::debug("Reading exampledirs"); + QStringList exampleQdocList = config.getExampleQdocFiles(excludedDirs, excludedFiles); + for (int i=0; i<exampleQdocList.size(); ++i) { + if (!sources.contains(exampleQdocList[i])) { + sources.insert(exampleQdocList[i],exampleQdocList[i]); + QString t = exampleQdocList[i].mid(exampleQdocList[i].lastIndexOf('/')+1); + sourceFileNames.insert(t,t); + } + } - Generator::debug("Adding doc/image dirs found in exampledirs to imagedirs"); - QSet<QString> exampleImageDirs; - QStringList exampleImageList = config.getExampleImageFiles(excludedDirs, excludedFiles); - for (int i=0; i<exampleImageList.size(); ++i) { - if (exampleImageList[i].contains("doc/images")) { - QString t = exampleImageList[i].left(exampleImageList[i].lastIndexOf("doc/images")+10); - if (!exampleImageDirs.contains(t)) { - exampleImageDirs.insert(t); + Generator::debug("Adding doc/image dirs found in exampledirs to imagedirs"); + QSet<QString> exampleImageDirs; + QStringList exampleImageList = config.getExampleImageFiles(excludedDirs, excludedFiles); + for (int i=0; i<exampleImageList.size(); ++i) { + if (exampleImageList[i].contains("doc/images")) { + QString t = exampleImageList[i].left(exampleImageList[i].lastIndexOf("doc/images")+10); + if (!exampleImageDirs.contains(t)) { + exampleImageDirs.insert(t); + } } } - } - Generator::augmentImageDirs(exampleImageDirs); + Generator::augmentImageDirs(exampleImageDirs); + + /* + Parse each header file in the set using the appropriate parser and add it + to the big tree. + */ + QSet<CodeParser *> usedParsers; + + Generator::debug("Parsing header files"); + int parsed = 0; + QMap<QString,QString>::ConstIterator h = headers.constBegin(); + while (h != headers.constEnd()) { + CodeParser *codeParser = CodeParser::parserForHeaderFile(h.key()); + if (codeParser) { + ++parsed; + Generator::debug(QString("Parsing " + h.key())); + codeParser->parseHeaderFile(config.location(), h.key()); + usedParsers.insert(codeParser); + } + ++h; + } - /* - Parse each header file in the set using the appropriate parser and add it - to the big tree. - */ - QSet<CodeParser *> usedParsers; - - Generator::debug("Parsing header files"); - int parsed = 0; - QMap<QString,QString>::ConstIterator h = headers.constBegin(); - while (h != headers.constEnd()) { - CodeParser *codeParser = CodeParser::parserForHeaderFile(h.key()); - if (codeParser) { - ++parsed; - Generator::debug(QString("Parsing " + h.key())); - codeParser->parseHeaderFile(config.location(), h.key()); - usedParsers.insert(codeParser); + foreach (CodeParser *codeParser, usedParsers) + codeParser->doneParsingHeaderFiles(); + + usedParsers.clear(); + qdb->resolveInheritance(); + + /* + Parse each source text file in the set using the appropriate parser and + add it to the big tree. + */ + parsed = 0; + Generator::debug("Parsing source files"); + QMap<QString,QString>::ConstIterator s = sources.constBegin(); + while (s != sources.constEnd()) { + CodeParser *codeParser = CodeParser::parserForSourceFile(s.key()); + if (codeParser) { + ++parsed; + Generator::debug(QString("Parsing " + s.key())); + codeParser->parseSourceFile(config.location(), s.key()); + usedParsers.insert(codeParser); + } + ++s; } - ++h; + Generator::debug(QString("Parsing done.")); + + foreach (CodeParser *codeParser, usedParsers) + codeParser->doneParsingSourceFiles(); + + /* + Now the primary tree has been built from all the header and + source files. Resolve all the class names, function names, + targets, URLs, links, and other stuff that needs resolving. + */ + Generator::debug("Resolving stuff prior to generating docs"); + qdb->resolveIssues(); } + else { + Generator::debug("Reading excludedirs"); + excludedDirsList = config.getCanonicalPathList(CONFIG_EXCLUDEDIRS); + foreach (const QString &excludeDir, excludedDirsList) { + QString p = QDir::fromNativeSeparators(excludeDir); + QDir tmp(p); + if (tmp.exists()) + excludedDirs.insert(p); + } - foreach (CodeParser *codeParser, usedParsers) - codeParser->doneParsingHeaderFiles(); - - usedParsers.clear(); - qdb->resolveInheritance(); + Generator::debug("Reading excludefiles"); + excludedFilesList = config.getCanonicalPathList(CONFIG_EXCLUDEFILES); + foreach (const QString& excludeFile, excludedFilesList) { + QString p = QDir::fromNativeSeparators(excludeFile); + excludedFiles.insert(p); + } - /* - Parse each source text file in the set using the appropriate parser and - add it to the big tree. - */ - parsed = 0; - Generator::debug("Parsing source files"); - QMap<QString,QString>::ConstIterator s = sources.constBegin(); - while (s != sources.constEnd()) { - CodeParser *codeParser = CodeParser::parserForSourceFile(s.key()); - if (codeParser) { - ++parsed; - Generator::debug(QString("Parsing " + s.key())); - codeParser->parseSourceFile(config.location(), s.key()); - usedParsers.insert(codeParser); + Generator::debug("Adding doc/image dirs found in exampledirs to imagedirs"); + QSet<QString> exampleImageDirs; + QStringList exampleImageList = config.getExampleImageFiles(excludedDirs, excludedFiles); + for (int i=0; i<exampleImageList.size(); ++i) { + if (exampleImageList[i].contains("doc/images")) { + QString t = exampleImageList[i].left(exampleImageList[i].lastIndexOf("doc/images")+10); + if (!exampleImageDirs.contains(t)) { + exampleImageDirs.insert(t); + } + } } - ++s; + Generator::augmentImageDirs(exampleImageDirs); + qdb->resolveStuff(); } - Generator::debug(QString("Parsing done.")); - - foreach (CodeParser *codeParser, usedParsers) - codeParser->doneParsingSourceFiles(); /* - Now the big tree has been built from all the header and - source files. Resolve all the class names, function names, - targets, URLs, links, and other stuff that needs resolving. - */ - Generator::debug("Resolving stuff prior to generating docs"); - qdb->resolveIssues(); - - /* - The tree is built and all the stuff that needed resolving - has been resolved. Now traverse the tree and generate the - documentation output. More than one output format can be - requested. The tree is traversed for each one. + The primary tree is built and all the stuff that needed + resolving has been resolved. Now traverse the tree and + generate the documentation output. More than one output + format can be requested. The tree is traversed for each + one. */ Generator::debug("Generating docs"); QSet<QString>::ConstIterator of = outputFormats.constBegin(); while (of != outputFormats.constEnd()) { Generator* generator = Generator::generatorForFormat(*of); if (generator == 0) - outputFormatsLocation.fatal(QCoreApplication::translate("QDoc", "Unknown output format '%1'").arg(*of)); + outputFormatsLocation.fatal(QCoreApplication::translate("QDoc", + "Unknown output format '%1'").arg(*of)); generator->generateDocs(); ++of; } +#if 0 + if (Generator::generating() && Generator::writeQaPages()) + qdb->printLinkCounts(project); +#endif + qdb->clearLinkCounts(); - - //Generator::writeOutFileNames(); - Generator::debug("Shutting down qdoc"); + Generator::debug("Terminating qdoc classes"); if (Generator::debugging()) Generator::stopDebugging(project); @@ -492,17 +561,7 @@ static void processQdocconfFile(const QString &fileName) Location::terminate(); QDir::setCurrent(prevCurrentDir); -#ifndef QT_NO_TRANSLATION - qDeleteAll(translators); -#endif -#ifdef DEBUG_SHUTDOWN_CRASH - qDebug() << "main(): Delete qdoc database"; -#endif - QDocDatabase::destroyQdocDB(); -#ifdef DEBUG_SHUTDOWN_CRASH - qDebug() << "main(): qdoc database deleted"; -#endif - Generator::debug("qdoc finished!"); + Generator::debug("qdoc classes terminated"); } extern Q_CORE_EXPORT QBasicAtomicInt qt_qhash_seed; @@ -621,12 +680,22 @@ int main(int argc, char **argv) logProgressOption.setDescription(QCoreApplication::translate("qdoc", "Log progress on stderr.")); parser.addOption(logProgressOption); + QCommandLineOption singleExecOption(QStringList() << QStringLiteral("single-exec")); + singleExecOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc once over all the qdoc conf files.")); + parser.addOption(singleExecOption); + + QCommandLineOption writeQaPagesOption(QStringList() << QStringLiteral("write-qa-pages")); + writeQaPagesOption.setDescription(QCoreApplication::translate("qdoc", "Write QA pages.")); + parser.addOption(writeQaPagesOption); + parser.process(app); defines += parser.values(defineOption); dependModules += parser.values(dependsOption); highlighting = parser.isSet(highlightingOption); showInternal = parser.isSet(showInternalOption); + singleExec = parser.isSet(singleExecOption); + writeQaPages = parser.isSet(writeQaPagesOption); redirectDocumentationToDevNull = parser.isSet(redirectDocumentationToDevNullOption); Config::generateExamples = !parser.isSet(noExamplesOption); foreach (const QString &indexDir, parser.values(indexDirOption)) { @@ -650,21 +719,73 @@ int main(int argc, char **argv) Generator::setQDocPass(Generator::Prepare); if (parser.isSet(generateOption)) Generator::setQDocPass(Generator::Generate); + if (parser.isSet(singleExecOption)) + Generator::setSingleExec(); + if (parser.isSet(writeQaPagesOption)) + Generator::setWriteQaPages(); if (parser.isSet(logProgressOption)) Location::startLoggingProgress(); - const QStringList qdocFiles = parser.positionalArguments(); + /* + The default indent for code is 4. + The default value for false is 0. + The default supported file extensions are cpp, h, qdoc and qml. + The default language is c++. + The default output format is html. + The default tab size is 8. + And those are all the default values for configuration variables. + */ + if (defaults.isEmpty()) { + defaults.insert(CONFIG_CODEINDENT, QLatin1String("4")); + defaults.insert(CONFIG_FALSEHOODS, QLatin1String("0")); + defaults.insert(CONFIG_FILEEXTENSIONS, QLatin1String("*.cpp *.h *.qdoc *.qml")); + defaults.insert(CONFIG_LANGUAGE, QLatin1String("Cpp")); + defaults.insert(CONFIG_OUTPUTFORMATS, QLatin1String("HTML")); + defaults.insert(CONFIG_TABSIZE, QLatin1String("8")); + } + + QStringList qdocFiles = parser.positionalArguments(); if (qdocFiles.isEmpty()) parser.showHelp(); + if (singleExec) + qdocFiles = Config::loadMaster(qdocFiles.at(0)); + /* - Main loop. + Main loop is now modified to handle single exec mode. */ + if (Generator::singleExec()) + Generator::setQDocPass(Generator::Prepare); foreach (const QString &qf, qdocFiles) { - //qDebug() << "PROCESSING:" << qf; + dependModules.clear(); processQdocconfFile(qf); } + if (Generator::singleExec()) { + Generator::setQDocPass(Generator::Generate); + QDocDatabase* qdb = QDocDatabase::qdocDB(); + qdb->processForest(); + foreach (const QString &qf, qdocFiles) { + dependModules.clear(); + processQdocconfFile(qf); + } + } + +#ifndef QT_NO_TRANSLATION + if (!translators.isEmpty()) { + for (int i=0; i<translators.size(); ++i) { + delete translators.at(i).second; + } + } + translators.clear(); +#endif + +#ifdef DEBUG_SHUTDOWN_CRASH + qDebug() << "main(): Delete qdoc database"; +#endif + QDocDatabase::destroyQdocDB(); +#ifdef DEBUG_SHUTDOWN_CRASH + qDebug() << "main(): qdoc database deleted"; +#endif return EXIT_SUCCESS; } - diff --git a/src/tools/qdoc/node.cpp b/src/tools/qdoc/node.cpp index ce655efef6..f012aae87a 100644 --- a/src/tools/qdoc/node.cpp +++ b/src/tools/qdoc/node.cpp @@ -218,7 +218,7 @@ Node::Node(Type type, InnerNode *parent, const QString& name) { if (parent_) parent_->addChild(this); - outSubDir_ = CodeParser::currentOutputSubdirectory(); + outSubDir_ = Generator::outputSubdir(); if (operators_.isEmpty()) { operators_.insert("++","inc"); operators_.insert("--","dec"); diff --git a/src/tools/qdoc/node.h b/src/tools/qdoc/node.h index e25bbd7a4a..811c9400de 100644 --- a/src/tools/qdoc/node.h +++ b/src/tools/qdoc/node.h @@ -359,7 +359,7 @@ public: //Node* findChildNode(const QString& name, bool qml) const; Node* findChildNode(const QString& name, Type type); //void findNodes(const QString& name, NodeList& n); - virtual void findChildren(const QString& name, NodeList& nodes) const; + virtual void findChildren(const QString& name, NodeList& nodes) const Q_DECL_OVERRIDE; FunctionNode* findFunctionNode(const QString& name) const; FunctionNode* findFunctionNode(const FunctionNode* clone); void addInclude(const QString &include); @@ -370,8 +370,8 @@ public: void deleteChildren(); void removeFromRelated(); - virtual bool isInnerNode() const { return true; } - virtual bool isLeaf() const { return false; } + virtual bool isInnerNode() const Q_DECL_OVERRIDE { return true; } + virtual bool isLeaf() const Q_DECL_OVERRIDE { return false; } const EnumNode* findEnumNodeForValue(const QString &enumValue) const; const NodeList & childNodes() const { return children_; } const NodeList & relatedNodes() const { return related_; } @@ -384,14 +384,14 @@ public: QStringList primaryKeys(); QStringList secondaryKeys(); const QStringList& pageKeywords() const { return pageKeywds; } - virtual void addPageKeywords(const QString& t) { pageKeywds << t; } - virtual void setOutputFileName(const QString& f) { outputFileName_ = f; } - virtual QString outputFileName() const { return outputFileName_; } - virtual QmlPropertyNode* hasQmlProperty(const QString& ) const; - virtual QmlPropertyNode* hasQmlProperty(const QString&, bool attached) const; + virtual void addPageKeywords(const QString& t) Q_DECL_OVERRIDE { pageKeywds << t; } + virtual void setOutputFileName(const QString& f) Q_DECL_OVERRIDE { outputFileName_ = f; } + virtual QString outputFileName() const Q_DECL_OVERRIDE { return outputFileName_; } + virtual QmlPropertyNode* hasQmlProperty(const QString& ) const Q_DECL_OVERRIDE; + virtual QmlPropertyNode* hasQmlProperty(const QString&, bool attached) const Q_DECL_OVERRIDE; void addChild(Node* child, const QString& title); const QStringList& groupNames() const { return groupNames_; } - virtual void appendGroupName(const QString& t) { groupNames_.append(t); } + virtual void appendGroupName(const QString& t) Q_DECL_OVERRIDE { groupNames_.append(t); } void printChildren(const QString& title); protected: @@ -423,8 +423,8 @@ public: LeafNode(); virtual ~LeafNode() { } - virtual bool isInnerNode() const { return false; } - virtual bool isLeaf() const { return true; } + virtual bool isInnerNode() const Q_DECL_OVERRIDE { return false; } + virtual bool isLeaf() const Q_DECL_OVERRIDE { return true; } protected: LeafNode(Type type, InnerNode* parent, const QString& name); @@ -436,10 +436,10 @@ class NamespaceNode : public InnerNode public: NamespaceNode(InnerNode* parent, const QString& name); virtual ~NamespaceNode() { } - virtual bool isNamespace() const { return true; } - virtual Tree* tree() const { return (parent() ? parent()->tree() : tree_); } - virtual bool isCppNode() const { return true; } - virtual Node::Genus genus() const { return Node::CPP; } + virtual bool isNamespace() const Q_DECL_OVERRIDE { return true; } + virtual Tree* tree() const Q_DECL_OVERRIDE { return (parent() ? parent()->tree() : tree_); } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return true; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::CPP; } void setTree(Tree* t) { tree_ = t; } private: @@ -469,13 +469,13 @@ class ClassNode : public InnerNode public: ClassNode(InnerNode* parent, const QString& name); virtual ~ClassNode() { } - virtual bool isClass() const { return true; } - virtual bool isCppNode() const { return true; } - virtual bool isWrapper() const { return wrapper_; } - virtual Node::Genus genus() const { return Node::CPP; } - virtual QString obsoleteLink() const { return obsoleteLink_; } - virtual void setObsoleteLink(const QString& t) { obsoleteLink_ = t; } - virtual void setWrapper() { wrapper_ = true; } + virtual bool isClass() const Q_DECL_OVERRIDE { return true; } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return true; } + virtual bool isWrapper() const Q_DECL_OVERRIDE { return wrapper_; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::CPP; } + virtual QString obsoleteLink() const Q_DECL_OVERRIDE { return obsoleteLink_; } + virtual void setObsoleteLink(const QString& t) Q_DECL_OVERRIDE { obsoleteLink_ = t; } + virtual void setWrapper() Q_DECL_OVERRIDE { wrapper_ = true; } void addResolvedBaseClass(Access access, ClassNode* node); void addDerivedClass(Access access, ClassNode* node); @@ -495,8 +495,8 @@ public: void setServiceName(const QString& value) { sname = value; } QmlClassNode* qmlElement() { return qmlelement; } void setQmlElement(QmlClassNode* qcn) { qmlelement = qcn; } - virtual bool isAbstract() const { return abstract_; } - virtual void setAbstract(bool b) { abstract_ = b; } + virtual bool isAbstract() const Q_DECL_OVERRIDE { return abstract_; } + virtual void setAbstract(bool b) Q_DECL_OVERRIDE { abstract_ = b; } PropertyNode* findPropertyNode(const QString& name); QmlClassNode* findQmlBaseNode(); @@ -521,21 +521,21 @@ public: PageType ptype); virtual ~DocNode() { } - virtual void setTitle(const QString &title); - virtual void setSubTitle(const QString &subTitle) { subtitle_ = subTitle; } + virtual void setTitle(const QString &title) Q_DECL_OVERRIDE; + virtual void setSubTitle(const QString &subTitle) Q_DECL_OVERRIDE { subtitle_ = subTitle; } - SubType subType() const { return nodeSubtype_; } - virtual QString title() const { return title_; } - virtual QString fullTitle() const; - virtual QString subTitle() const; + SubType subType() const Q_DECL_OVERRIDE { return nodeSubtype_; } + virtual QString title() const Q_DECL_OVERRIDE { return title_; } + virtual QString fullTitle() const Q_DECL_OVERRIDE; + virtual QString subTitle() const Q_DECL_OVERRIDE; virtual QString imageFileName() const { return QString(); } - virtual QString nameForLists() const { return title(); } + virtual QString nameForLists() const Q_DECL_OVERRIDE { return title(); } virtual void setImageFileName(const QString& ) { } - virtual bool isHeaderFile() const { return (subType() == Node::HeaderFile); } - virtual bool isExample() const { return (subType() == Node::Example); } - virtual bool isExampleFile() const { return (parent() && parent()->isExample()); } - virtual bool isExternalPage() const { return nodeSubtype_ == ExternalPage; } - virtual bool isDocNode() const { return true; } + virtual bool isHeaderFile() const Q_DECL_OVERRIDE { return (subType() == Node::HeaderFile); } + virtual bool isExample() const Q_DECL_OVERRIDE { return (subType() == Node::Example); } + virtual bool isExampleFile() const Q_DECL_OVERRIDE { return (parent() && parent()->isExample()); } + virtual bool isExternalPage() const Q_DECL_OVERRIDE { return nodeSubtype_ == ExternalPage; } + virtual bool isDocNode() const Q_DECL_OVERRIDE { return true; } protected: SubType nodeSubtype_; @@ -549,8 +549,8 @@ public: ExampleNode(InnerNode* parent, const QString& name) : DocNode(parent, name, Node::Example, Node::ExamplePage) { } virtual ~ExampleNode() { } - virtual QString imageFileName() const { return imageFileName_; } - virtual void setImageFileName(const QString& ifn) { imageFileName_ = ifn; } + virtual QString imageFileName() const Q_DECL_OVERRIDE { return imageFileName_; } + virtual void setImageFileName(const QString& ifn) Q_DECL_OVERRIDE { imageFileName_ = ifn; } private: QString imageFileName_; @@ -581,25 +581,25 @@ class QmlClassNode : public InnerNode public: QmlClassNode(InnerNode* parent, const QString& name); virtual ~QmlClassNode(); - virtual bool isQmlNode() const { return true; } - virtual bool isQmlType() const { return true; } - virtual bool isQtQuickNode() const { return (qmlModuleName() == QLatin1String("QtQuick")); } - virtual ClassNode* classNode() { return cnode_; } - virtual void setClassNode(ClassNode* cn) { cnode_ = cn; } - virtual bool isAbstract() const { return abstract_; } - virtual bool isWrapper() const { return wrapper_; } - virtual void setAbstract(bool b) { abstract_ = b; } - virtual void setWrapper() { wrapper_ = true; } - virtual bool isInternal() const { return (status() == Internal); } - virtual QString qmlFullBaseName() const; - virtual QString obsoleteLink() const { return obsoleteLink_; } - virtual void setObsoleteLink(const QString& t) { obsoleteLink_ = t; }; - virtual QString qmlModuleName() const; - virtual QString qmlModuleVersion() const; - virtual QString qmlModuleIdentifier() const; - virtual QmlModuleNode* qmlModule() const { return qmlModule_; } - virtual void setQmlModule(QmlModuleNode* t) { qmlModule_ = t; } - virtual Node::Genus genus() const { return Node::QML; } + virtual bool isQmlNode() const Q_DECL_OVERRIDE { return true; } + virtual bool isQmlType() const Q_DECL_OVERRIDE { return true; } + virtual bool isQtQuickNode() const Q_DECL_OVERRIDE { return (qmlModuleName() == QLatin1String("QtQuick")); } + virtual ClassNode* classNode() Q_DECL_OVERRIDE { return cnode_; } + virtual void setClassNode(ClassNode* cn) Q_DECL_OVERRIDE { cnode_ = cn; } + virtual bool isAbstract() const Q_DECL_OVERRIDE { return abstract_; } + virtual bool isWrapper() const Q_DECL_OVERRIDE { return wrapper_; } + virtual void setAbstract(bool b) Q_DECL_OVERRIDE { abstract_ = b; } + virtual void setWrapper() Q_DECL_OVERRIDE { wrapper_ = true; } + virtual bool isInternal() const Q_DECL_OVERRIDE { return (status() == Internal); } + virtual QString qmlFullBaseName() const Q_DECL_OVERRIDE; + virtual QString obsoleteLink() const Q_DECL_OVERRIDE { return obsoleteLink_; } + virtual void setObsoleteLink(const QString& t) Q_DECL_OVERRIDE { obsoleteLink_ = t; }; + virtual QString qmlModuleName() const Q_DECL_OVERRIDE; + virtual QString qmlModuleVersion() const Q_DECL_OVERRIDE; + virtual QString qmlModuleIdentifier() const Q_DECL_OVERRIDE; + virtual QmlModuleNode* qmlModule() const Q_DECL_OVERRIDE { return qmlModule_; } + virtual void setQmlModule(QmlModuleNode* t) Q_DECL_OVERRIDE { qmlModule_ = t; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::QML; } const ImportList& importList() const { return importList_; } void setImportList(const ImportList& il) { importList_ = il; } const QString& qmlBaseName() const { return qmlBaseName_; } @@ -635,9 +635,9 @@ public: QmlBasicTypeNode(InnerNode* parent, const QString& name); virtual ~QmlBasicTypeNode() { } - virtual bool isQmlNode() const { return true; } - virtual bool isQmlBasicType() const { return true; } - virtual Node::Genus genus() const { return Node::QML; } + virtual bool isQmlNode() const Q_DECL_OVERRIDE { return true; } + virtual bool isQmlBasicType() const Q_DECL_OVERRIDE { return true; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::QML; } }; class QmlPropertyGroupNode : public InnerNode @@ -645,17 +645,17 @@ class QmlPropertyGroupNode : public InnerNode public: QmlPropertyGroupNode(QmlClassNode* parent, const QString& name); virtual ~QmlPropertyGroupNode() { } - virtual bool isQmlNode() const { return true; } - virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); } - virtual QString qmlTypeName() const { return parent()->qmlTypeName(); } - virtual QString qmlModuleName() const { return parent()->qmlModuleName(); } - virtual QString qmlModuleVersion() const { return parent()->qmlModuleVersion(); } - virtual QString qmlModuleIdentifier() const { return parent()->qmlModuleIdentifier(); } - virtual QString idNumber(); - virtual bool isQmlPropertyGroup() const { return true; } - virtual Node::Genus genus() const { return Node::QML; } - - virtual QString element() const { return parent()->name(); } + virtual bool isQmlNode() const Q_DECL_OVERRIDE { return true; } + virtual bool isQtQuickNode() const Q_DECL_OVERRIDE { return parent()->isQtQuickNode(); } + virtual QString qmlTypeName() const Q_DECL_OVERRIDE { return parent()->qmlTypeName(); } + virtual QString qmlModuleName() const Q_DECL_OVERRIDE { return parent()->qmlModuleName(); } + virtual QString qmlModuleVersion() const Q_DECL_OVERRIDE { return parent()->qmlModuleVersion(); } + virtual QString qmlModuleIdentifier() const Q_DECL_OVERRIDE { return parent()->qmlModuleIdentifier(); } + virtual QString idNumber() Q_DECL_OVERRIDE; + virtual bool isQmlPropertyGroup() const Q_DECL_OVERRIDE { return true; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::QML; } + + virtual QString element() const Q_DECL_OVERRIDE { return parent()->name(); } private: int idNumber_; @@ -672,11 +672,11 @@ public: bool attached); virtual ~QmlPropertyNode() { } - virtual Node::Genus genus() const { return Node::QML; } - virtual void setDataType(const QString& dataType) { type_ = dataType; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::QML; } + virtual void setDataType(const QString& dataType) Q_DECL_OVERRIDE { type_ = dataType; } void setStored(bool stored) { stored_ = toFlagValue(stored); } void setDesignable(bool designable) { designable_ = toFlagValue(designable); } - virtual void setReadOnly(bool ro) { readOnly_ = toFlagValue(ro); } + virtual void setReadOnly(bool ro) Q_DECL_OVERRIDE { readOnly_ = toFlagValue(ro); } void setDefault() { isdefault_ = true; } const QString &dataType() const { return type_; } @@ -685,17 +685,17 @@ public: bool isStored() const { return fromFlagValue(stored_,true); } bool isDesignable() const { return fromFlagValue(designable_,false); } bool isWritable(); - virtual bool isDefault() const { return isdefault_; } - virtual bool isReadOnly() const { return fromFlagValue(readOnly_,false); } - virtual bool isAlias() const { return isAlias_; } - virtual bool isAttached() const { return attached_; } - virtual bool isQmlNode() const { return true; } - virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); } - virtual QString qmlTypeName() const { return parent()->qmlTypeName(); } - virtual QString qmlModuleName() const { return parent()->qmlModuleName(); } - virtual QString qmlModuleVersion() const { return parent()->qmlModuleVersion(); } - virtual QString qmlModuleIdentifier() const { return parent()->qmlModuleIdentifier(); } - virtual QString element() const; + virtual bool isDefault() const Q_DECL_OVERRIDE { return isdefault_; } + virtual bool isReadOnly() const Q_DECL_OVERRIDE { return fromFlagValue(readOnly_,false); } + virtual bool isAlias() const Q_DECL_OVERRIDE { return isAlias_; } + virtual bool isAttached() const Q_DECL_OVERRIDE { return attached_; } + virtual bool isQmlNode() const Q_DECL_OVERRIDE { return true; } + virtual bool isQtQuickNode() const Q_DECL_OVERRIDE { return parent()->isQtQuickNode(); } + virtual QString qmlTypeName() const Q_DECL_OVERRIDE { return parent()->qmlTypeName(); } + virtual QString qmlModuleName() const Q_DECL_OVERRIDE { return parent()->qmlModuleName(); } + virtual QString qmlModuleVersion() const Q_DECL_OVERRIDE { return parent()->qmlModuleVersion(); } + virtual QString qmlModuleIdentifier() const Q_DECL_OVERRIDE { return parent()->qmlModuleIdentifier(); } + virtual QString element() const Q_DECL_OVERRIDE; private: PropertyNode* findCorrespondingCppProperty(); @@ -731,8 +731,8 @@ public: EnumNode(InnerNode* parent, const QString& name); virtual ~EnumNode() { } - virtual Node::Genus genus() const { return Node::CPP; } - virtual bool isCppNode() const { return true; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::CPP; } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return true; } void addItem(const EnumItem& item); void setFlagsType(TypedefNode* typedeff); bool hasItem(const QString &name) const { return names.contains(name); } @@ -754,8 +754,8 @@ public: TypedefNode(InnerNode* parent, const QString& name); virtual ~TypedefNode() { } - virtual Node::Genus genus() const { return Node::CPP; } - virtual bool isCppNode() const { return true; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::CPP; } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return true; } const EnumNode* associatedEnum() const { return ae; } private: @@ -842,8 +842,8 @@ public: bool isConst() const { return con; } bool isStatic() const { return sta; } bool isOverload() const { return ove; } - bool isReimp() const { return reimp; } - bool isFunction() const { return true; } + bool isReimp() const Q_DECL_OVERRIDE { return reimp; } + bool isFunction() const Q_DECL_OVERRIDE { return true; } int overloadNumber() const; const QList<Parameter>& parameters() const { return params; } QStringList parameterNames() const; @@ -855,20 +855,20 @@ public: QStringList reconstructParams(bool values = false) const; QString signature(bool values = false) const; - virtual QString element() const { return parent()->name(); } - virtual bool isAttached() const { return attached_; } - virtual bool isQmlNode() const { + virtual QString element() const Q_DECL_OVERRIDE { return parent()->name(); } + virtual bool isAttached() const Q_DECL_OVERRIDE { return attached_; } + virtual bool isQmlNode() const Q_DECL_OVERRIDE { return ((type() == QmlSignal) || (type() == QmlMethod) || (type() == QmlSignalHandler)); } - virtual bool isCppNode() const { return !isQmlNode(); } - virtual Node::Genus genus() const { return (isQmlNode() ? Node::QML : Node::CPP); } - virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); } - virtual QString qmlTypeName() const { return parent()->qmlTypeName(); } - virtual QString qmlModuleName() const { return parent()->qmlModuleName(); } - virtual QString qmlModuleVersion() const { return parent()->qmlModuleVersion(); } - virtual QString qmlModuleIdentifier() const { return parent()->qmlModuleIdentifier(); } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return !isQmlNode(); } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return (isQmlNode() ? Node::QML : Node::CPP); } + virtual bool isQtQuickNode() const Q_DECL_OVERRIDE { return parent()->isQtQuickNode(); } + virtual QString qmlTypeName() const Q_DECL_OVERRIDE { return parent()->qmlTypeName(); } + virtual QString qmlModuleName() const Q_DECL_OVERRIDE { return parent()->qmlModuleName(); } + virtual QString qmlModuleVersion() const Q_DECL_OVERRIDE { return parent()->qmlModuleVersion(); } + virtual QString qmlModuleIdentifier() const Q_DECL_OVERRIDE { return parent()->qmlModuleIdentifier(); } void debug() const; @@ -902,9 +902,9 @@ public: PropertyNode(InnerNode* parent, const QString& name); virtual ~PropertyNode() { } - virtual Node::Genus genus() const { return Node::CPP; } - virtual bool isCppNode() const { return true; } - virtual void setDataType(const QString& dataType) { type_ = dataType; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::CPP; } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return true; } + virtual void setDataType(const QString& dataType) Q_DECL_OVERRIDE { type_ = dataType; } void addFunction(FunctionNode* function, FunctionRole role); void addSignal(FunctionNode* function, FunctionRole role); void setStored(bool stored) { stored_ = toFlagValue(stored); } @@ -991,8 +991,8 @@ public: VariableNode(InnerNode* parent, const QString &name); virtual ~VariableNode() { } - virtual Node::Genus genus() const { return Node::CPP; } - virtual bool isCppNode() const { return true; } + virtual Node::Genus genus() const Q_DECL_OVERRIDE { return Node::CPP; } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return true; } void setLeftType(const QString &leftType) { lt = leftType; } void setRightType(const QString &rightType) { rt = rightType; } void setStatic(bool statique) { sta = statique; } @@ -1033,20 +1033,20 @@ class CollectionNode : public InnerNode } virtual ~CollectionNode() { } - virtual bool isCollectionNode() const { return true; } - virtual void addMember(Node* node); - virtual bool hasMembers() const; - virtual bool hasNamespaces() const; - virtual bool hasClasses() const; - virtual void getMemberNamespaces(NodeMap& out); - virtual void getMemberClasses(NodeMap& out); - virtual bool wasSeen() const { return seen_; } - virtual QString title() const { return title_; } - virtual QString subTitle() const { return subtitle_; } - virtual QString fullTitle() const { return title_; } - virtual QString nameForLists() const { return title_; } - virtual void setTitle(const QString &title); - virtual void setSubTitle(const QString &subTitle) { subtitle_ = subTitle; } + virtual bool isCollectionNode() const Q_DECL_OVERRIDE { return true; } + virtual void addMember(Node* node) Q_DECL_OVERRIDE; + virtual bool hasMembers() const Q_DECL_OVERRIDE; + virtual bool hasNamespaces() const Q_DECL_OVERRIDE; + virtual bool hasClasses() const Q_DECL_OVERRIDE; + virtual void getMemberNamespaces(NodeMap& out) Q_DECL_OVERRIDE; + virtual void getMemberClasses(NodeMap& out) Q_DECL_OVERRIDE; + virtual bool wasSeen() const Q_DECL_OVERRIDE { return seen_; } + virtual QString title() const Q_DECL_OVERRIDE { return title_; } + virtual QString subTitle() const Q_DECL_OVERRIDE { return subtitle_; } + virtual QString fullTitle() const Q_DECL_OVERRIDE { return title_; } + virtual QString nameForLists() const Q_DECL_OVERRIDE { return title_; } + virtual void setTitle(const QString &title) Q_DECL_OVERRIDE; + virtual void setSubTitle(const QString &subTitle) Q_DECL_OVERRIDE { subtitle_ = subTitle; } const NodeList& members() const { return members_; } void printMembers(const QString& title); @@ -1068,7 +1068,7 @@ class GroupNode : public CollectionNode : CollectionNode(Node::Group, parent, name) { } virtual ~GroupNode() { } - virtual bool isGroup() const { return true; } + virtual bool isGroup() const Q_DECL_OVERRIDE { return true; } }; class ModuleNode : public CollectionNode @@ -1078,10 +1078,10 @@ class ModuleNode : public CollectionNode : CollectionNode(Node::Module, parent, name) { } virtual ~ModuleNode() { } - virtual bool isModule() const { return true; } - virtual bool isCppNode() const { return true; } - virtual void setQtVariable(const QString& v) { qtVariable_ = v; } - virtual QString qtVariable() const { return qtVariable_; } + virtual bool isModule() const Q_DECL_OVERRIDE { return true; } + virtual bool isCppNode() const Q_DECL_OVERRIDE { return true; } + virtual void setQtVariable(const QString& v) Q_DECL_OVERRIDE { qtVariable_ = v; } + virtual QString qtVariable() const Q_DECL_OVERRIDE { return qtVariable_; } private: QString qtVariable_; @@ -1094,18 +1094,18 @@ class QmlModuleNode : public CollectionNode : CollectionNode(Node::QmlModule, parent, name) { } virtual ~QmlModuleNode() { } - virtual bool isQmlNode() const { return true; } - virtual bool isQmlModule() const { return true; } - virtual QString qmlModuleName() const { return qmlModuleName_; } - virtual QString qmlModuleVersion() const { + virtual bool isQmlNode() const Q_DECL_OVERRIDE { return true; } + virtual bool isQmlModule() const Q_DECL_OVERRIDE { return true; } + virtual QString qmlModuleName() const Q_DECL_OVERRIDE { return qmlModuleName_; } + virtual QString qmlModuleVersion() const Q_DECL_OVERRIDE { return qmlModuleVersionMajor_ + "." + qmlModuleVersionMinor_; } - virtual QString qmlModuleIdentifier() const { + virtual QString qmlModuleIdentifier() const Q_DECL_OVERRIDE { return qmlModuleName_ + qmlModuleVersionMajor_; } - virtual void setQmlModuleInfo(const QString& ); - virtual void setQtVariable(const QString& v) { qtVariable_ = v; } - virtual QString qtVariable() const { return qtVariable_; } + virtual void setQmlModuleInfo(const QString& ) Q_DECL_OVERRIDE; + virtual void setQtVariable(const QString& v) Q_DECL_OVERRIDE { qtVariable_ = v; } + virtual QString qtVariable() const Q_DECL_OVERRIDE { return qtVariable_; } private: QString qmlModuleName_; diff --git a/src/tools/qdoc/plaincodemarker.h b/src/tools/qdoc/plaincodemarker.h index df6beebd03..2fb97c443d 100644 --- a/src/tools/qdoc/plaincodemarker.h +++ b/src/tools/qdoc/plaincodemarker.h @@ -48,20 +48,20 @@ public: PlainCodeMarker(); ~PlainCodeMarker(); - bool recognizeCode( const QString& code ); - bool recognizeExtension( const QString& ext ); - bool recognizeLanguage( const QString& lang ); - Atom::Type atomType() const; - QString markedUpCode( const QString& code, const Node *relative, const Location &location ); + bool recognizeCode( const QString& code ) Q_DECL_OVERRIDE; + bool recognizeExtension( const QString& ext ) Q_DECL_OVERRIDE; + bool recognizeLanguage( const QString& lang ) Q_DECL_OVERRIDE; + Atom::Type atomType() const Q_DECL_OVERRIDE; + QString markedUpCode( const QString& code, const Node *relative, const Location &location ) Q_DECL_OVERRIDE; QString markedUpSynopsis( const Node *node, const Node *relative, - SynopsisStyle style ); - QString markedUpName( const Node *node ); - QString markedUpFullName( const Node *node, const Node *relative ); - QString markedUpEnumValue(const QString &enumValue, const Node *relative); - QString markedUpIncludes( const QStringList& includes ); - QString functionBeginRegExp( const QString& funcName ); - QString functionEndRegExp( const QString& funcName ); - QList<Section> sections(const InnerNode *innerNode, SynopsisStyle style, Status status); + SynopsisStyle style ) Q_DECL_OVERRIDE; + QString markedUpName( const Node *node ) Q_DECL_OVERRIDE; + QString markedUpFullName( const Node *node, const Node *relative ) Q_DECL_OVERRIDE; + QString markedUpEnumValue(const QString &enumValue, const Node *relative) Q_DECL_OVERRIDE; + QString markedUpIncludes( const QStringList& includes ) Q_DECL_OVERRIDE; + QString functionBeginRegExp( const QString& funcName ) Q_DECL_OVERRIDE; + QString functionEndRegExp( const QString& funcName ) Q_DECL_OVERRIDE; + QList<Section> sections(const InnerNode *innerNode, SynopsisStyle style, Status status) Q_DECL_OVERRIDE; }; QT_END_NAMESPACE diff --git a/src/tools/qdoc/puredocparser.h b/src/tools/qdoc/puredocparser.h index e6a4eca9d8..4100b50e2d 100644 --- a/src/tools/qdoc/puredocparser.h +++ b/src/tools/qdoc/puredocparser.h @@ -57,8 +57,8 @@ public: PureDocParser(); virtual ~PureDocParser(); - virtual QStringList sourceFileNameFilter(); - virtual void parseSourceFile(const Location& location, const QString& filePath); + virtual QStringList sourceFileNameFilter() Q_DECL_OVERRIDE; + virtual void parseSourceFile(const Location& location, const QString& filePath) Q_DECL_OVERRIDE; private: bool processQdocComments(); diff --git a/src/tools/qdoc/qdocdatabase.cpp b/src/tools/qdoc/qdocdatabase.cpp index 36dd05bb92..51908bc9e3 100644 --- a/src/tools/qdoc/qdocdatabase.cpp +++ b/src/tools/qdoc/qdocdatabase.cpp @@ -128,142 +128,54 @@ Tree* QDocForest::nextTree() */ /*! + Finds the tree for module \a t in the forest and + sets the primary tree to be that tree. After the + primary tree is set, that tree is removed from the + forest. + + \node It gets re-inserted into the forest after the + search order is built. + */ +void QDocForest::setPrimaryTree(const QString& t) +{ + primaryTree_ = findTree(t); + forest_.remove(t); + if (!primaryTree_) + qDebug() << "ERROR: Could not set primary tree to:" << t; +} + +/*! If the search order array is empty, create the search order. If the search order array is not empty, do nothing. */ -void QDocForest::setSearchOrder() +void QDocForest::setSearchOrder(QStringList& t) { if (!searchOrder_.isEmpty()) return; - QString primaryName = primaryTree()->moduleName(); - searchOrder_.clear(); + + /* Allocate space for the search order. */ searchOrder_.reserve(forest_.size()+1); + searchOrder_.clear(); moduleNames_.reserve(forest_.size()+1); + moduleNames_.clear(); + + /* The primary tree is always first in the search order. */ + QString primaryName = primaryTree()->moduleName(); searchOrder_.append(primaryTree_); moduleNames_.append(primaryName); + forest_.remove(primaryName); + QMap<QString, Tree*>::iterator i; - if (primaryName != "QtCore") { - i = forest_.find("QtCore"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtCore"); - forest_.erase(i); - } - } - if (primaryName != "QtGui") { - i = forest_.find("QtGui"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtGui"); - forest_.erase(i); - } - } - if (primaryName != "QtNetwork") { - i = forest_.find("QtNetwork"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtNetwork"); - forest_.erase(i); - } - } - if (primaryName != "QtOpenGL") { - i = forest_.find("QtOpenGL"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtOpenGL"); - forest_.erase(i); - } - } - if (primaryName != "QtWidgets") { - i = forest_.find("QtWidgets"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtWidgets"); - forest_.erase(i); - } - } - if (primaryName != "QtSql") { - i = forest_.find("QtSql"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtSql"); - forest_.erase(i); - } - } - if (primaryName != "QtXml") { - i = forest_.find("QtXml"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtXml"); - forest_.erase(i); - } - } - if (primaryName != "QtSvg") { - i = forest_.find("QtSvg"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtSvg"); - forest_.erase(i); - } - } - if (primaryName != "QtDoc") { - i = forest_.find("QtDoc"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtDoc"); - forest_.erase(i); - } - } - if (primaryName != "QtQuick") { - i = forest_.find("QtQuick"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtQuick"); - forest_.erase(i); - } - } - if (primaryName != "QtQml") { - i = forest_.find("QtQml"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtQml"); - forest_.erase(i); - } - } - if (primaryName != "QtPrintSupport") { - i = forest_.find("QtPrintSupport"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtPrintSupport"); - forest_.erase(i); - } - } - if (primaryName != "QtGraphicalEffects") { - i = forest_.find("QtGraphicalEffects"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtGraphicalEffects"); - forest_.erase(i); - } - } - if (primaryName != "QtConcurrent") { - i = forest_.find("QtConcurrent"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("QtConcurrent"); - forest_.erase(i); - } - } -#if 0 - if (primaryName != "zzz") { - i = forest_.find("zzz"); - if (i != forest_.end()) { - searchOrder_.append(i.value()); - moduleNames_.append("zzz"); - forest_.erase(i); + foreach (QString m, t) { + if (primaryName != m) { + i = forest_.find(m); + if (i != forest_.end()) { + searchOrder_.append(i.value()); + moduleNames_.append(m); + forest_.remove(m); + } } } -#endif /* If any trees remain in the forest, just add them to the search order sequentially, because we don't @@ -283,15 +195,21 @@ void QDocForest::setSearchOrder() Rebuild the forest after constructing the search order. It was destroyed during construction of the search order, but it is needed for module-specific searches. + + Note that this loop also inserts the primary tree into the + forrest. That is a requirement. */ for (int i=0; i<searchOrder_.size(); ++i) { - forest_.insert(moduleNames_.at(i).toLower(), searchOrder_.at(i)); + if (!forest_.contains(moduleNames_.at(i))) { + forest_.insert(moduleNames_.at(i), searchOrder_.at(i)); + } } - #if 0 - qDebug() << " SEARCH ORDER:"; + qDebug() << " SEARCH ORDER:"; for (int i=0; i<moduleNames_.size(); ++i) - qDebug() << " " << i+1 << "." << moduleNames_.at(i); + qDebug() << " " << i+1 << "." << moduleNames_.at(i); + qDebug() << " FOREST:" << forest_.keys(); + qDebug() << "SEARCH ORDER:" << moduleNames_; #endif } @@ -363,7 +281,7 @@ NamespaceNode* QDocForest::newIndexTree(const QString& module) /*! Create a new Tree for use as the primary tree. This tree - will represent the primary module. + will represent the primary module. \a module is camel case. */ void QDocForest::newPrimaryTree(const QString& module) { @@ -431,6 +349,61 @@ void QDocForest::mergeCollectionMaps(Node::Type nt, CNMultiMap& cnmm) } } +/*! + Print the list of module names ordered according + to how many successful searches each tree had. + */ +void QDocForest::printLinkCounts(const QString& project) +{ + Location::null.report(QString("%1: Link Counts").arg(project)); + QMultiMap<int, QString> m; + foreach (Tree* t, searchOrder()) { + if (t->linkCount() < 0) + m.insert(t->linkCount(), t->moduleName()); + } + QString depends = "depends +="; + QString module = project.toLower(); + QMultiMap<int, QString>::iterator i = m.begin(); + while (i != m.end()) { + QString line = " " + i.value(); + if (i.value() != module) + depends += " " + i.value(); + int pad = 30 - line.length(); + for (int k=0; k<pad; ++k) + line += " "; + line += "%1"; + Location::null.report(line.arg(-(i.key()))); + ++i; + } + Location::null.report("Optimal depends variable:"); + Location::null.report(depends); +} + +/*! + Print the list of module names ordered according + to how many successful searches each tree had. + */ +QString QDocForest::getLinkCounts(QStringList& strings, QVector<int>& counts) +{ + QMultiMap<int, QString> m; + foreach (Tree* t, searchOrder()) { + if (t->linkCount() < 0) + m.insert(t->linkCount(), t->moduleName()); + } + QString depends = "depends +="; + QString module = Generator::defaultModuleName().toLower(); + QMultiMap<int, QString>::iterator i = m.begin(); + while (i != m.end()) { + if (i.value() != module) { + counts.append(-(i.key())); + strings.append(i.value()); + depends += " " + i.value(); + } + ++i; + } + return depends; +} + /*! \class QDocDatabase This class provides exclusive access to the qdoc database, which consists of a forrest of trees and a lot of maps and @@ -445,8 +418,19 @@ NodeMap QDocDatabase::typeNodeMap_; constructs the \a forest_ object, which is also a singleton. \a showInternal_ is normally false. If it is true, qdoc will write documentation for nodes marked \c internal. + + \a singleExec_ is false when qdoc is being used in the standard + way of running qdoc twices for each module, first with -prepare + and then with -generate. First the -prepare phase is run for + each module, then the -generate phase is run for each module. + + When \a singleExec_ is true, qdoc is run only once. During the + single execution, qdoc processes the qdocconf files for all the + modules sequentially in a loop. Each source file for each module + is read exactly once. */ -QDocDatabase::QDocDatabase() : showInternal_(false), forest_(this) +QDocDatabase::QDocDatabase() + : showInternal_(false), singleExec_(false), forest_(this) { // nothing } @@ -809,13 +793,41 @@ QmlClassNode* QDocDatabase::findQmlType(const ImportRec& import, const QString& } /*! - This function calls \a func for each tree in the forest. + This function calls a set of functions for each tree in the + forest that has not already been analyzed. In this way, when + running qdoc in \e singleExec mode, each tree is analyzed in + turn, and its classes and types are added to the appropriate + node maps. + */ +void QDocDatabase::processForest() +{ + Tree* t = forest_.firstTree(); + while (t) { + findAllNamespaces(t->root()); + findAllClasses(t->root()); + findAllFunctions(t->root()); + findAllObsoleteThings(t->root()); + findAllLegaleseTexts(t->root()); + findAllSince(t->root()); + t->setTreeHasBeenAnalyzed(); + t = forest_.nextTree(); + } +} + +/*! + This function calls \a func for each tree in the forest, + but only if Tree::treeHasBeenAnalyzed() returns false for + the tree. In this way, when running qdoc in \e singleExec + mode, each tree is analyzed in turn, and its classes and + types are added to the appropriate node maps. */ void QDocDatabase::processForest(void (QDocDatabase::*func) (InnerNode*)) { Tree* t = forest_.firstTree(); while (t) { - (this->*(func))(t->root()); + if (!t->treeHasBeenAnalyzed()) { + (this->*(func))(t->root()); + } t = forest_.nextTree(); } } @@ -887,7 +899,7 @@ NodeMap& QDocDatabase::getNamespaces() */ NodeMap& QDocDatabase::getServiceClasses() { - if (nonCompatClasses_.isEmpty() && qmlClasses_.isEmpty()) + if (cppClasses_.isEmpty() && qmlTypes_.isEmpty()) processForest(&QDocDatabase::findAllClasses); return serviceClasses_; } @@ -899,7 +911,7 @@ NodeMap& QDocDatabase::getServiceClasses() */ NodeMap& QDocDatabase::getQmlBasicTypes() { - if (nonCompatClasses_.isEmpty() && qmlBasicTypes_.isEmpty()) + if (cppClasses_.isEmpty() && qmlBasicTypes_.isEmpty()) processForest(&QDocDatabase::findAllClasses); return qmlBasicTypes_; } @@ -911,9 +923,9 @@ NodeMap& QDocDatabase::getQmlBasicTypes() */ NodeMap& QDocDatabase::getQmlTypes() { - if (nonCompatClasses_.isEmpty() && qmlClasses_.isEmpty()) + if (cppClasses_.isEmpty() && qmlTypes_.isEmpty()) processForest(&QDocDatabase::findAllClasses); - return qmlClasses_; + return qmlTypes_; } /*! @@ -935,7 +947,7 @@ NodeMap& QDocDatabase::getObsoleteClasses() */ NodeMap& QDocDatabase::getCompatibilityClasses() { - if (nonCompatClasses_.isEmpty() && qmlClasses_.isEmpty()) + if (cppClasses_.isEmpty() && qmlTypes_.isEmpty()) processForest(&QDocDatabase::findAllClasses); return compatClasses_; } @@ -950,7 +962,7 @@ NodeMap& QDocDatabase::getCompatibilityClasses() */ NodeMap& QDocDatabase::getMainClasses() { - if (nonCompatClasses_.isEmpty() && qmlClasses_.isEmpty()) + if (cppClasses_.isEmpty() && qmlTypes_.isEmpty()) processForest(&QDocDatabase::findAllClasses); return mainClasses_; } @@ -962,9 +974,9 @@ NodeMap& QDocDatabase::getMainClasses() */ NodeMap& QDocDatabase::getCppClasses() { - if (nonCompatClasses_.isEmpty() && qmlClasses_.isEmpty()) + if (cppClasses_.isEmpty() && qmlTypes_.isEmpty()) processForest(&QDocDatabase::findAllClasses); - return nonCompatClasses_; + return cppClasses_; } /*! @@ -987,7 +999,7 @@ void QDocDatabase::findAllClasses(InnerNode* node) compatClasses_.insert(className, *c); } else { - nonCompatClasses_.insert(className, *c); + cppClasses_.insert(className, *c); if ((*c)->status() == Node::Main) mainClasses_.insert(className, *c); } @@ -1000,9 +1012,9 @@ void QDocDatabase::findAllClasses(InnerNode* node) else if (((*c)->isQmlType() || (*c)->isQmlBasicType())&& !(*c)->doc().isEmpty()) { QString qmlTypeName = (*c)->name(); if (qmlTypeName.startsWith(QLatin1String("QML:"))) - qmlClasses_.insert(qmlTypeName.mid(4),*c); + qmlTypes_.insert(qmlTypeName.mid(4),*c); else - qmlClasses_.insert(qmlTypeName,*c); + qmlTypes_.insert(qmlTypeName,*c); //also add to the QML basic type map if ((*c)->isQmlBasicType()) @@ -1022,7 +1034,6 @@ void QDocDatabase::findAllClasses(InnerNode* node) */ NodeMapMap& QDocDatabase::getFunctionIndex() { - funcIndex_.clear(); processForest(&QDocDatabase::findAllFunctions); return funcIndex_; } @@ -1314,7 +1325,15 @@ const NodeMultiMap& QDocDatabase::getSinceMap(const QString& key) */ void QDocDatabase::resolveIssues() { resolveQmlInheritance(primaryTreeRoot()); - resolveTargets(); + primaryTree()->resolveTargets(primaryTreeRoot()); + primaryTree()->resolveCppToQmlLinks(); +} + +void QDocDatabase::resolveStuff() +{ + primaryTree()->resolveInheritance(); + resolveQmlInheritance(primaryTreeRoot()); + //primaryTree()->resolveTargets(primaryTreeRoot()); primaryTree()->resolveCppToQmlLinks(); } @@ -1424,10 +1443,18 @@ void QDocDatabase::generateTagFile(const QString& name, Generator* g) } /*! - Reads and parses the qdoc index files listed in \a indexFiles. + Reads and parses the qdoc index files listed in \a t. */ -void QDocDatabase::readIndexes(const QStringList& indexFiles) +void QDocDatabase::readIndexes(const QStringList& t) { + QStringList indexFiles; + foreach (const QString& f, t) { + QString fn = f.mid(f.lastIndexOf(QChar('/'))+1); + if (!isLoaded(fn)) + indexFiles << f; + else + qDebug() << "This index file is already in memory:" << f; + } QDocIndexFiles::qdocIndexFiles()->readIndexes(indexFiles); QDocIndexFiles::destroyQDocIndexFiles(); } @@ -1443,6 +1470,8 @@ void QDocDatabase::generateIndex(const QString& fileName, Generator* g, bool generateInternalNodes) { + QString t = fileName.mid(fileName.lastIndexOf(QChar('/'))+1); + primaryTree()->setIndexFileName(t); QDocIndexFiles::qdocIndexFiles()->generateIndex(fileName, url, title, g, generateInternalNodes); QDocIndexFiles::destroyQDocIndexFiles(); } diff --git a/src/tools/qdoc/qdocdatabase.h b/src/tools/qdoc/qdocdatabase.h index 8b67aca971..9b4d7019ad 100644 --- a/src/tools/qdoc/qdocdatabase.h +++ b/src/tools/qdoc/qdocdatabase.h @@ -78,7 +78,14 @@ class QDocForest bool done() { return (currentIndex_ >= searchOrder().size()); } const QVector<Tree*>& searchOrder(); const QVector<Tree*>& indexSearchOrder(); - void setSearchOrder(); + void setSearchOrder(QStringList& t); + bool isLoaded(const QString& fn) { + foreach (Tree* t, searchOrder()) { + if (fn == t->indexFileName()) + return true; + } + return false; + } const Node* findNode(const QStringList& path, const Node* relative, @@ -186,8 +193,18 @@ class QDocForest } } + void clearSearchOrder() { searchOrder_.clear(); } + void clearLinkCounts() + { + foreach (Tree* t, searchOrder()) + t->clearLinkCount(); + } + void printLinkCounts(const QString& project); + QString getLinkCounts(QStringList& strings, QVector<int>& counts); + private: void newPrimaryTree(const QString& module); + void setPrimaryTree(const QString& t); NamespaceNode* newIndexTree(const QString& module); private: @@ -274,12 +291,10 @@ class QDocDatabase void resolveInheritance() { primaryTree()->resolveInheritance(); } void resolveQmlInheritance(InnerNode* root); void resolveIssues(); + void resolveStuff(); void fixInheritance() { primaryTree()->fixInheritance(); } void resolveProperties() { primaryTree()->resolveProperties(); } - void resolveTargets() { - primaryTree()->resolveTargets(primaryTreeRoot()); - } void insertTarget(const QString& name, const QString& title, TargetRec::Type type, @@ -355,18 +370,37 @@ class QDocDatabase void clearOpenNamespaces() { openNamespaces_.clear(); } void insertOpenNamespace(const QString& path) { openNamespaces_.insert(path); } void setShowInternal(bool value) { showInternal_ = value; } + void setSingleExec(bool value) { singleExec_ = value; } + void processForest(); // Try to make this function private. QDocForest& forest() { return forest_; } NamespaceNode* primaryTreeRoot() { return forest_.primaryTreeRoot(); } void newPrimaryTree(const QString& module) { forest_.newPrimaryTree(module); } + void setPrimaryTree(const QString& t) { forest_.setPrimaryTree(t); } NamespaceNode* newIndexTree(const QString& module) { return forest_.newIndexTree(module); } const QVector<Tree*>& searchOrder() { return forest_.searchOrder(); } void setLocalSearch() { forest_.searchOrder_ = QVector<Tree*>(1, primaryTree()); } void setSearchOrder(const QVector<Tree*>& searchOrder) { forest_.searchOrder_ = searchOrder; } - void setSearchOrder() { forest_.setSearchOrder(); } + void setSearchOrder(QStringList& t) { forest_.setSearchOrder(t); } void mergeCollections(Node::Type nt, CNMap& cnm, const Node* relative); void mergeCollections(CollectionNode* cn); + void clearSearchOrder() { forest_.clearSearchOrder(); } + void incrementLinkCount(const Node* t) { t->tree()->incrementLinkCount(); } + void clearLinkCounts() { forest_.clearLinkCounts(); } + void printLinkCounts(const QString& t) { forest_.printLinkCounts(t); } + QString getLinkCounts(QStringList& strings, QVector<int>& counts) { + return forest_.getLinkCounts(strings, counts); + } + QString getNewLinkTarget(const Node* locNode, + const Node* t, + const QString& fileName, + QString& text, + bool broken = false) { + return primaryTree()->getNewLinkTarget(locNode, t, fileName, text, broken); + } + TargetList* getTargetList(const QString& t) { return primaryTree()->getTargetList(t); } + QStringList getTargetListKeys() { return primaryTree()->getTargetListKeys(); } private: friend class QDocIndexFiles; @@ -379,6 +413,7 @@ class QDocDatabase return forest_.findNode(path, relative, findFlags, genus); } void processForest(void (QDocDatabase::*) (InnerNode*)); + bool isLoaded(const QString& t) { return forest_.isLoaded(t); } static void initializeDB(); private: @@ -394,20 +429,21 @@ class QDocDatabase static QDocDatabase* qdocDB_; static NodeMap typeNodeMap_; bool showInternal_; + bool singleExec_; QString version_; QDocForest forest_; - NodeMap nonCompatClasses_; - NodeMap mainClasses_; + NodeMap cppClasses_; + NodeMap mainClasses_; // MWS: not needed, should be delete NodeMap compatClasses_; NodeMap obsoleteClasses_; NodeMap classesWithObsoleteMembers_; NodeMap obsoleteQmlTypes_; NodeMap qmlTypesWithObsoleteMembers_; NodeMap namespaceIndex_; - NodeMap serviceClasses_; + NodeMap serviceClasses_; // MWS: not needed, should be deleted NodeMap qmlBasicTypes_; - NodeMap qmlClasses_; + NodeMap qmlTypes_; NodeMapMap newClassMaps_; NodeMapMap newQmlTypeMaps_; NodeMultiMapMap newSinceMaps_; diff --git a/src/tools/qdoc/qdocindexfiles.cpp b/src/tools/qdoc/qdocindexfiles.cpp index 00041b2b65..e152b04ead 100644 --- a/src/tools/qdoc/qdocindexfiles.cpp +++ b/src/tools/qdoc/qdocindexfiles.cpp @@ -564,7 +564,6 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, node->setReconstitutedBrief(briefAttr); } - // zzz bool useParent = (element.nodeName() == "namespace" && name.isEmpty()); if (element.hasChildNodes()) { QDomElement child = element.firstChildElement(); @@ -806,11 +805,14 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, QString fullName = node->fullDocumentName(); if (fullName != objName) writer.writeAttribute("fullname", fullName); +#if 0 if (Generator::useOutputSubdirs()) href = node->outputSubdirectory(); if (!href.isEmpty()) href.append(QLatin1Char('/')); href.append(gen_->fullDocumentLocation(node)); +#endif + href = gen_->fullDocumentLocation(node); } else href = node->name(); diff --git a/src/tools/qdoc/qmlcodemarker.h b/src/tools/qdoc/qmlcodemarker.h index c6e4aa7e19..e9a54710df 100644 --- a/src/tools/qdoc/qmlcodemarker.h +++ b/src/tools/qdoc/qmlcodemarker.h @@ -51,19 +51,19 @@ public: QmlCodeMarker(); ~QmlCodeMarker(); - virtual bool recognizeCode(const QString &code); - virtual bool recognizeExtension(const QString &ext); - virtual bool recognizeLanguage(const QString &language); - virtual Atom::Type atomType() const; + virtual bool recognizeCode(const QString &code) Q_DECL_OVERRIDE; + virtual bool recognizeExtension(const QString &ext) Q_DECL_OVERRIDE; + virtual bool recognizeLanguage(const QString &language) Q_DECL_OVERRIDE; + virtual Atom::Type atomType() const Q_DECL_OVERRIDE; virtual QString markedUpCode(const QString &code, const Node *relative, - const Location &location); + const Location &location) Q_DECL_OVERRIDE; - virtual QString markedUpName(const Node *node); - virtual QString markedUpFullName(const Node *node, const Node *relative); - virtual QString markedUpIncludes(const QStringList &includes); - virtual QString functionBeginRegExp(const QString &funcName); - virtual QString functionEndRegExp(const QString &funcName); + virtual QString markedUpName(const Node *node) Q_DECL_OVERRIDE; + virtual QString markedUpFullName(const Node *node, const Node *relative) Q_DECL_OVERRIDE; + virtual QString markedUpIncludes(const QStringList &includes) Q_DECL_OVERRIDE; + virtual QString functionBeginRegExp(const QString &funcName) Q_DECL_OVERRIDE; + virtual QString functionEndRegExp(const QString &funcName) Q_DECL_OVERRIDE; /* Copied from src/declarative/qml/qdeclarativescriptparser.cpp */ QList<QQmlJS::AST::SourceLocation> extractPragmas(QString &script); diff --git a/src/tools/qdoc/qmlcodeparser.h b/src/tools/qdoc/qmlcodeparser.h index cf60b1d7d7..715b4278b9 100644 --- a/src/tools/qdoc/qmlcodeparser.h +++ b/src/tools/qdoc/qmlcodeparser.h @@ -59,12 +59,12 @@ public: QmlCodeParser(); virtual ~QmlCodeParser(); - virtual void initializeParser(const Config& config); - virtual void terminateParser(); - virtual QString language(); - virtual QStringList sourceFileNameFilter(); - virtual void parseSourceFile(const Location& location, const QString& filePath); - virtual void doneParsingSourceFiles(); + virtual void initializeParser(const Config& config) Q_DECL_OVERRIDE; + virtual void terminateParser() Q_DECL_OVERRIDE; + virtual QString language() Q_DECL_OVERRIDE; + virtual QStringList sourceFileNameFilter() Q_DECL_OVERRIDE; + virtual void parseSourceFile(const Location& location, const QString& filePath) Q_DECL_OVERRIDE; + virtual void doneParsingSourceFiles() Q_DECL_OVERRIDE; /* Copied from src/declarative/qml/qdeclarativescriptparser.cpp */ void extractPragmas(QString &script); diff --git a/src/tools/qdoc/qmlmarkupvisitor.h b/src/tools/qdoc/qmlmarkupvisitor.h index 09aa1f7400..4debce9129 100644 --- a/src/tools/qdoc/qmlmarkupvisitor.h +++ b/src/tools/qdoc/qmlmarkupvisitor.h @@ -56,92 +56,92 @@ public: QString markedUpCode(); - virtual bool visit(QQmlJS::AST::UiImport *); - virtual void endVisit(QQmlJS::AST::UiImport *); - - virtual bool visit(QQmlJS::AST::UiPublicMember *); - virtual bool visit(QQmlJS::AST::UiObjectDefinition *); - - virtual bool visit(QQmlJS::AST::UiObjectInitializer *); - virtual void endVisit(QQmlJS::AST::UiObjectInitializer *); - - virtual bool visit(QQmlJS::AST::UiObjectBinding *); - virtual bool visit(QQmlJS::AST::UiScriptBinding *); - virtual bool visit(QQmlJS::AST::UiArrayBinding *); - virtual bool visit(QQmlJS::AST::UiArrayMemberList *); - virtual bool visit(QQmlJS::AST::UiQualifiedId *); - - virtual bool visit(QQmlJS::AST::ThisExpression *); - virtual bool visit(QQmlJS::AST::IdentifierExpression *); - virtual bool visit(QQmlJS::AST::NullExpression *); - virtual bool visit(QQmlJS::AST::TrueLiteral *); - virtual bool visit(QQmlJS::AST::FalseLiteral *); - virtual bool visit(QQmlJS::AST::NumericLiteral *); - virtual bool visit(QQmlJS::AST::StringLiteral *); - virtual bool visit(QQmlJS::AST::RegExpLiteral *); - virtual bool visit(QQmlJS::AST::ArrayLiteral *); - - virtual bool visit(QQmlJS::AST::ObjectLiteral *); - virtual void endVisit(QQmlJS::AST::ObjectLiteral *); - - virtual bool visit(QQmlJS::AST::ElementList *); - virtual bool visit(QQmlJS::AST::Elision *); - virtual bool visit(QQmlJS::AST::PropertyNameAndValue *); - virtual bool visit(QQmlJS::AST::ArrayMemberExpression *); - virtual bool visit(QQmlJS::AST::FieldMemberExpression *); - virtual bool visit(QQmlJS::AST::NewMemberExpression *); - virtual bool visit(QQmlJS::AST::NewExpression *); - virtual bool visit(QQmlJS::AST::ArgumentList *); - virtual bool visit(QQmlJS::AST::PostIncrementExpression *); - virtual bool visit(QQmlJS::AST::PostDecrementExpression *); - virtual bool visit(QQmlJS::AST::DeleteExpression *); - virtual bool visit(QQmlJS::AST::VoidExpression *); - virtual bool visit(QQmlJS::AST::TypeOfExpression *); - virtual bool visit(QQmlJS::AST::PreIncrementExpression *); - virtual bool visit(QQmlJS::AST::PreDecrementExpression *); - virtual bool visit(QQmlJS::AST::UnaryPlusExpression *); - virtual bool visit(QQmlJS::AST::UnaryMinusExpression *); - virtual bool visit(QQmlJS::AST::TildeExpression *); - virtual bool visit(QQmlJS::AST::NotExpression *); - virtual bool visit(QQmlJS::AST::BinaryExpression *); - virtual bool visit(QQmlJS::AST::ConditionalExpression *); - virtual bool visit(QQmlJS::AST::Expression *); - - virtual bool visit(QQmlJS::AST::Block *); - virtual void endVisit(QQmlJS::AST::Block *); - - virtual bool visit(QQmlJS::AST::VariableStatement *); - virtual bool visit(QQmlJS::AST::VariableDeclarationList *); - virtual bool visit(QQmlJS::AST::VariableDeclaration *); - virtual bool visit(QQmlJS::AST::EmptyStatement *); - virtual bool visit(QQmlJS::AST::ExpressionStatement *); - virtual bool visit(QQmlJS::AST::IfStatement *); - virtual bool visit(QQmlJS::AST::DoWhileStatement *); - virtual bool visit(QQmlJS::AST::WhileStatement *); - virtual bool visit(QQmlJS::AST::ForStatement *); - virtual bool visit(QQmlJS::AST::LocalForStatement *); - virtual bool visit(QQmlJS::AST::ForEachStatement *); - virtual bool visit(QQmlJS::AST::LocalForEachStatement *); - virtual bool visit(QQmlJS::AST::ContinueStatement *); - virtual bool visit(QQmlJS::AST::BreakStatement *); - virtual bool visit(QQmlJS::AST::ReturnStatement *); - virtual bool visit(QQmlJS::AST::WithStatement *); - - virtual bool visit(QQmlJS::AST::CaseBlock *); - virtual void endVisit(QQmlJS::AST::CaseBlock *); - - virtual bool visit(QQmlJS::AST::SwitchStatement *); - virtual bool visit(QQmlJS::AST::CaseClause *); - virtual bool visit(QQmlJS::AST::DefaultClause *); - virtual bool visit(QQmlJS::AST::LabelledStatement *); - virtual bool visit(QQmlJS::AST::ThrowStatement *); - virtual bool visit(QQmlJS::AST::TryStatement *); - virtual bool visit(QQmlJS::AST::Catch *); - virtual bool visit(QQmlJS::AST::Finally *); - virtual bool visit(QQmlJS::AST::FunctionDeclaration *); - virtual bool visit(QQmlJS::AST::FunctionExpression *); - virtual bool visit(QQmlJS::AST::FormalParameterList *); - virtual bool visit(QQmlJS::AST::DebuggerStatement *); + virtual bool visit(QQmlJS::AST::UiImport *) Q_DECL_OVERRIDE; + virtual void endVisit(QQmlJS::AST::UiImport *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::UiPublicMember *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UiObjectDefinition *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::UiObjectInitializer *) Q_DECL_OVERRIDE; + virtual void endVisit(QQmlJS::AST::UiObjectInitializer *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::UiObjectBinding *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UiScriptBinding *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UiArrayBinding *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UiArrayMemberList *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UiQualifiedId *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::ThisExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::IdentifierExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::NullExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::TrueLiteral *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::FalseLiteral *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::NumericLiteral *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::StringLiteral *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::RegExpLiteral *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ArrayLiteral *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::ObjectLiteral *) Q_DECL_OVERRIDE; + virtual void endVisit(QQmlJS::AST::ObjectLiteral *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::ElementList *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::Elision *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::PropertyNameAndValue *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ArrayMemberExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::FieldMemberExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::NewMemberExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::NewExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ArgumentList *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::PostIncrementExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::PostDecrementExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::DeleteExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::VoidExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::TypeOfExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::PreIncrementExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::PreDecrementExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UnaryPlusExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UnaryMinusExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::TildeExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::NotExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::BinaryExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ConditionalExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::Expression *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::Block *) Q_DECL_OVERRIDE; + virtual void endVisit(QQmlJS::AST::Block *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::VariableStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::VariableDeclarationList *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::VariableDeclaration *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::EmptyStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ExpressionStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::IfStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::DoWhileStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::WhileStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ForStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::LocalForStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ForEachStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::LocalForEachStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ContinueStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::BreakStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ReturnStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::WithStatement *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::CaseBlock *) Q_DECL_OVERRIDE; + virtual void endVisit(QQmlJS::AST::CaseBlock *) Q_DECL_OVERRIDE; + + virtual bool visit(QQmlJS::AST::SwitchStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::CaseClause *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::DefaultClause *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::LabelledStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::ThrowStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::TryStatement *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::Catch *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::Finally *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::FunctionDeclaration *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::FunctionExpression *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::FormalParameterList *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::DebuggerStatement *) Q_DECL_OVERRIDE; protected: QString protect(const QString &string); diff --git a/src/tools/qdoc/qmlparser/qqmljsast_p.h b/src/tools/qdoc/qmlparser/qqmljsast_p.h index fa4b2c3e13..ae79046563 100644 --- a/src/tools/qdoc/qmlparser/qqmljsast_p.h +++ b/src/tools/qdoc/qmlparser/qqmljsast_p.h @@ -247,7 +247,7 @@ class QML_PARSER_EXPORT ExpressionNode: public Node public: ExpressionNode() {} - virtual ExpressionNode *expressionCast(); + virtual ExpressionNode *expressionCast() Q_DECL_OVERRIDE; }; class QML_PARSER_EXPORT Statement: public Node @@ -255,7 +255,7 @@ class QML_PARSER_EXPORT Statement: public Node public: Statement() {} - virtual Statement *statementCast(); + virtual Statement *statementCast() Q_DECL_OVERRIDE; }; class QML_PARSER_EXPORT NestedExpression: public ExpressionNode @@ -267,12 +267,12 @@ public: : expression(expression) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return lparenToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rparenToken; } // attributes @@ -288,12 +288,12 @@ public: ThisExpression() { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return thisToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return thisToken; } // attributes @@ -308,12 +308,12 @@ public: IdentifierExpression(const QStringRef &n): name (n) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } // attributes @@ -328,12 +328,12 @@ public: NullExpression() { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return nullToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return nullToken; } // attributes @@ -347,12 +347,12 @@ public: TrueLiteral() { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return trueToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return trueToken; } // attributes @@ -366,12 +366,12 @@ public: FalseLiteral() { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return falseToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return falseToken; } // attributes @@ -386,12 +386,12 @@ public: NumericLiteral(double v): value(v) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return literalToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return literalToken; } // attributes: @@ -407,12 +407,12 @@ public: StringLiteral(const QStringRef &v): value (v) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return literalToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return literalToken; } // attributes: @@ -428,12 +428,12 @@ public: RegExpLiteral(const QStringRef &p, int f): pattern (p), flags (f) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return literalToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return literalToken; } // attributes: @@ -459,12 +459,12 @@ public: elements (elts), elision (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return lbracketToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbracketToken; } // attributes @@ -486,12 +486,12 @@ public: ObjectLiteral(PropertyAssignmentList *plist): properties (plist) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return lbraceToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbraceToken; } // attributes @@ -515,12 +515,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return commaToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : commaToken; } inline Elision *finish () @@ -559,16 +559,16 @@ public: return front; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { if (elision) return elision->firstSourceLocation(); return expression->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (next) return next->lastSourceLocation(); @@ -589,10 +589,10 @@ public: PropertyName() { kind = K; } - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return propertyNameToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return propertyNameToken; } // attributes @@ -630,12 +630,12 @@ public: return front; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return assignment->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : assignment->lastSourceLocation(); } // attributes @@ -653,12 +653,12 @@ public: : name(n), value(v) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return name->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return value->lastSourceLocation(); } // attributes @@ -686,12 +686,12 @@ public: : type(Setter), name(n), formals(f), functionBody (b) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return getSetToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbraceToken; } // attributes @@ -714,7 +714,7 @@ public: IdentifierPropertyName(const QStringRef &n): id (n) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; // attributes QStringRef id; @@ -728,7 +728,7 @@ public: StringLiteralPropertyName(const QStringRef &n): id (n) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; // attributes QStringRef id; @@ -742,7 +742,7 @@ public: NumericLiteralPropertyName(double n): id (n) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; // attributes double id; @@ -757,12 +757,12 @@ public: base (b), expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return base->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbracketToken; } // attributes @@ -781,12 +781,12 @@ public: base (b), name (n) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return base->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } // attributes @@ -805,12 +805,12 @@ public: base (b), arguments (a) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return newToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rparenToken; } // attributes @@ -829,12 +829,12 @@ public: NewExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return newToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -851,12 +851,12 @@ public: base (b), arguments (a) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return base->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rparenToken; } // attributes @@ -883,12 +883,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return expression->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (next) return next->lastSourceLocation(); @@ -916,12 +916,12 @@ public: PostIncrementExpression(ExpressionNode *b): base (b) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return base->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return incrementToken; } // attributes @@ -937,12 +937,12 @@ public: PostDecrementExpression(ExpressionNode *b): base (b) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return base->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return decrementToken; } // attributes @@ -958,12 +958,12 @@ public: DeleteExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return deleteToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -979,12 +979,12 @@ public: VoidExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return voidToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1000,12 +1000,12 @@ public: TypeOfExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return typeofToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1021,12 +1021,12 @@ public: PreIncrementExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return incrementToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1042,12 +1042,12 @@ public: PreDecrementExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return decrementToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1063,12 +1063,12 @@ public: UnaryPlusExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return plusToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1084,12 +1084,12 @@ public: UnaryMinusExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return minusToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1105,12 +1105,12 @@ public: TildeExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return tildeToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1126,12 +1126,12 @@ public: NotExpression(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return notToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression->lastSourceLocation(); } // attributes @@ -1148,14 +1148,14 @@ public: left (l), op (o), right (r) { kind = K; } - virtual BinaryExpression *binaryExpressionCast(); + virtual BinaryExpression *binaryExpressionCast() Q_DECL_OVERRIDE; - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return left->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return right->lastSourceLocation(); } // attributes @@ -1174,12 +1174,12 @@ public: expression (e), ok (t), ko (f) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return expression->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return ko->lastSourceLocation(); } // attributes @@ -1198,12 +1198,12 @@ public: Expression(ExpressionNode *l, ExpressionNode *r): left (l), right (r) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return left->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return right->lastSourceLocation(); } // attributes @@ -1220,12 +1220,12 @@ public: Block(StatementList *slist): statements (slist) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return lbraceToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbraceToken; } // attributes @@ -1251,12 +1251,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return statement->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : statement->lastSourceLocation(); } inline StatementList *finish () @@ -1280,12 +1280,12 @@ public: declarations (vlist) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return declarationKindToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1303,12 +1303,12 @@ public: name (n), expression (e), readOnly(false) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return expression ? expression->lastSourceLocation() : identifierToken; } // attributes @@ -1335,12 +1335,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return declaration->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (next) return next->lastSourceLocation(); @@ -1372,12 +1372,12 @@ public: EmptyStatement() { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1392,12 +1392,12 @@ public: ExpressionStatement(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return expression->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1414,12 +1414,12 @@ public: expression (e), ok (t), ko (f) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return ifToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (ko) return ko->lastSourceLocation(); @@ -1446,12 +1446,12 @@ public: statement (stmt), expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return doToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1473,12 +1473,12 @@ public: expression (e), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return whileToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1498,12 +1498,12 @@ public: initialiser (i), condition (c), expression (e), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return forToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1527,12 +1527,12 @@ public: declarations (vlist), condition (c), expression (e), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return forToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1557,12 +1557,12 @@ public: initialiser (i), expression (e), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return forToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1584,12 +1584,12 @@ public: declaration (v), expression (e), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return forToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1611,12 +1611,12 @@ public: ContinueStatement(const QStringRef &l = QStringRef()): label (l) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return continueToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1634,12 +1634,12 @@ public: BreakStatement(const QStringRef &l): label (l) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return breakToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1657,12 +1657,12 @@ public: ReturnStatement(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return returnToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1680,12 +1680,12 @@ public: expression (e), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return withToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1705,12 +1705,12 @@ public: clauses (c), defaultClause (d), moreClauses (r) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return lbraceToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbraceToken; } // attributes @@ -1730,12 +1730,12 @@ public: expression (e), block (b) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return switchToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return block->rbraceToken; } // attributes @@ -1755,12 +1755,12 @@ public: expression (e), statements (slist) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return caseToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statements ? statements->lastSourceLocation() : colonToken; } // attributes @@ -1787,12 +1787,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return clause->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : clause->lastSourceLocation(); } inline CaseClauses *finish () @@ -1816,12 +1816,12 @@ public: statements (slist) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return defaultToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statements ? statements->lastSourceLocation() : colonToken; } // attributes @@ -1839,12 +1839,12 @@ public: label (l), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1862,12 +1862,12 @@ public: ThrowStatement(ExpressionNode *e): expression (e) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return throwToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -1885,12 +1885,12 @@ public: name (n), statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return catchToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -1911,12 +1911,12 @@ public: statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return finallyToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement ? statement->lastSourceLocation() : finallyToken; } // attributes @@ -1941,12 +1941,12 @@ public: statement (stmt), catchExpression (c), finallyExpression (0) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return tryToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (finallyExpression) return finallyExpression->statement->rbraceToken; @@ -1972,12 +1972,12 @@ public: name (n), formals (f), body (b) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return functionToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbraceToken; } // attributes @@ -2001,7 +2001,7 @@ public: FunctionExpression(n, f, b) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; }; class QML_PARSER_EXPORT FormalParameterList: public Node @@ -2021,12 +2021,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : identifierToken; } inline FormalParameterList *finish () @@ -2069,12 +2069,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return element->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : element->lastSourceLocation(); } inline SourceElements *finish () @@ -2098,12 +2098,12 @@ public: elements (elts) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return elements ? elements->firstSourceLocation() : SourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return elements ? elements->lastSourceLocation() : SourceLocation(); } // attributes @@ -2119,12 +2119,12 @@ public: elements (elts) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return elements ? elements->firstSourceLocation() : SourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return elements ? elements->lastSourceLocation() : SourceLocation(); } // attributes @@ -2140,12 +2140,12 @@ public: declaration (f) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return declaration->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return declaration->lastSourceLocation(); } // attributes @@ -2161,12 +2161,12 @@ public: statement (stmt) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return statement->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } // attributes @@ -2181,12 +2181,12 @@ public: DebuggerStatement() { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return debuggerToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -2218,12 +2218,12 @@ public: return head; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : identifierToken; } // attributes @@ -2245,12 +2245,12 @@ public: : importUri(uri) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return importToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -2271,7 +2271,7 @@ public: virtual SourceLocation firstSourceLocation() const = 0; virtual SourceLocation lastSourceLocation() const = 0; - virtual UiObjectMember *uiObjectMemberCast(); + virtual UiObjectMember *uiObjectMemberCast() Q_DECL_OVERRIDE; }; class QML_PARSER_EXPORT UiObjectMemberList: public Node @@ -2291,12 +2291,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return member->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : member->lastSourceLocation(); } UiObjectMemberList *finish() @@ -2335,12 +2335,12 @@ public: return head; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : identifierToken; } // attributes @@ -2358,12 +2358,12 @@ public: : pragmaType(type) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return pragmaToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return semicolonToken; } // attributes @@ -2408,12 +2408,12 @@ public: return head; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return headerItem->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : headerItem->lastSourceLocation(); } // attributes @@ -2430,9 +2430,9 @@ public: : headers(headers), members(members) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { if (headers) return headers->firstSourceLocation(); @@ -2441,7 +2441,7 @@ public: return SourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (members) return members->lastSourceLocation(); @@ -2472,12 +2472,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return member->firstSourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : member->lastSourceLocation(); } UiArrayMemberList *finish() @@ -2502,12 +2502,12 @@ public: : members(members) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return lbraceToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbraceToken; } // attributes @@ -2533,12 +2533,12 @@ public: previous->next = this; } - virtual void accept0(Visitor *); + virtual void accept0(Visitor *) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return propertyTypeToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return next ? next->lastSourceLocation() : identifierToken; } inline UiParameterList *finish () @@ -2573,9 +2573,9 @@ public: : type(Property), memberType(memberType), name(name), statement(statement), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { if (defaultToken.isValid()) return defaultToken; @@ -2585,7 +2585,7 @@ public: return propertyToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (binding) return binding->lastSourceLocation(); @@ -2625,12 +2625,12 @@ public: : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer) { kind = K; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return qualifiedTypeNameId->identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return initializer->rbraceToken; } // attributes @@ -2647,7 +2647,7 @@ public: : sourceElement(sourceElement) { kind = K; } - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement)) return funDecl->firstSourceLocation(); @@ -2657,7 +2657,7 @@ public: return SourceLocation(); } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement)) return funDecl->lastSourceLocation(); @@ -2667,7 +2667,7 @@ public: return SourceLocation(); } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; // attributes @@ -2688,7 +2688,7 @@ public: hasOnToken(false) { kind = K; } - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { if (hasOnToken && qualifiedTypeNameId) return qualifiedTypeNameId->identifierToken; @@ -2696,10 +2696,10 @@ public: return qualifiedId->identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return initializer->rbraceToken; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; // attributes @@ -2721,13 +2721,13 @@ public: statement(statement) { kind = K; } - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return qualifiedId->identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return statement->lastSourceLocation(); } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; // attributes UiQualifiedId *qualifiedId; @@ -2746,13 +2746,13 @@ public: members(members) { kind = K; } - virtual SourceLocation firstSourceLocation() const + virtual SourceLocation firstSourceLocation() const Q_DECL_OVERRIDE { return qualifiedId->identifierToken; } - virtual SourceLocation lastSourceLocation() const + virtual SourceLocation lastSourceLocation() const Q_DECL_OVERRIDE { return rbracketToken; } - virtual void accept0(Visitor *visitor); + virtual void accept0(Visitor *visitor) Q_DECL_OVERRIDE; // attributes UiQualifiedId *qualifiedId; diff --git a/src/tools/qdoc/qmlvisitor.h b/src/tools/qdoc/qmlvisitor.h index ed9ba7c6eb..418772cdff 100644 --- a/src/tools/qdoc/qmlvisitor.h +++ b/src/tools/qdoc/qmlvisitor.h @@ -67,30 +67,30 @@ public: const QSet<QString> &topics); virtual ~QmlDocVisitor(); - bool visit(QQmlJS::AST::UiImport *import); - void endVisit(QQmlJS::AST::UiImport *definition); + bool visit(QQmlJS::AST::UiImport *import) Q_DECL_OVERRIDE; + void endVisit(QQmlJS::AST::UiImport *definition) Q_DECL_OVERRIDE; - bool visit(QQmlJS::AST::UiObjectDefinition *definition); - void endVisit(QQmlJS::AST::UiObjectDefinition *definition); + bool visit(QQmlJS::AST::UiObjectDefinition *definition) Q_DECL_OVERRIDE; + void endVisit(QQmlJS::AST::UiObjectDefinition *definition) Q_DECL_OVERRIDE; - bool visit(QQmlJS::AST::UiPublicMember *member); - void endVisit(QQmlJS::AST::UiPublicMember *definition); + bool visit(QQmlJS::AST::UiPublicMember *member) Q_DECL_OVERRIDE; + void endVisit(QQmlJS::AST::UiPublicMember *definition) Q_DECL_OVERRIDE; - virtual bool visit(QQmlJS::AST::UiObjectBinding *); - virtual void endVisit(QQmlJS::AST::UiObjectBinding *); - virtual void endVisit(QQmlJS::AST::UiArrayBinding *); - virtual bool visit(QQmlJS::AST::UiArrayBinding *); + virtual bool visit(QQmlJS::AST::UiObjectBinding *) Q_DECL_OVERRIDE; + virtual void endVisit(QQmlJS::AST::UiObjectBinding *) Q_DECL_OVERRIDE; + virtual void endVisit(QQmlJS::AST::UiArrayBinding *) Q_DECL_OVERRIDE; + virtual bool visit(QQmlJS::AST::UiArrayBinding *) Q_DECL_OVERRIDE; - bool visit(QQmlJS::AST::IdentifierPropertyName *idproperty); + bool visit(QQmlJS::AST::IdentifierPropertyName *idproperty) Q_DECL_OVERRIDE; - bool visit(QQmlJS::AST::FunctionDeclaration *); - void endVisit(QQmlJS::AST::FunctionDeclaration *); + bool visit(QQmlJS::AST::FunctionDeclaration *) Q_DECL_OVERRIDE; + void endVisit(QQmlJS::AST::FunctionDeclaration *) Q_DECL_OVERRIDE; - bool visit(QQmlJS::AST::UiScriptBinding *); - void endVisit(QQmlJS::AST::UiScriptBinding *); + bool visit(QQmlJS::AST::UiScriptBinding *) Q_DECL_OVERRIDE; + void endVisit(QQmlJS::AST::UiScriptBinding *) Q_DECL_OVERRIDE; - bool visit(QQmlJS::AST::UiQualifiedId *); - void endVisit(QQmlJS::AST::UiQualifiedId *); + bool visit(QQmlJS::AST::UiQualifiedId *) Q_DECL_OVERRIDE; + void endVisit(QQmlJS::AST::UiQualifiedId *) Q_DECL_OVERRIDE; private: QString getFullyQualifiedId(QQmlJS::AST::UiQualifiedId *id); diff --git a/src/tools/qdoc/tokenizer.cpp b/src/tools/qdoc/tokenizer.cpp index 7c9e9f338a..dca1e9bb55 100644 --- a/src/tools/qdoc/tokenizer.cpp +++ b/src/tools/qdoc/tokenizer.cpp @@ -511,6 +511,9 @@ void Tokenizer::initialize(const Config &config) defines = new QRegExp(d.join('|')); falsehoods = new QRegExp(config.getStringList(CONFIG_FALSEHOODS).join('|')); + /* + The keyword hash table is always cleared before any words are inserted. + */ memset(kwordHashTable, 0, sizeof(kwordHashTable)); for (int i = 0; i < Tok_LastKeyword - Tok_FirstKeyword + 1; i++) insertKwordIntoHash(kwords[i], i + 1); @@ -533,6 +536,11 @@ void Tokenizer::initialize(const Config &config) } } +/*! + The heap allocated variables are freed here. The keyword + hash table is not cleared here, but it is cleared in the + initialize() function, before any keywords are inserted. + */ void Tokenizer::terminate() { delete comment; diff --git a/src/tools/qdoc/tree.cpp b/src/tools/qdoc/tree.cpp index 2e327a5ac8..a4b8d8cd8a 100644 --- a/src/tools/qdoc/tree.cpp +++ b/src/tools/qdoc/tree.cpp @@ -66,10 +66,19 @@ QT_BEGIN_NAMESPACE be necessary, and it might be removed later. */ Tree::Tree(const QString& module, QDocDatabase* qdb) - : module_(module), qdb_(qdb), root_(0, QString()) + : treeHasBeenAnalyzed_(false), + docsHaveBeenGenerated_(false), + linkCount_(0), + module_(module), + qdb_(qdb), + root_(0, QString()), + targetListMap_(0) { root_.setModuleName(module_); root_.setTree(this); + if (Generator::writeQaPages()) { + targetListMap_ = new TargetListMap; + } } /*! @@ -95,6 +104,18 @@ Tree::~Tree() } nodesByTargetRef_.clear(); nodesByTargetTitle_.clear(); + if (Generator::writeQaPages() && targetListMap_) { + TargetListMap::iterator i = targetListMap_->begin(); + while (i != targetListMap_->end()) { + TargetList* tlist = i.value(); + if (tlist) { + foreach (TargetLoc* tloc, *tlist) + delete tloc; + } + delete tlist; + ++i; + } + } } /* API members */ @@ -1114,7 +1135,7 @@ QString Tree::refForAtom(const Atom* atom) if (atom) { if (atom->type() == Atom::SectionLeft) return Doc::canonicalTitle(Text::sectionHeading(atom).toString()); - if (atom->type() == Atom::Target) + if ((atom->type() == Atom::Target) || (atom->type() == Atom::Keyword)) return Doc::canonicalTitle(atom->string()); } return QString(); @@ -1394,4 +1415,51 @@ const Node* Tree::checkForCollision(const QString& name) return findNode(QStringList(name), 0, 0, Node::DontCare); } +/*! + Generate a target of the form link-nnn, where the nnn is + the current link count for this tree. This target string + is returned. It will be output as an HTML anchor just before + an HTML link to the node \a t. + + The node \a t + */ +QString Tree::getNewLinkTarget(const Node* locNode, + const Node* t, + const QString& fileName, + QString& text, + bool broken) +{ + QString moduleName; + if (t && !broken) { + Tree* tree = t->tree(); + if (tree != this) + tree->incrementLinkCount(); + moduleName = tree->moduleName(); + } + else + moduleName = "broken"; + incrementLinkCount(); + QString target = QString("qa-target-%1").arg(-(linkCount())); + TargetLoc* tloc = new TargetLoc(locNode, target, fileName, text, broken); + TargetList* tList = 0; + TargetListMap::iterator i = targetListMap_->find(moduleName); + if (i == targetListMap_->end()) { + tList = new TargetList; + i = targetListMap_->insert(moduleName, tList); + } + else + tList = i.value(); + tList->append(tloc); + return target; +} + +/*! + Look up the target list for the specified \a module + and return a pointer to it. + */ +TargetList* Tree::getTargetList(const QString& module) +{ + return targetListMap_->value(module); +} + QT_END_NAMESPACE diff --git a/src/tools/qdoc/tree.h b/src/tools/qdoc/tree.h index 6bb13ee327..6ccf85371b 100644 --- a/src/tools/qdoc/tree.h +++ b/src/tools/qdoc/tree.h @@ -67,10 +67,24 @@ struct TargetRec Type type_; }; +struct TargetLoc +{ + public: + TargetLoc(const Node* loc, const QString& t, const QString& fileName, const QString& text, bool broken) + : loc_(loc), target_(t), fileName_(fileName), text_(text), broken_(broken) { } + const Node* loc_; + QString target_; + QString fileName_; + QString text_; + bool broken_; +}; + typedef QMultiMap<QString, TargetRec*> TargetMap; typedef QMultiMap<QString, DocNode*> DocNodeMultiMap; typedef QMap<QString, QmlClassNode*> QmlTypeMap; typedef QMultiMap<QString, const ExampleNode*> ExampleNodeMap; +typedef QVector<TargetLoc*> TargetList; +typedef QMap<QString, TargetList*> TargetListMap; class Tree { @@ -187,12 +201,33 @@ class Tree void addExampleNode(ExampleNode* n) { exampleNodeMap_.insert(n->title(), n); } ExampleNodeMap& exampleNodeMap() { return exampleNodeMap_; } const Node* checkForCollision(const QString& name); + void setIndexFileName(const QString& t) { indexFileName_ = t; } + + bool treeHasBeenAnalyzed() const { return treeHasBeenAnalyzed_; } + bool docsHaveBeenGenerated() const { return docsHaveBeenGenerated_; } + void setTreeHasBeenAnalyzed() { treeHasBeenAnalyzed_ = true; } + void setdocsHaveBeenGenerated() { docsHaveBeenGenerated_ = true; } + QString getNewLinkTarget(const Node* locNode, + const Node* t, + const QString& fileName, + QString& text, + bool broken); + TargetList* getTargetList(const QString& module); + QStringList getTargetListKeys() { return targetListMap_->keys(); } public: const QString& moduleName() const { return module_; } + const QString& indexFileName() const { return indexFileName_; } + long incrementLinkCount() { return --linkCount_; } + void clearLinkCount() { linkCount_ = 0; } + long linkCount() const { return linkCount_; } private: + bool treeHasBeenAnalyzed_; + bool docsHaveBeenGenerated_; + long linkCount_; QString module_; + QString indexFileName_; QDocDatabase* qdb_; NamespaceNode root_; PropertyMap unresolvedPropertyMap; @@ -204,6 +239,7 @@ private: CNMap qmlModules_; QmlTypeMap qmlTypeMap_; ExampleNodeMap exampleNodeMap_; + TargetListMap* targetListMap_; }; QT_END_NAMESPACE diff --git a/src/tools/uic/cpp/cppextractimages.h b/src/tools/uic/cpp/cppextractimages.h index ce5fd75b5d..162359ca13 100644 --- a/src/tools/uic/cpp/cppextractimages.h +++ b/src/tools/uic/cpp/cppextractimages.h @@ -52,9 +52,9 @@ class ExtractImages : public TreeWalker public: ExtractImages(const Option &opt); - void acceptUI(DomUI *node); - void acceptImages(DomImages *images); - void acceptImage(DomImage *image); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptImages(DomImages *images) Q_DECL_OVERRIDE; + void acceptImage(DomImage *image) Q_DECL_OVERRIDE; private: QTextStream *m_output; diff --git a/src/tools/uic/cpp/cppwritedeclaration.h b/src/tools/uic/cpp/cppwritedeclaration.h index 7cd8b3581e..7ce7cd083c 100644 --- a/src/tools/uic/cpp/cppwritedeclaration.h +++ b/src/tools/uic/cpp/cppwritedeclaration.h @@ -50,13 +50,13 @@ struct WriteDeclaration : public TreeWalker { WriteDeclaration(Uic *uic, bool activateScripts); - void acceptUI(DomUI *node); - void acceptWidget(DomWidget *node); - void acceptSpacer(DomSpacer *node); - void acceptLayout(DomLayout *node); - void acceptActionGroup(DomActionGroup *node); - void acceptAction(DomAction *node); - void acceptButtonGroup(const DomButtonGroup *buttonGroup); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptWidget(DomWidget *node) Q_DECL_OVERRIDE; + void acceptSpacer(DomSpacer *node) Q_DECL_OVERRIDE; + void acceptLayout(DomLayout *node) Q_DECL_OVERRIDE; + void acceptActionGroup(DomActionGroup *node) Q_DECL_OVERRIDE; + void acceptAction(DomAction *node) Q_DECL_OVERRIDE; + void acceptButtonGroup(const DomButtonGroup *buttonGroup) Q_DECL_OVERRIDE; private: Uic *m_uic; diff --git a/src/tools/uic/cpp/cppwriteicondata.h b/src/tools/uic/cpp/cppwriteicondata.h index 0dc2bf0721..613b7d7ca3 100644 --- a/src/tools/uic/cpp/cppwriteicondata.h +++ b/src/tools/uic/cpp/cppwriteicondata.h @@ -52,9 +52,9 @@ class WriteIconData : public TreeWalker public: WriteIconData(Uic *uic); - void acceptUI(DomUI *node); - void acceptImages(DomImages *images); - void acceptImage(DomImage *image); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptImages(DomImages *images) Q_DECL_OVERRIDE; + void acceptImage(DomImage *image) Q_DECL_OVERRIDE; static void writeImage(QTextStream &output, const QString &indent, bool limitXPM_LineLength, const DomImage *image); diff --git a/src/tools/uic/cpp/cppwriteicondeclaration.h b/src/tools/uic/cpp/cppwriteicondeclaration.h index c093430bec..f717208b59 100644 --- a/src/tools/uic/cpp/cppwriteicondeclaration.h +++ b/src/tools/uic/cpp/cppwriteicondeclaration.h @@ -51,9 +51,9 @@ class WriteIconDeclaration : public TreeWalker public: WriteIconDeclaration(Uic *uic); - void acceptUI(DomUI *node); - void acceptImages(DomImages *images); - void acceptImage(DomImage *image); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptImages(DomImages *images) Q_DECL_OVERRIDE; + void acceptImage(DomImage *image) Q_DECL_OVERRIDE; private: Driver *driver; diff --git a/src/tools/uic/cpp/cppwriteiconinitialization.h b/src/tools/uic/cpp/cppwriteiconinitialization.h index d8a0a6195f..53f7de6597 100644 --- a/src/tools/uic/cpp/cppwriteiconinitialization.h +++ b/src/tools/uic/cpp/cppwriteiconinitialization.h @@ -53,9 +53,9 @@ class WriteIconInitialization : public TreeWalker public: WriteIconInitialization(Uic *uic); - void acceptUI(DomUI *node); - void acceptImages(DomImages *images); - void acceptImage(DomImage *image); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptImages(DomImages *images) Q_DECL_OVERRIDE; + void acceptImage(DomImage *image) Q_DECL_OVERRIDE; static QString iconFromDataFunction(); diff --git a/src/tools/uic/cpp/cppwriteincludes.h b/src/tools/uic/cpp/cppwriteincludes.h index 6f6a0f6105..0d446514f1 100644 --- a/src/tools/uic/cpp/cppwriteincludes.h +++ b/src/tools/uic/cpp/cppwriteincludes.h @@ -53,24 +53,24 @@ struct WriteIncludes : public TreeWalker { WriteIncludes(Uic *uic); - void acceptUI(DomUI *node); - void acceptWidget(DomWidget *node); - void acceptLayout(DomLayout *node); - void acceptSpacer(DomSpacer *node); - void acceptProperty(DomProperty *node); - void acceptWidgetScripts(const DomScripts &, DomWidget *, const DomWidgets &); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptWidget(DomWidget *node) Q_DECL_OVERRIDE; + void acceptLayout(DomLayout *node) Q_DECL_OVERRIDE; + void acceptSpacer(DomSpacer *node) Q_DECL_OVERRIDE; + void acceptProperty(DomProperty *node) Q_DECL_OVERRIDE; + void acceptWidgetScripts(const DomScripts &, DomWidget *, const DomWidgets &) Q_DECL_OVERRIDE; // // custom widgets // - void acceptCustomWidgets(DomCustomWidgets *node); - void acceptCustomWidget(DomCustomWidget *node); + void acceptCustomWidgets(DomCustomWidgets *node) Q_DECL_OVERRIDE; + void acceptCustomWidget(DomCustomWidget *node) Q_DECL_OVERRIDE; // // include hints // - void acceptIncludes(DomIncludes *node); - void acceptInclude(DomInclude *node); + void acceptIncludes(DomIncludes *node) Q_DECL_OVERRIDE; + void acceptInclude(DomInclude *node) Q_DECL_OVERRIDE; bool scriptsActivated() const { return m_scriptsActivated; } diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index 5a1c1850d4..2627c4cf5c 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -913,6 +913,7 @@ void WriteInitialization::acceptLayout(DomLayout *node) m_layoutMarginType = SubLayoutMargin; DomPropertyList propList = node->elementProperty(); + DomPropertyList newPropList; if (m_layoutWidget) { bool left, top, right, bottom; left = top = right = bottom = false; @@ -932,31 +933,38 @@ void WriteInitialization::acceptLayout(DomLayout *node) DomProperty *p = new DomProperty(); p->setAttributeName(QLatin1String("leftMargin")); p->setElementNumber(0); - propList.append(p); + newPropList.append(p); } if (!top) { DomProperty *p = new DomProperty(); p->setAttributeName(QLatin1String("topMargin")); p->setElementNumber(0); - propList.append(p); + newPropList.append(p); } if (!right) { DomProperty *p = new DomProperty(); p->setAttributeName(QLatin1String("rightMargin")); p->setElementNumber(0); - propList.append(p); + newPropList.append(p); } if (!bottom) { DomProperty *p = new DomProperty(); p->setAttributeName(QLatin1String("bottomMargin")); p->setElementNumber(0); - propList.append(p); + newPropList.append(p); } m_layoutWidget = false; } + propList.append(newPropList); + writeProperties(varName, className, propList, WritePropertyIgnoreMargin|WritePropertyIgnoreSpacing); + // Clean up again: + propList.clear(); + qDeleteAll(newPropList); + newPropList.clear(); + m_layoutChain.push(node); TreeWalker::acceptLayout(node); m_layoutChain.pop(); diff --git a/src/tools/uic/cpp/cppwriteinitialization.h b/src/tools/uic/cpp/cppwriteinitialization.h index 1cf3e750b4..53bc57d376 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.h +++ b/src/tools/uic/cpp/cppwriteinitialization.h @@ -110,47 +110,47 @@ struct WriteInitialization : public TreeWalker // // widgets // - void acceptUI(DomUI *node); - void acceptWidget(DomWidget *node); - void acceptWidgetScripts(const DomScripts &, DomWidget *node, const DomWidgets &childWidgets); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptWidget(DomWidget *node) Q_DECL_OVERRIDE; + void acceptWidgetScripts(const DomScripts &, DomWidget *node, const DomWidgets &childWidgets) Q_DECL_OVERRIDE; - void acceptLayout(DomLayout *node); - void acceptSpacer(DomSpacer *node); - void acceptLayoutItem(DomLayoutItem *node); + void acceptLayout(DomLayout *node) Q_DECL_OVERRIDE; + void acceptSpacer(DomSpacer *node) Q_DECL_OVERRIDE; + void acceptLayoutItem(DomLayoutItem *node) Q_DECL_OVERRIDE; // // actions // - void acceptActionGroup(DomActionGroup *node); - void acceptAction(DomAction *node); - void acceptActionRef(DomActionRef *node); + void acceptActionGroup(DomActionGroup *node) Q_DECL_OVERRIDE; + void acceptAction(DomAction *node) Q_DECL_OVERRIDE; + void acceptActionRef(DomActionRef *node) Q_DECL_OVERRIDE; // // tab stops // - void acceptTabStops(DomTabStops *tabStops); + void acceptTabStops(DomTabStops *tabStops) Q_DECL_OVERRIDE; // // custom widgets // - void acceptCustomWidgets(DomCustomWidgets *node); - void acceptCustomWidget(DomCustomWidget *node); + void acceptCustomWidgets(DomCustomWidgets *node) Q_DECL_OVERRIDE; + void acceptCustomWidget(DomCustomWidget *node) Q_DECL_OVERRIDE; // // layout defaults/functions // - void acceptLayoutDefault(DomLayoutDefault *node) { m_LayoutDefaultHandler.acceptLayoutDefault(node); } - void acceptLayoutFunction(DomLayoutFunction *node) { m_LayoutDefaultHandler.acceptLayoutFunction(node); } + void acceptLayoutDefault(DomLayoutDefault *node) Q_DECL_OVERRIDE { m_LayoutDefaultHandler.acceptLayoutDefault(node); } + void acceptLayoutFunction(DomLayoutFunction *node) Q_DECL_OVERRIDE { m_LayoutDefaultHandler.acceptLayoutFunction(node); } // // signal/slot connections // - void acceptConnection(DomConnection *connection); + void acceptConnection(DomConnection *connection) Q_DECL_OVERRIDE; // // images // - void acceptImage(DomImage *image); + void acceptImage(DomImage *image) Q_DECL_OVERRIDE; enum { Use43UiFile = 0, diff --git a/src/tools/uic/customwidgetsinfo.h b/src/tools/uic/customwidgetsinfo.h index 5e58d6c3ce..6b0f7ed81a 100644 --- a/src/tools/uic/customwidgetsinfo.h +++ b/src/tools/uic/customwidgetsinfo.h @@ -48,10 +48,10 @@ class CustomWidgetsInfo : public TreeWalker public: CustomWidgetsInfo(); - void acceptUI(DomUI *node); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; - void acceptCustomWidgets(DomCustomWidgets *node); - void acceptCustomWidget(DomCustomWidget *node); + void acceptCustomWidgets(DomCustomWidgets *node) Q_DECL_OVERRIDE; + void acceptCustomWidget(DomCustomWidget *node) Q_DECL_OVERRIDE; inline QStringList customWidgets() const { return m_customWidgets.keys(); } diff --git a/src/tools/uic/databaseinfo.h b/src/tools/uic/databaseinfo.h index 0c80ad9551..92e0b37fe1 100644 --- a/src/tools/uic/databaseinfo.h +++ b/src/tools/uic/databaseinfo.h @@ -47,8 +47,8 @@ class DatabaseInfo : public TreeWalker public: DatabaseInfo(); - void acceptUI(DomUI *node); - void acceptWidget(DomWidget *node); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptWidget(DomWidget *node) Q_DECL_OVERRIDE; inline QStringList connections() const { return m_connections; } diff --git a/src/tools/uic/validator.h b/src/tools/uic/validator.h index 82f6b71b1a..82511776a8 100644 --- a/src/tools/uic/validator.h +++ b/src/tools/uic/validator.h @@ -48,14 +48,14 @@ struct Validator : public TreeWalker { Validator(Uic *uic); - void acceptUI(DomUI *node); - void acceptWidget(DomWidget *node); + void acceptUI(DomUI *node) Q_DECL_OVERRIDE; + void acceptWidget(DomWidget *node) Q_DECL_OVERRIDE; - void acceptLayoutItem(DomLayoutItem *node); - void acceptLayout(DomLayout *node); + void acceptLayoutItem(DomLayoutItem *node) Q_DECL_OVERRIDE; + void acceptLayout(DomLayout *node) Q_DECL_OVERRIDE; - void acceptActionGroup(DomActionGroup *node); - void acceptAction(DomAction *node); + void acceptActionGroup(DomActionGroup *node) Q_DECL_OVERRIDE; + void acceptAction(DomAction *node) Q_DECL_OVERRIDE; private: Driver *m_driver; |