summaryrefslogtreecommitdiffstats
path: root/src/tools/moc
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-12-23 15:16:08 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-24 08:10:16 +0100
commit2b287c7c210ac708c0f8872e51517e0d46380ad3 (patch)
tree42a127faabe1318db2ef18cfdd7dc1ffc6ab58e5 /src/tools/moc
parentd776937df91e46536f404c6868d64016b6038d7b (diff)
Fix regression in property handling with enums from gadgets
When declaring a Q_PROPERTY(SomeType::SomeEnum foo ...) and SomeType is not a QObject but a gadget, then we must still include SomeType's meta object in the list of related meta objects. Task-number: QTBUG-35657 Change-Id: I46195140cb5d180c4f03bb1fe06a876e3fe11267 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/tools/moc')
-rw-r--r--src/tools/moc/generator.cpp10
-rw-r--r--src/tools/moc/generator.h3
-rw-r--r--src/tools/moc/moc.cpp21
-rw-r--r--src/tools/moc/moc.h1
4 files changed, 24 insertions, 11 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index 0740a860ba..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 QHash<QByteArray, 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;
@@ -452,8 +453,11 @@ void Generator::generateCode()
// 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())
- continue;
+ if (scopeIt == knownQObjectClasses.constEnd()) {
+ scopeIt = knownGadgets.find(unqualifiedScope);
+ if (scopeIt == knownGadgets.constEnd())
+ continue;
+ }
const QByteArray &scope = *scopeIt;
if (scope == "Qt")
diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h
index 725c4ffb12..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 QHash<QByteArray, 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);
@@ -80,6 +80,7 @@ private:
QByteArray purestSuperClass;
QList<QByteArray> metaTypes;
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 15b65d2045..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, def.qualified);
- knownQObjectClasses.insert(def.qualified, 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, def.qualified);
- knownQObjectClasses.insert(def.qualified, 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 4bbdde47dc..e8da24b2bf 100644
--- a/src/tools/moc/moc.h
+++ b/src/tools/moc/moc.h
@@ -217,6 +217,7 @@ public:
QList<QByteArray> metaTypes;
// map from class name to fully qualified name
QHash<QByteArray, QByteArray> knownQObjectClasses;
+ QHash<QByteArray, QByteArray> knownGadgets;
QMap<QString, QJsonArray> metaArgs;
void parse();