diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index a27b7cb0bf2290a7d59dd9493c64ada534083c87..5a3e301e8a636401b6b30eae0f852587e28e529e 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -2034,36 +2034,12 @@ void CppQmlTypes::load(Engine *engine, const T &objects) foreach (FakeMetaObject::ConstPtr metaObject, objects) { foreach (const FakeMetaObject::Export &exp, metaObject->exports()) makeObject(engine, metaObject, exp, &newObjects); - - FakeMetaObject::Export cppExport; - cppExport.package = cppPackage; - cppExport.type = metaObject->className(); - cppExport.packageNameVersion = qualifiedName(cppPackage, cppExport.type, cppExport.version); - makeObject(engine, metaObject, cppExport, &newObjects); } // set prototypes foreach (FakeMetaObject::ConstPtr metaObject, newObjects) { - foreach (const FakeMetaObject::Export &exp, metaObject->exports()) { - QmlObjectValue *objectValue = _typesByFullyQualifiedName.value(exp.packageNameVersion); - if (!objectValue || !metaObject->superClass()) - continue; - - // set prototypes for whole chain, creating new QmlObjectValues if necessary - // for instance, if an type isn't exported in the package of the super type - // Example: QObject (Qt, QtQuick) -> Positioner (not exported) -> Column (Qt, QtQuick) - // needs to create Positioner (Qt) and Positioner (QtQuick) - bool created = true; - QmlObjectValue *v = objectValue; - FakeMetaObject::ConstPtr fmo = metaObject; - while (created && fmo->superClass()) { - QmlObjectValue *superValue = getOrCreate(exp.package, fmo->superclassName(), - fmo->superClass(), engine, &created); - v->setPrototype(superValue); - v = superValue; - fmo = fmo->superClass(); - } - } + foreach (const FakeMetaObject::Export &exp, metaObject->exports()) + setPrototypes(engine, metaObject, exp); } } // explicitly instantiate load for list and hash @@ -2138,6 +2114,30 @@ void CppQmlTypes::makeObject(Engine *engine, _typesByFullyQualifiedName[exp.packageNameVersion] = objectValue; } +void CppQmlTypes::setPrototypes(Engine *engine, + FakeMetaObject::ConstPtr metaObject, + const LanguageUtils::FakeMetaObject::Export &exp) +{ + QmlObjectValue *objectValue = _typesByFullyQualifiedName.value(exp.packageNameVersion); + if (!objectValue || !metaObject->superClass()) + return; + + // set prototypes for whole chain, creating new QmlObjectValues if necessary + // for instance, if an type isn't exported in the package of the super type + // Example: QObject (Qt, QtQuick) -> Positioner (not exported) -> Column (Qt, QtQuick) + // needs to create Positioner (Qt) and Positioner (QtQuick) + bool created = true; + QmlObjectValue *v = objectValue; + FakeMetaObject::ConstPtr fmo = metaObject; + while (created && fmo->superClass()) { + QmlObjectValue *superValue = getOrCreate(exp.package, fmo->superclassName(), + fmo->superClass(), engine, &created); + v->setPrototype(superValue); + v = superValue; + fmo = fmo->superClass(); + } +} + QmlObjectValue *CppQmlTypes::getOrCreate(const QString &package, const QString &cppName, FakeMetaObject::ConstPtr metaObject, Engine *engine, bool *created) { diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index ca1aa026ddd839bca826955280225016ce0ee2c0..3732b576998d34b2b5b378f9107a743a598ae68b 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -625,6 +625,9 @@ private: LanguageUtils::FakeMetaObject::ConstPtr metaObject, const LanguageUtils::FakeMetaObject::Export &exp, QList<LanguageUtils::FakeMetaObject::ConstPtr> *newObjects); + void setPrototypes(Engine *engine, + LanguageUtils::FakeMetaObject::ConstPtr metaObject, + const LanguageUtils::FakeMetaObject::Export &exp); QmlObjectValue *getOrCreate(const QString &package, const QString &cppName, LanguageUtils::FakeMetaObject::ConstPtr metaObject, Engine *engine, bool *created); diff --git a/src/libs/qmljs/qmljstypedescriptionreader.cpp b/src/libs/qmljs/qmljstypedescriptionreader.cpp index 35bce0a826b51a590c6b70f7fa4ace22c46b19a7..a1c92d6d9f87065c3a6d84ca80297c38f58861fa 100644 --- a/src/libs/qmljs/qmljstypedescriptionreader.cpp +++ b/src/libs/qmljs/qmljstypedescriptionreader.cpp @@ -8,6 +8,7 @@ #include "parser/qmljsastvisitor_p.h" #include "qmljsbind.h" +#include "qmljsinterpreter.h" #include <QtCore/QIODevice> #include <QtCore/QBuffer> @@ -172,6 +173,8 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast) return; } + // ### add implicit export into the package of c++ types + fmo->addExport(fmo->className(), QmlJS::Interpreter::CppQmlTypes::cppPackage, ComponentVersion()); _objects->insert(fmo->className(), fmo); }