diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2011-02-08 13:22:34 +0100 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2011-02-09 10:42:49 +0100 |
commit | 2ec429e8ce7df1a017c63405442a36dd261142ac (patch) | |
tree | 03006490d7a1b6da3ea00e09d41ba9ba85be6996 /src/libs/qmljs | |
parent | dd1de1b82f9f8681aec14bc4266bb1d68d11c4fd (diff) | |
download | qt-creator-2ec429e8ce7df1a017c63405442a36dd261142ac.tar.gz |
QmlJS: Switch to new format for QML meta data.
Diffstat (limited to 'src/libs/qmljs')
-rw-r--r-- | src/libs/qmljs/qmljsinterpreter.cpp | 50 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsinterpreter.h | 13 | ||||
-rw-r--r-- | src/libs/qmljs/qmljstypedescriptionreader.cpp | 2 | ||||
-rw-r--r-- | src/libs/qmljs/qmljstypedescriptionreader.h | 9 |
4 files changed, 45 insertions, 29 deletions
diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 2e540f37b7..ae7d8bad8e 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -36,6 +36,7 @@ #include "qmljslink.h" #include "qmljsbind.h" #include "qmljsscopebuilder.h" +#include "qmljstypedescriptionreader.h" #include "parser/qmljsast_p.h" #include <languageutils/fakemetaobject.h> @@ -1943,45 +1944,48 @@ const Value *Function::invoke(const Activation *activation) const // typing environment //////////////////////////////////////////////////////////////////////////////// -QList<FakeMetaObject::ConstPtr> CppQmlTypesLoader::builtinObjects; +QHash<QString, FakeMetaObject::ConstPtr> CppQmlTypesLoader::builtinObjects; -QStringList CppQmlTypesLoader::loadXml(const QFileInfoList &xmlFiles) +QStringList CppQmlTypesLoader::loadQmlTypes(const QFileInfoList &qmlTypeFiles) { - QMap<QString, FakeMetaObject::Ptr> newObjects; + QHash<QString, FakeMetaObject::Ptr> newObjects; QStringList errorMsgs; - foreach (const QFileInfo &xmlFile, xmlFiles) { - QFile file(xmlFile.absoluteFilePath()); + foreach (const QFileInfo &qmlTypeFile, qmlTypeFiles) { + QFile file(qmlTypeFile.absoluteFilePath()); if (file.open(QIODevice::ReadOnly)) { - QmlXmlReader read(&file); - if (!read(&newObjects)) { - errorMsgs.append(read.errorMessage()); - } + QString contents = QString::fromUtf8(file.readAll()); file.close(); + + QmlJS::TypeDescriptionReader reader(contents); + if (!reader(&newObjects)) { + errorMsgs.append(reader.errorMessage()); + } } else { - errorMsgs.append(QmlXmlReader::tr("%1: %2").arg(xmlFile.absoluteFilePath(), - file.errorString())); + errorMsgs.append(QmlJS::TypeDescriptionReader::tr("%1: %2") + .arg(qmlTypeFile.absoluteFilePath(), + file.errorString())); } } if (errorMsgs.isEmpty()) { setSuperClasses(&newObjects); - // we need to go from QList<T *> of newObjects.values() to QList<const T *> + // we need to go from QHash<K, T::Ptr> to QHash<K, T::ConstPtr> // and there seems to be no better way - QMapIterator<QString, FakeMetaObject::Ptr> it(newObjects); + QHashIterator<QString, FakeMetaObject::Ptr> it(newObjects); while (it.hasNext()) { it.next(); - builtinObjects.append(it.value()); + builtinObjects.insert(it.key(), it.value()); } } return errorMsgs; } -QString CppQmlTypesLoader::parseQmlTypeXml(const QByteArray &xml, QMap<QString, FakeMetaObject::Ptr> *newObjects) +QString CppQmlTypesLoader::parseQmlTypeDescriptions(const QByteArray &xml, QHash<QString, FakeMetaObject::Ptr> *newObjects) { - QmlXmlReader reader(xml); + QmlJS::TypeDescriptionReader reader(QString::fromUtf8(xml)); if (!reader(newObjects)) { if (reader.errorMessage().isEmpty()) return QLatin1String("unknown error"); @@ -1991,16 +1995,18 @@ QString CppQmlTypesLoader::parseQmlTypeXml(const QByteArray &xml, QMap<QString, return QString(); } -void CppQmlTypesLoader::setSuperClasses(QMap<QString, FakeMetaObject::Ptr> *newObjects) +void CppQmlTypesLoader::setSuperClasses(QHash<QString, FakeMetaObject::Ptr> *newObjects) { - QMapIterator<QString, FakeMetaObject::Ptr> it(*newObjects); + QHashIterator<QString, FakeMetaObject::Ptr> it(*newObjects); while (it.hasNext()) { it.next(); FakeMetaObject::Ptr obj = it.value(); const QString superName = obj->superclassName(); if (! superName.isEmpty()) { - FakeMetaObject::Ptr superClass = newObjects->value(superName); + FakeMetaObject::ConstPtr superClass = newObjects->value(superName); + if (!superClass) + superClass = builtinObjects.value(superName); if (superClass) obj->setSuperclass(superClass); else @@ -2009,7 +2015,8 @@ void CppQmlTypesLoader::setSuperClasses(QMap<QString, FakeMetaObject::Ptr> *newO } } -void CppQmlTypes::load(Engine *engine, const QList<FakeMetaObject::ConstPtr> &objects) +template <typename T> +void CppQmlTypes::load(Engine *engine, const T &objects) { // load QList<FakeMetaObject::ConstPtr> newObjects; @@ -2052,6 +2059,9 @@ void CppQmlTypes::load(Engine *engine, const QList<FakeMetaObject::ConstPtr> &ob } } } +// explicitly instantiate load for list and hash +template void CppQmlTypes::load< QList<FakeMetaObject::ConstPtr> >(Engine *, const QList<FakeMetaObject::ConstPtr> &); +template void CppQmlTypes::load< QHash<QString, FakeMetaObject::ConstPtr> >(Engine *, const QHash<QString, FakeMetaObject::ConstPtr> &); QList<QmlObjectValue *> CppQmlTypes::typesForImport(const QString &packageName, ComponentVersion version) const { diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 2090dc71db..a97a19d5b0 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -585,20 +585,21 @@ class QMLJS_EXPORT CppQmlTypesLoader { public: /** \return an empty list when successful, error messages otherwise. */ - static QStringList loadXml(const QFileInfoList &xmlFiles); - static QList<LanguageUtils::FakeMetaObject::ConstPtr> builtinObjects; + static QStringList loadQmlTypes(const QFileInfoList &xmlFiles); + static QHash<QString, LanguageUtils::FakeMetaObject::ConstPtr> builtinObjects; // parses the xml string and fills the newObjects map - static QString parseQmlTypeXml(const QByteArray &xml, - QMap<QString, LanguageUtils::FakeMetaObject::Ptr> *newObjects); + static QString parseQmlTypeDescriptions(const QByteArray &xml, + QHash<QString, LanguageUtils::FakeMetaObject::Ptr> *newObjects); private: - static void setSuperClasses(QMap<QString, LanguageUtils::FakeMetaObject::Ptr> *newObjects); + static void setSuperClasses(QHash<QString, LanguageUtils::FakeMetaObject::Ptr> *newObjects); }; class QMLJS_EXPORT CppQmlTypes { public: - void load(Interpreter::Engine *interpreter, const QList<LanguageUtils::FakeMetaObject::ConstPtr> &objects); + template <typename T> + void load(Interpreter::Engine *interpreter, const T &objects); QList<Interpreter::QmlObjectValue *> typesForImport(const QString &prefix, LanguageUtils::ComponentVersion version) const; Interpreter::QmlObjectValue *typeForImport(const QString &qualifiedName, diff --git a/src/libs/qmljs/qmljstypedescriptionreader.cpp b/src/libs/qmljs/qmljstypedescriptionreader.cpp index 0c2b5f318a..35bce0a826 100644 --- a/src/libs/qmljs/qmljstypedescriptionreader.cpp +++ b/src/libs/qmljs/qmljstypedescriptionreader.cpp @@ -26,7 +26,7 @@ TypeDescriptionReader::~TypeDescriptionReader() { } -bool TypeDescriptionReader::operator()(QMap<QString, FakeMetaObject::Ptr> *objects) +bool TypeDescriptionReader::operator()(QHash<QString, FakeMetaObject::Ptr> *objects) { QString fileName("typeDescription"); Engine engine; diff --git a/src/libs/qmljs/qmljstypedescriptionreader.h b/src/libs/qmljs/qmljstypedescriptionreader.h index 1b7d38c9a5..21e9c3c4d5 100644 --- a/src/libs/qmljs/qmljstypedescriptionreader.h +++ b/src/libs/qmljs/qmljstypedescriptionreader.h @@ -5,6 +5,9 @@ #include <QtCore/QScopedPointer> +// for Q_DECLARE_TR_FUNCTIONS +#include <QtCore/QCoreApplication> + QT_BEGIN_NAMESPACE class QIODevice; class QBuffer; @@ -21,11 +24,13 @@ class SourceLocation; class TypeDescriptionReader { + Q_DECLARE_TR_FUNCTIONS(QmlJS::TypeDescriptionReader) + public: explicit TypeDescriptionReader(const QString &data); ~TypeDescriptionReader(); - bool operator()(QMap<QString, LanguageUtils::FakeMetaObject::Ptr> *objects); + bool operator()(QHash<QString, LanguageUtils::FakeMetaObject::Ptr> *objects); QString errorMessage() const; private: @@ -45,7 +50,7 @@ private: QString _source; QString _errorMessage; - QMap<QString, LanguageUtils::FakeMetaObject::Ptr> *_objects; + QHash<QString, LanguageUtils::FakeMetaObject::Ptr> *_objects; }; } // namespace QmlJS |