diff options
author | Lasse Holmstedt <[email protected]> | 2010-09-27 15:51:49 +0200 |
---|---|---|
committer | Lasse Holmstedt <[email protected]> | 2010-09-29 09:39:18 +0200 |
commit | 5d9858129aa9c11a9b708c3fb1701c3ed9ac9843 (patch) | |
tree | 3c269134a4ef7655b99dac2c5741cbae1b70d358 /src/tools/qml | |
parent | cfe61f6431bfe7f09f00bf548e21ad8ad0aea620 (diff) |
Compile qmldump with debugging helpers
Must be compiled during runtime - otherwise, the app may not work
with Qt that is compiled with another compiler.
Reviewed-by: hjk
Diffstat (limited to 'src/tools/qml')
-rw-r--r-- | src/tools/qml/qml.pro | 23 | ||||
-rw-r--r-- | src/tools/qml/qmldump/Info.plist | 29 | ||||
-rw-r--r-- | src/tools/qml/qmldump/main.cpp | 375 | ||||
-rw-r--r-- | src/tools/qml/qmldump/qmldump.pro | 21 |
4 files changed, 0 insertions, 448 deletions
diff --git a/src/tools/qml/qml.pro b/src/tools/qml/qml.pro deleted file mode 100644 index 5af8d71c73b..00000000000 --- a/src/tools/qml/qml.pro +++ /dev/null @@ -1,23 +0,0 @@ -TEMPLATE = subdirs - -contains(QT_CONFIG, declarative) { - - include(../../private_headers.pri) - exists($${QT_PRIVATE_HEADERS}/QtDeclarative/private/qdeclarativemetatype_p.h) { - SUBDIRS += qmldump ../../../share/qtcreator/qmljsdebugger qmlobserver - CONFIG += ordered - } else { - warning() - warning("QmlDump utility has been disabled") - warning("The helper depends on on private headers from QtDeclarative module.") - warning("This means the Qml editor will lack correct completion and type checking.") - warning("To enable it, pass 'QT_PRIVATE_HEADERS=$QTDIR/include' to qmake, where $QTDIR is the source directory of qt.") - warning() - warning("QmlObserver has been disabled") - warning("This application depends on private headers from QtDeclarative module.") - warning("This means the QML debugging facilities will be limited.") - warning("To enable it, pass 'QT_PRIVATE_HEADERS=$QTDIR/include' to qmake, where $QTDIR is the source directory of qt.") - warning() - } -} - diff --git a/src/tools/qml/qmldump/Info.plist b/src/tools/qml/qmldump/Info.plist deleted file mode 100644 index cb0561b6f09..00000000000 --- a/src/tools/qml/qmldump/Info.plist +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>NSHumanReadableCopyright</key> - <string>(C) 2008-2010 Nokia Corporation -Commercial Usage - -Licensees holding valid Qt Commercial licenses may use this file in accordance with the Qt Commercial License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and Nokia. - -GNU Lesser General Public License Usage - -Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation and appearing in the file LICENSE.LGPL included in the packaging of this file. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</string> - <key>CFBundlePackageType</key> - <string>APPL</string> - <key>CFBundleSignature</key> - <string>@TYPEINFO@</string> - <key>CFBundleExecutable</key> - <string>@EXECUTABLE@</string> - <key>CFBundleIdentifier</key> - <string>com.nokia.qtcreator.qmldump</string> - <key>CFBundleVersion</key> - <string>2.1.80</string> - <key>CFBundleShortVersionString</key> - <string>2.1.80</string> - <key>LSUIElement</key> - <string>1</string> -</dict> -</plist> diff --git a/src/tools/qml/qmldump/main.cpp b/src/tools/qml/qmldump/main.cpp deleted file mode 100644 index 61211ee07d9..00000000000 --- a/src/tools/qml/qmldump/main.cpp +++ /dev/null @@ -1,375 +0,0 @@ -#include <QApplication> -#include <QSet> -#include <QXmlStreamWriter> -#include <QXmlStreamReader> - -#include <QMetaObject> -#include <QMetaProperty> -#include <QPushButton> -#include <QDebug> -#include <iostream> -#include <QtDeclarative> -#include <QtCore/private/qobject_p.h> -#include <QtCore/private/qmetaobject_p.h> -#include <QtDeclarative/private/qdeclarativemetatype_p.h> -#include <QtDeclarative/private/qdeclarativeopenmetaobject_p.h> -#include <QtDeclarative/QDeclarativeView> - -static QHash<QByteArray, const QDeclarativeType *> qmlTypeByCppName; -static QHash<QByteArray, QByteArray> cppToQml; - -QByteArray convertToQmlType(const QByteArray &cppName) -{ - QByteArray qmlName = cppToQml.value(cppName, cppName); - qmlName.replace("::", "."); - qmlName.replace("/", "."); - return qmlName; -} - -void erasure(QByteArray *typeName, bool *isList, bool *isPointer) -{ - static QByteArray declListPrefix = "QDeclarativeListProperty<"; - - if (typeName->endsWith('*')) { - *isPointer = true; - typeName->truncate(typeName->length() - 1); - erasure(typeName, isList, isPointer); - } else if (typeName->startsWith(declListPrefix)) { - *isList = true; - typeName->truncate(typeName->length() - 1); // get rid of the suffix '>' - *typeName = typeName->mid(declListPrefix.size()); - erasure(typeName, isList, isPointer); - } - - *typeName = convertToQmlType(*typeName); -} - -void processMetaObject(const QMetaObject *meta, QSet<const QMetaObject *> *metas) -{ - if (! meta || metas->contains(meta)) - return; - - // dynamic meta objects break things badly - const QMetaObjectPrivate *mop = reinterpret_cast<const QMetaObjectPrivate *>(meta->d.data); - if (!(mop->flags & DynamicMetaObject)) - metas->insert(meta); - - processMetaObject(meta->superClass(), metas); -} - -void processObject(QObject *object, QSet<const QMetaObject *> *metas) -{ - if (! object) - return; - - const QMetaObject *meta = object->metaObject(); - qDebug() << "Processing object" << meta->className(); - processMetaObject(meta, metas); - - for (int index = 0; index < meta->propertyCount(); ++index) { - QMetaProperty prop = meta->property(index); - if (QDeclarativeMetaType::isQObject(prop.userType())) { - qDebug() << " Processing property" << prop.name(); - QObject *oo = QDeclarativeMetaType::toQObject(prop.read(object)); - if (oo && !metas->contains(oo->metaObject())) - processObject(oo, metas); - } - } -} - -void processDeclarativeType(const QDeclarativeType *ty, QSet<const QMetaObject *> *metas) -{ - processMetaObject(ty->metaObject(), metas); -} - -void writeType(QXmlStreamAttributes *attrs, QByteArray typeName) -{ - bool isList = false, isPointer = false; - erasure(&typeName, &isList, &isPointer); - attrs->append(QXmlStreamAttribute("type", typeName)); - if (isList) - attrs->append(QXmlStreamAttribute("isList", "true")); -} - -void dump(const QMetaProperty &prop, QXmlStreamWriter *xml) -{ - xml->writeStartElement("property"); - - QXmlStreamAttributes attributes; - attributes.append(QXmlStreamAttribute("name", QString::fromUtf8(prop.name()))); - - writeType(&attributes, prop.typeName()); - - xml->writeAttributes(attributes); - xml->writeEndElement(); -} - -void dump(const QMetaMethod &meth, QXmlStreamWriter *xml) -{ - if (meth.methodType() == QMetaMethod::Signal) { - if (meth.access() != QMetaMethod::Protected) - return; // nothing to do. - } else if (meth.access() != QMetaMethod::Public) { - return; // nothing to do. - } - - QByteArray name = meth.signature(); - int lparenIndex = name.indexOf('('); - if (lparenIndex == -1) { - return; // invalid signature - } - - name = name.left(lparenIndex); - - - QString elementName = QLatin1String("method"); - - QXmlStreamAttributes attributes; - if (meth.methodType() == QMetaMethod::Signal) - elementName = QLatin1String("signal"); - - xml->writeStartElement(elementName); - - attributes.append(QXmlStreamAttribute("name", name)); - - const QString typeName = convertToQmlType(meth.typeName()); - if (! typeName.isEmpty()) - attributes.append(QXmlStreamAttribute("type", typeName)); - - xml->writeAttributes(attributes); - - for (int i = 0; i < meth.parameterTypes().size(); ++i) { - QByteArray argName = meth.parameterNames().at(i); - - xml->writeStartElement("param"); - - QXmlStreamAttributes attrs; - - if (! argName.isEmpty()) - attrs.append(QXmlStreamAttribute("name", argName)); - - writeType(&attrs, meth.parameterTypes().at(i)); - xml->writeAttributes(attrs); - - xml->writeEndElement(); - } - - xml->writeEndElement(); -} - -void dump(const QMetaEnum &e, QXmlStreamWriter *xml) -{ - xml->writeStartElement("enum"); - - QXmlStreamAttributes attributes; - attributes.append(QXmlStreamAttribute("name", QString::fromUtf8(e.name()))); // ### FIXME - xml->writeAttributes(attributes); - - for (int index = 0; index < e.keyCount(); ++index) { - xml->writeStartElement("enumerator"); - - QXmlStreamAttributes attributes; - attributes.append(QXmlStreamAttribute("name", QString::fromUtf8(e.key(index)))); - attributes.append(QXmlStreamAttribute("value", QString::number(e.value(index)))); - xml->writeAttributes(attributes); - - xml->writeEndElement(); - } - - xml->writeEndElement(); -} - -class FriendlyQObject: public QObject -{ -public: - static const QMetaObject *qtMeta() { return &staticQtMetaObject; } -}; - -void dump(const QMetaObject *meta, QXmlStreamWriter *xml) -{ - QByteArray qmlTypeName = convertToQmlType(meta->className()); - - xml->writeStartElement("type"); - - QXmlStreamAttributes attributes; - attributes.append(QXmlStreamAttribute("name", qmlTypeName)); - - if (const QDeclarativeType *qmlTy = qmlTypeByCppName.value(meta->className())) { - attributes.append(QXmlStreamAttribute("version", QString("%1.%2").arg(qmlTy->majorVersion()).arg(qmlTy->minorVersion()))); - } - - for (int index = meta->classInfoCount() - 1 ; index >= 0 ; --index) { - QMetaClassInfo classInfo = meta->classInfo(index); - if (QLatin1String(classInfo.name()) == QLatin1String("DefaultProperty")) { - attributes.append(QXmlStreamAttribute("defaultProperty", QLatin1String(classInfo.value()))); - break; - } - } - - QString version; - - if (meta->superClass()) - attributes.append(QXmlStreamAttribute("extends", convertToQmlType(meta->superClass()->className()))); - - if (! version.isEmpty()) - attributes.append(QXmlStreamAttribute("version", version)); - - xml->writeAttributes(attributes); - - for (int index = meta->enumeratorOffset(); index < meta->enumeratorCount(); ++index) - dump(meta->enumerator(index), xml); - - for (int index = meta->propertyOffset(); index < meta->propertyCount(); ++index) - dump(meta->property(index), xml); - - for (int index = meta->methodOffset(); index < meta->methodCount(); ++index) - dump(meta->method(index), xml); - - xml->writeEndElement(); -} - -void writeEasingCurve(QXmlStreamWriter *xml) -{ - xml->writeStartElement("type"); - { - QXmlStreamAttributes attributes; - attributes.append(QXmlStreamAttribute("name", "QEasingCurve")); - attributes.append(QXmlStreamAttribute("extends", "Qt.Easing")); - xml->writeAttributes(attributes); - } - - xml->writeEndElement(); -} - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - if (argc != 1 && argc != 3) { - qWarning() << "Usage: qmldump [plugin/import/path plugin.uri]"; - return 1; - } - - QString pluginImportName; - QString pluginImportPath; - if (argc == 3) { - pluginImportPath = QString(argv[1]); - pluginImportName = QString(argv[2]); - } - - QDeclarativeView view; - QDeclarativeEngine *engine = view.engine(); - if (!pluginImportPath.isEmpty()) - engine->addImportPath(pluginImportPath); - - QByteArray importCode; - importCode += "import Qt 4.7;\n"; - if (pluginImportName.isEmpty()) { - importCode += "import Qt.labs.particles 4.7;\n"; - importCode += "import Qt.labs.gestures 4.7;\n"; - importCode += "import Qt.labs.folderlistmodel 4.7;\n"; - importCode += "import QtWebKit 1.0;\n"; - } else { - importCode += QString("import %0 1.0;\n").arg(pluginImportName).toAscii(); - } - - { - QByteArray code = importCode; - code += "Item {}"; - QDeclarativeComponent c(engine); - - c.setData(code, QUrl("xxx")); - c.create(); - if (!c.errors().isEmpty()) - qDebug() << c.errorString(); - } - - cppToQml.insert("QString", "string"); - cppToQml.insert("QDeclarativeEasingValueType::Type", "Type"); - - QSet<const QMetaObject *> metas; - - metas.insert(FriendlyQObject::qtMeta()); - - QMultiHash<QByteArray, QByteArray> extensions; - foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) { - qmlTypeByCppName.insert(ty->metaObject()->className(), ty); - if (ty->isExtendedType()) { - extensions.insert(ty->typeName(), ty->metaObject()->className()); - } else { - cppToQml.insert(ty->metaObject()->className(), ty->qmlTypeName()); - } - processDeclarativeType(ty, &metas); - } - - // Adjust qml names of extended objects. - // The chain ends up being: - // __extended__.originalname - the base object - // __extension_0_.originalname - first extension - // .. - // __extension_n-2_.originalname - second to last extension - // originalname - last extension - foreach (const QByteArray &extendedCpp, extensions.keys()) { - const QByteArray extendedQml = cppToQml.value(extendedCpp); - cppToQml.insert(extendedCpp, "__extended__." + extendedQml); - QList<QByteArray> extensionCppNames = extensions.values(extendedCpp); - for (int i = 0; i < extensionCppNames.size() - 1; ++i) { - QByteArray adjustedName = QString("__extension__%1.%2").arg(QString::number(i), QString(extendedQml)).toAscii(); - cppToQml.insert(extensionCppNames.value(i), adjustedName); - } - cppToQml.insert(extensionCppNames.last(), extendedQml); - } - - foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) { - if (ty->isExtendedType()) - continue; - - QByteArray tyName = ty->qmlTypeName(); - tyName = tyName.mid(tyName.lastIndexOf('/') + 1); - - QByteArray code = importCode; - code += tyName; - code += " {}\n"; - - QDeclarativeComponent c(engine); - c.setData(code, QUrl("xxx")); - - QObject *object = c.create(); - if (object) - processObject(object, &metas); - else - qDebug() << "Could not create" << tyName << ":" << c.errorString(); - } - - QByteArray bytes; - QXmlStreamWriter xml(&bytes); - xml.setAutoFormatting(true); - - xml.writeStartDocument("1.0"); - xml.writeStartElement("module"); - - QMap<QString, const QMetaObject *> nameToMeta; - foreach (const QMetaObject *meta, metas) { - nameToMeta.insert(convertToQmlType(meta->className()), meta); - } - foreach (const QMetaObject *meta, nameToMeta) { - dump(meta, &xml); - } - - // define QEasingCurve as an extension of Qt.Easing - writeEasingCurve(&xml); - - xml.writeEndElement(); - xml.writeEndDocument(); - - std::cout << bytes.constData(); - - QTimer timer; - timer.setSingleShot(true); - timer.setInterval(0); - QObject::connect(&timer, SIGNAL(timeout()), &app, SLOT(quit())); - - timer.start(); - - return app.exec(); -} diff --git a/src/tools/qml/qmldump/qmldump.pro b/src/tools/qml/qmldump/qmldump.pro deleted file mode 100644 index 31700e75496..00000000000 --- a/src/tools/qml/qmldump/qmldump.pro +++ /dev/null @@ -1,21 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2010-02-24T10:21:38 -# -#------------------------------------------------- - -TARGET = qmldump -QT += declarative -CONFIG += console - -TEMPLATE = app - -SOURCES += main.cpp - -include(../../../../qtcreator.pri) -include(../../../private_headers.pri) -DESTDIR = $$IDE_BIN_PATH -include(../../../rpath.pri) - -OTHER_FILES += Info.plist -macx:QMAKE_INFO_PLIST = Info.plist |