qmlplugindump: Describe meta object revisions of exported types.

Adds the exportMetaObjectRevisions property to generated qmltypes files.

Change-Id: Iafe2fe408c88bb6dd02cbb558404a5f654431248
Reviewed-on: http://codereview.qt-project.org/5311
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
This commit is contained in:
Christian Kamm 2011-09-21 12:54:10 +02:00 committed by Qt by Nokia
parent 43ff44058d
commit 26e15e877f
3 changed files with 48 additions and 12 deletions

View File

@ -445,6 +445,13 @@ Module {
"QtQuick/Animation 1.0"
]
// The meta object revisions for the exports specified in 'exports'.
// Describes with revisioned properties will be visible in an export.
// The list must have exactly the same length as the 'exports' list.
// For example the 'animations' propery described below will only be
// available through the QtQuick/Animation 1.0 export.
exportMetaObjectRevisions: [0, 1]
Property {
name: "animations";
type: "QDeclarativeAbstractAnimation"
@ -454,7 +461,7 @@ Module {
isPointer: true
// defaults to false: whether the type actually is a QDeclarativeListProperty<type>
isList: true
// defaults to 0: the minor version that introduced this property
// defaults to 0: the meta object revision that introduced this property
revision: 1
}
Property { name: "loops"; type: "int" }

View File

@ -256,30 +256,43 @@ public:
QSet<const QDeclarativeType *> qmlTypes = qmlTypesByCppName.value(meta->className());
if (!qmlTypes.isEmpty()) {
QStringList exports;
QHash<QString, const QDeclarativeType *> exports;
foreach (const QDeclarativeType *qmlTy, qmlTypes) {
QString qmlTyName = qmlTy->qmlTypeName();
// some qmltype names are missing the actual names, ignore that import
if (qmlTyName.endsWith('/'))
continue;
if (qmlTyName.startsWith(relocatableModuleUri + QLatin1Char('/'))) {
qmlTyName.remove(0, relocatableModuleUri.size() + 1);
}
if (qmlTyName.startsWith("./")) {
qmlTyName.remove(0, 2);
}
exports += enquote(QString("%1 %2.%3").arg(
qmlTyName,
QString::number(qmlTy->majorVersion()),
QString::number(qmlTy->minorVersion())));
if (qmlTyName.startsWith("/")) {
qmlTyName.remove(0, 1);
}
const QString exportString = enquote(
QString("%1 %2.%3").arg(
qmlTyName,
QString::number(qmlTy->majorVersion()),
QString::number(qmlTy->minorVersion())));
exports.insert(exportString, qmlTy);
}
// ensure exports are sorted and don't change order when the plugin is dumped again
exports.removeDuplicates();
qSort(exports);
QStringList exportStrings = exports.keys();
qSort(exportStrings);
qml->writeArrayBinding(QLatin1String("exports"), exportStrings);
qml->writeArrayBinding(QLatin1String("exports"), exports);
// write meta object revisions unless they're all zero
QStringList metaObjectRevisions;
bool shouldWriteMetaObjectRevisions = false;
foreach (const QString &exportString, exportStrings) {
int metaObjectRevision = exports[exportString]->metaObjectRevision();
if (metaObjectRevision != 0)
shouldWriteMetaObjectRevisions = true;
metaObjectRevisions += QString::number(metaObjectRevision);
}
if (shouldWriteMetaObjectRevisions)
qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), metaObjectRevisions);
if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType()) {
qml->writeScriptBinding(QLatin1String("attachedType"), enquote(

View File

@ -110,6 +110,22 @@ void QmlStreamWriter::writeArrayBinding(const QString &name, const QStringList &
{
flushPotentialLinesWithNewlines();
writeIndent();
// try to use a single line
QString singleLine;
singleLine += QString("%1: [").arg(name);
for (int i = 0; i < elements.size(); ++i) {
singleLine += elements.at(i);
if (i != elements.size() - 1)
singleLine += QLatin1String(", ");
}
singleLine += QLatin1String("]\n");
if (singleLine.size() + m_indentDepth * 4 < 80) {
m_stream->write(singleLine.toUtf8());
return;
}
// write multi-line
m_stream->write(QString("%1: [\n").arg(name).toUtf8());
++m_indentDepth;
for (int i = 0; i < elements.size(); ++i) {