diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 8bb682ed4e5df5cf1581dba004dee79fad89db15..f5f5a5b20ea331477014ba960d803498c5b63eda 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -701,8 +701,8 @@ protected: exportedType.minorVersion = QString::fromUtf8(minorLit->chars(), minorLit->size()).toInt(); } else { translationUnit()->warning(ast->base_expression->firstToken(), - "The package will only be available in Qt Creator's QML editors when the package name is a string literal and\n" - "the versions are integer literals. The type will be available globally."); + "The module will not be available in Qt Creator's QML editors because the uri and version numbers\n" + "cannot be determined by static analysis. The type will still be available globally."); exportedType.packageName = QLatin1String("<default>"); } diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 910b2f543984e6f54f2eb1b3179b158b6dcf142f..94d9e01ac11241f3eea14b378ba8f93eec5e3ec5 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -2012,6 +2012,7 @@ void CppQmlTypesLoader::setSuperClasses(QMap<QString, FakeMetaObject::Ptr> *newO void CppQmlTypes::load(Engine *engine, const QList<FakeMetaObject::ConstPtr> &objects) { // load + QList<FakeMetaObject::ConstPtr> newObjects; foreach (FakeMetaObject::ConstPtr metaObject, objects) { for (int i = 0; i < metaObject->exports().size(); ++i) { const FakeMetaObject::Export &exp = metaObject->exports().at(i); @@ -2019,6 +2020,7 @@ void CppQmlTypes::load(Engine *engine, const QList<FakeMetaObject::ConstPtr> &ob if (_typesByFullyQualifiedName.contains(exp.packageNameVersion)) continue; + newObjects.append(metaObject); QmlObjectValue *objectValue = new QmlObjectValue( metaObject, exp.type, exp.package, exp.version, engine); _typesByPackage[exp.package].append(objectValue); @@ -2027,7 +2029,7 @@ void CppQmlTypes::load(Engine *engine, const QList<FakeMetaObject::ConstPtr> &ob } // set prototypes - foreach (FakeMetaObject::ConstPtr metaObject, objects) { + foreach (FakeMetaObject::ConstPtr metaObject, newObjects) { foreach (const FakeMetaObject::Export &exp, metaObject->exports()) { QmlObjectValue *objectValue = _typesByFullyQualifiedName.value(exp.packageNameVersion); if (!objectValue || !metaObject->superClass()) @@ -3328,11 +3330,12 @@ TypeEnvironment::TypeEnvironment(Engine *engine) const Value *TypeEnvironment::lookupMember(const QString &name, const Context *context, const ObjectValue **foundInObject, bool) const { - QHashIterator<const ObjectValue *, ImportInfo> it(_imports); - while (it.hasNext()) { - it.next(); - const ObjectValue *import = it.key(); - const ImportInfo &info = it.value(); + QListIterator<Import> it(_imports); + it.toBack(); + while (it.hasPrevious()) { + const Import &i = it.previous(); + const ObjectValue *import = i.object; + const ImportInfo &info = i.info; if (!info.id().isEmpty()) { if (info.id() == name) { @@ -3361,11 +3364,12 @@ const Value *TypeEnvironment::lookupMember(const QString &name, const Context *c void TypeEnvironment::processMembers(MemberProcessor *processor) const { - QHashIterator<const ObjectValue *, ImportInfo> it(_imports); - while (it.hasNext()) { - it.next(); - const ObjectValue *import = it.key(); - const ImportInfo &info = it.value(); + QListIterator<Import> it(_imports); + it.toBack(); + while (it.hasPrevious()) { + const Import &i = it.previous(); + const ObjectValue *import = i.object; + const ImportInfo &info = i.info; if (!info.id().isEmpty()) { processor->processProperty(info.id(), import); @@ -3380,7 +3384,10 @@ void TypeEnvironment::processMembers(MemberProcessor *processor) const void TypeEnvironment::addImport(const ObjectValue *import, const ImportInfo &info) { - _imports.insert(import, info); + Import i; + i.object = import; + i.info = info; + _imports.append(i); } ImportInfo TypeEnvironment::importInfo(const QString &name, const Context *context) const @@ -3390,11 +3397,12 @@ ImportInfo TypeEnvironment::importInfo(const QString &name, const Context *conte if (dotIdx != -1) firstId = firstId.left(dotIdx); - QHashIterator<const ObjectValue *, ImportInfo> it(_imports); - while (it.hasNext()) { - it.next(); - const ObjectValue *import = it.key(); - const ImportInfo &info = it.value(); + QListIterator<Import> it(_imports); + it.toBack(); + while (it.hasPrevious()) { + const Import &i = it.previous(); + const ObjectValue *import = i.object; + const ImportInfo &info = i.info; if (!info.id().isEmpty()) { if (info.id() == firstId) diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index f1e30c4bd1d18e49436e646e4dbfceb6c5187589..6bbc2ae598e19b7fda45c513626bf7f05851ca4c 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -996,7 +996,15 @@ private: class QMLJS_EXPORT TypeEnvironment: public ObjectValue { - QHash<const ObjectValue *, ImportInfo> _imports; + class Import { + public: + const ObjectValue *object; + ImportInfo info; + }; + + // holds imports in the order they appeared, + // lookup order is back to front + QList<Import> _imports; public: TypeEnvironment(Engine *engine);