summaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/bootstrap/bootstrap.pro1
-rw-r--r--src/tools/moc/generator.cpp40
-rw-r--r--src/tools/moc/generator.h5
-rw-r--r--src/tools/moc/moc.cpp21
-rw-r--r--src/tools/moc/moc.h4
-rw-r--r--src/tools/uic/cpp/cppwriteincludes.cpp3
-rw-r--r--src/tools/uic/main.cpp6
-rw-r--r--src/tools/uic/option.h1
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;