diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/bootstrap/bootstrap.pro | 1 | ||||
-rw-r--r-- | src/tools/moc/generator.cpp | 40 | ||||
-rw-r--r-- | src/tools/moc/generator.h | 5 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 21 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 4 | ||||
-rw-r--r-- | src/tools/uic/cpp/cppwriteincludes.cpp | 3 | ||||
-rw-r--r-- | src/tools/uic/main.cpp | 6 | ||||
-rw-r--r-- | src/tools/uic/option.h | 1 |
8 files changed, 61 insertions, 20 deletions
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index dd5189758d..967f45d5df 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -100,6 +100,7 @@ SOURCES += \ ../../corelib/tools/qsize.cpp \ ../../corelib/tools/qline.cpp \ ../../corelib/tools/qstring.cpp \ + ../../corelib/tools/qstring_compat.cpp \ ../../corelib/tools/qstringlist.cpp \ ../../corelib/tools/qvector.cpp \ ../../corelib/tools/qvsnprintf.cpp \ diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index b39a3b5e9f..8c1a2f0354 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -87,8 +87,9 @@ QT_FOR_EACH_STATIC_TYPE(RETURN_METATYPENAME_STRING) return 0; } -Generator::Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QSet<QByteArray> &knownQObjectClasses, FILE *outfile) +Generator::Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QHash<QByteArray, QByteArray> &knownQObjectClasses, const QHash<QByteArray, QByteArray> &knownGadgets, FILE *outfile) : out(outfile), cdef(classDef), metaTypes(metaTypes), knownQObjectClasses(knownQObjectClasses) + , knownGadgets(knownGadgets) { if (cdef->superclassList.size()) purestSuperClass = cdef->superclassList.first().first; @@ -438,15 +439,34 @@ void Generator::generateCode() QList<QByteArray> extraList; for (int i = 0; i < cdef->propertyList.count(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); - if (!isBuiltinType(p.type) && !metaTypes.contains(p.type) && !p.type.contains('*') && - !p.type.contains('<') && !p.type.contains('>')) { - int s = p.type.lastIndexOf("::"); - if (s > 0) { - QByteArray scope = p.type.left(s); - if (scope != "Qt" && !qualifiedNameEquals(cdef->qualified, scope) && !extraList.contains(scope)) - extraList += scope; - } + if (isBuiltinType(p.type)) + continue; + + if (p.type.contains('*') || p.type.contains('<') || p.type.contains('>')) + continue; + + int s = p.type.lastIndexOf("::"); + if (s <= 0) + continue; + + QByteArray unqualifiedScope = p.type.left(s); + + // The scope may be a namespace for example, so it's only safe to include scopes that are known QObjects (QTBUG-2151) + QHash<QByteArray, QByteArray>::ConstIterator scopeIt = knownQObjectClasses.find(unqualifiedScope); + if (scopeIt == knownQObjectClasses.constEnd()) { + scopeIt = knownGadgets.find(unqualifiedScope); + if (scopeIt == knownGadgets.constEnd()) + continue; } + const QByteArray &scope = *scopeIt; + + if (scope == "Qt") + continue; + if (qualifiedNameEquals(cdef->qualified, scope)) + continue; + + if (!extraList.contains(scope)) + extraList += scope; } // QTBUG-20639 - Accept non-local enums for QML signal/slot parameters. @@ -464,7 +484,7 @@ void Generator::generateCode() } if (!extraList.isEmpty()) { - fprintf(out, "static const QMetaObject *qt_meta_extradata_%s[] = {\n ", qualifiedClassNameIdentifier.constData()); + fprintf(out, "static const QMetaObject * const qt_meta_extradata_%s[] = {\n ", qualifiedClassNameIdentifier.constData()); for (int i = 0; i < extraList.count(); ++i) { fprintf(out, " &%s::staticMetaObject,\n", extraList.at(i).constData()); } diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h index 203c856b7c..a01ec5860b 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -52,7 +52,7 @@ class Generator ClassDef *cdef; QVector<uint> meta_data; public: - Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QSet<QByteArray> &knownQObjectClasses, FILE *outfile = 0); + Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QHash<QByteArray, QByteArray> &knownQObjectClasses, const QHash<QByteArray, QByteArray> &knownGadgets, FILE *outfile = 0); void generateCode(); private: bool registerableMetaType(const QByteArray &propertyType); @@ -79,7 +79,8 @@ private: QList<QByteArray> strings; QByteArray purestSuperClass; QList<QByteArray> metaTypes; - QSet<QByteArray> knownQObjectClasses; + QHash<QByteArray, QByteArray> knownQObjectClasses; + QHash<QByteArray, QByteArray> knownGadgets; }; QT_END_NAMESPACE diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 8ff481d5b1..2c3f795346 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -608,21 +608,27 @@ void Moc::parse() continue; while (inClass(&def) && hasNext()) { - if (next() == Q_OBJECT_TOKEN) { + switch (next()) { + case Q_OBJECT_TOKEN: def.hasQObject = true; break; + case Q_GADGET_TOKEN: + def.hasQGadget = true; + break; + default: break; } } - if (!def.hasQObject) + if (!def.hasQObject && !def.hasQGadget) continue; for (int i = namespaceList.size() - 1; i >= 0; --i) if (inNamespace(&namespaceList.at(i))) def.qualified.prepend(namespaceList.at(i).name + "::"); - knownQObjectClasses.insert(def.classname); - knownQObjectClasses.insert(def.qualified); + QHash<QByteArray, QByteArray> &classHash = def.hasQObject ? knownQObjectClasses : knownGadgets; + classHash.insert(def.classname, def.qualified); + classHash.insert(def.qualified, def.qualified); continue; } default: break; @@ -795,8 +801,9 @@ void Moc::parse() checkProperties(&def); classList += def; - knownQObjectClasses.insert(def.classname); - knownQObjectClasses.insert(def.qualified); + QHash<QByteArray, QByteArray> &classHash = def.hasQObject ? knownQObjectClasses : knownGadgets; + classHash.insert(def.classname, def.qualified); + classHash.insert(def.qualified, def.qualified); } } } @@ -896,7 +903,7 @@ void Moc::generate(FILE *out) fprintf(out, "QT_BEGIN_MOC_NAMESPACE\n"); for (i = 0; i < classList.size(); ++i) { - Generator generator(&classList[i], metaTypes, knownQObjectClasses, out); + Generator generator(&classList[i], metaTypes, knownQObjectClasses, knownGadgets, out); generator.generateCode(); } diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 2e22435653..e8da24b2bf 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -215,7 +215,9 @@ public: QList<ClassDef> classList; QMap<QByteArray, QByteArray> interface2IdMap; QList<QByteArray> metaTypes; - QSet<QByteArray> knownQObjectClasses; + // map from class name to fully qualified name + QHash<QByteArray, QByteArray> knownQObjectClasses; + QHash<QByteArray, QByteArray> knownGadgets; QMap<QString, QJsonArray> metaArgs; void parse(); diff --git a/src/tools/uic/cpp/cppwriteincludes.cpp b/src/tools/uic/cpp/cppwriteincludes.cpp index c473566e3a..5b7403bf06 100644 --- a/src/tools/uic/cpp/cppwriteincludes.cpp +++ b/src/tools/uic/cpp/cppwriteincludes.cpp @@ -127,6 +127,9 @@ void WriteIncludes::acceptUI(DomUI *node) TreeWalker::acceptUI(node); + if (!m_uic->option().includeFile.isEmpty()) + m_globalIncludes.insert(m_uic->option().includeFile, true); + writeHeaders(m_globalIncludes, true); writeHeaders(m_localIncludes, false); diff --git a/src/tools/uic/main.cpp b/src/tools/uic/main.cpp index c29292a99b..cb2bd430ff 100644 --- a/src/tools/uic/main.cpp +++ b/src/tools/uic/main.cpp @@ -95,6 +95,11 @@ int runUic(int argc, char *argv[]) translateOption.setValueName(QStringLiteral("function")); parser.addOption(translateOption); + QCommandLineOption includeOption(QStringList() << QStringLiteral("include")); + includeOption.setDescription(QStringLiteral("Add #include <include-file> to <file>.")); + includeOption.setValueName(QStringLiteral("include-file")); + parser.addOption(includeOption); + QCommandLineOption generatorOption(QStringList() << QStringLiteral("g") << QStringLiteral("generator")); generatorOption.setDescription(QStringLiteral("Select generator.")); generatorOption.setValueName(QStringLiteral("java|cpp")); @@ -110,6 +115,7 @@ int runUic(int argc, char *argv[]) driver.option().implicitIncludes = !parser.isSet(noImplicitIncludesOption); driver.option().postfix = parser.value(postfixOption); driver.option().translateFunction = parser.value(translateOption); + driver.option().includeFile = parser.value(includeOption); driver.option().generator = (parser.value(generatorOption).toLower() == QLatin1String("java")) ? Option::JavaGenerator : Option::CppGenerator; QString inputFile; diff --git a/src/tools/uic/option.h b/src/tools/uic/option.h index 14ed422d63..52dc731057 100644 --- a/src/tools/uic/option.h +++ b/src/tools/uic/option.h @@ -73,6 +73,7 @@ struct Option QString prefix; QString postfix; QString translateFunction; + QString includeFile; #ifdef QT_UIC_JAVA_GENERATOR QString javaPackage; QString javaOutputDirectory; |