From d4c2c3f214ebfbdd39674a9f281394315aab59f8 Mon Sep 17 00:00:00 2001 From: Aurindam Jana Date: Thu, 3 May 2012 11:37:30 +0200 Subject: [PATCH] QmlJSInterpreter: QML Plugin types A Component in .qmltypes can have an array of exports which may differ in type names and versions. Consider the type names to be aliases and create a CppComponentValue for each of the alias corresponding to the best available version. Change-Id: I759ae0c68441e805b0502bf2d203c524bf1a7a7c Reviewed-by: Fawzi Mohamed --- src/libs/qmljs/qmljsinterpreter.cpp | 63 +++++++++++++---------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 01c47a0dd29..bf776defa05 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1365,19 +1365,20 @@ QList CppQmlTypes::createObjectsForImport(const QStri // make new exported objects foreach (const FakeMetaObject::ConstPtr &fmo, _fakeMetaObjectsByPackage.value(package)) { - // find the highest-version export - FakeMetaObject::Export bestExport; - QList aliases; + // find the highest-version export for each alias + QHash bestExports; foreach (const FakeMetaObject::Export &exp, fmo->exports()) { - // Store all aliases - if (!exp.type.isEmpty() && !aliases.contains(exp.type)) - aliases.append(exp.type); if (exp.package != package || (version.isValid() && exp.version > version)) continue; - if (!bestExport.isValid() || exp.version > bestExport.version) - bestExport = exp; + + if (bestExports.contains(exp.type)) { + if (exp.version > bestExports.value(exp.type).version) + bestExports.insert(exp.type, exp); + } else { + bestExports.insert(exp.type, exp); + } } - if (!bestExport.isValid()) + if (bestExports.isEmpty()) continue; // if it already exists, skip @@ -1385,34 +1386,24 @@ QList CppQmlTypes::createObjectsForImport(const QStri if (_objectsByQualifiedName.contains(key)) continue; - QString name = bestExport.type; - bool exported = true; - if (name.isEmpty()) { - exported = false; - name = fmo->className(); + foreach (const FakeMetaObject::Export &bestExport, bestExports) { + QString name = bestExport.type; + bool exported = true; + if (name.isEmpty()) { + exported = false; + name = fmo->className(); + } + + CppComponentValue *newComponent = new CppComponentValue( + fmo, name, package, bestExport.version, version, + bestExport.metaObjectRevision, _valueOwner); + + // use package.cppname importversion as key + _objectsByQualifiedName.insert(key, newComponent); + if (exported) + exportedObjects += newComponent; + newObjects += newComponent; } - - CppComponentValue *newComponent = new CppComponentValue( - fmo, name, package, bestExport.version, version, - bestExport.metaObjectRevision, _valueOwner); - - // use package.cppname importversion as key - _objectsByQualifiedName.insert(key, newComponent); - - // Create CppComponentValues for all the aliases - // TODO: Show warning for deprecated ones - aliases.removeOne(name); - QList newComponents; - newComponents.append(newComponent); - foreach (const QString &alias, aliases) { - newComponents.append(new CppComponentValue( - fmo, alias, package, bestExport.version, version, - bestExport.metaObjectRevision, _valueOwner)); - } - - if (exported) - exportedObjects += newComponents; - newObjects += newComponents; } // set their prototypes, creating them if necessary