From f9d7872761a38311e0a30e36383a0e3be5b6731f Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Tue, 1 Jun 2010 15:36:52 +0200
Subject: [PATCH] QmlJS: Use ComponentVersion everywhere.

---
 src/libs/qmljs/qmljsinterpreter.cpp           | 58 ++++++++-----------
 src/libs/qmljs/qmljsinterpreter.h             |  9 +--
 src/libs/qmljs/qmljslink.cpp                  | 15 +++--
 .../designercore/model/texttomodelmerger.cpp  |  8 +--
 4 files changed, 38 insertions(+), 52 deletions(-)

diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index f585d8cc482..535e4eebe7d 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -31,6 +31,7 @@
 #include "qmljsevaluate.h"
 #include "qmljslink.h"
 #include "qmljsscopebuilder.h"
+#include "qmljscomponentversion.h"
 #include "parser/qmljsast_p.h"
 
 #include <QtCore/QFile>
@@ -204,8 +205,7 @@ class FakeMetaObject {
 
     QString m_name;
     QString m_package;
-    int m_major;
-    int m_minor;
+    ComponentVersion m_version;
     const FakeMetaObject *m_super;
     QString m_superName;
     QList<FakeMetaEnum> m_enums;
@@ -216,8 +216,8 @@ class FakeMetaObject {
     QString m_defaultPropertyName;
 
 public:
-    FakeMetaObject(const QString &name, const QString &package, int majorVersion, int minorVersion)
-        : m_name(name), m_package(package), m_major(majorVersion), m_minor(minorVersion), m_super(0)
+    FakeMetaObject(const QString &name, const QString &package, ComponentVersion version)
+        : m_name(name), m_package(package), m_version(version), m_super(0)
     {}
 
     void setSuperclassName(const QString &superclass)
@@ -265,10 +265,8 @@ public:
     FakeMetaMethod method(int index) const
     { return m_methods.at(index); }
 
-    int majorVersion() const
-    { return m_major; }
-    int minorVersion() const
-    { return m_minor; }
+    ComponentVersion version() const
+    { return m_version; }
 
     QString defaultPropertyName() const
     { return m_defaultPropertyName; }
@@ -398,7 +396,7 @@ private:
 
         bool doInsert = true;
         QString name, defaultPropertyName;
-        int major = -1, minor = -1;
+        QmlJS::ComponentVersion version;
         QString extends;
         foreach (const QXmlStreamAttribute &attr, _xml.attributes()) {
             if (attr.name() == QLatin1String("name")) {
@@ -408,28 +406,29 @@ private:
                     return;
                 }
             } else if (attr.name() == QLatin1String("version")) {
-                QString version = attr.value().toString();
-                int dotIdx = version.indexOf('.');
+                QString versionStr = attr.value().toString();
+                int dotIdx = versionStr.indexOf('.');
                 if (dotIdx == -1) {
                     bool ok = false;
-                    major = version.toInt(&ok);
+                    const int major = versionStr.toInt(&ok);
                     if (!ok) {
-                        invalidAttr(version, QLatin1String("version"), tag);
+                        invalidAttr(versionStr, QLatin1String("version"), tag);
                         return;
                     }
-                    minor = -1;
+                    version = QmlJS::ComponentVersion(major, QmlJS::ComponentVersion::NoVersion);
                 } else {
                     bool ok = false;
-                    major = version.left(dotIdx).toInt(&ok);
+                    const int major = versionStr.left(dotIdx).toInt(&ok);
                     if (!ok) {
-                        invalidAttr(version, QLatin1String("version"), tag);
+                        invalidAttr(versionStr, QLatin1String("version"), tag);
                         return;
                     }
-                    minor = version.mid(dotIdx + 1).toInt(&ok);
+                    const int minor = versionStr.mid(dotIdx + 1).toInt(&ok);
                     if (!ok) {
-                        invalidAttr(version, QLatin1String("version"), tag);
+                        invalidAttr(versionStr, QLatin1String("version"), tag);
                         return;
                     }
+                    version = QmlJS::ComponentVersion(major, minor);
                 }
             } else if (attr.name() == QLatin1String("defaultProperty")) {
                 defaultPropertyName = attr.value().toString();
@@ -448,8 +447,7 @@ private:
 
         QString className, packageName;
         split(name, &packageName, &className);
-        FakeMetaObject *metaObject = new FakeMetaObject(className, packageName,
-                                                        major, minor);
+        FakeMetaObject *metaObject = new FakeMetaObject(className, packageName, version);
         if (! extends.isEmpty())
             metaObject->setSuperclassName(extends);
         if (! defaultPropertyName.isEmpty())
@@ -708,8 +706,6 @@ private:
 
 } // end of anonymous namespace
 
-const int QmlObjectValue::NoVersion = -1;
-
 QmlObjectValue::QmlObjectValue(const FakeMetaObject *metaObject, Engine *engine)
     : ObjectValue(engine),
       _metaObject(metaObject)
@@ -870,11 +866,8 @@ const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const
 QString QmlObjectValue::packageName() const
 { return _metaObject->packageName(); }
 
-int QmlObjectValue::majorVersion() const
-{ return _metaObject->majorVersion(); }
-
-int QmlObjectValue::minorVersion() const
-{ return _metaObject->minorVersion(); }
+QmlJS::ComponentVersion QmlObjectValue::version() const
+{ return _metaObject->version(); }
 
 QString QmlObjectValue::defaultPropertyName() const
 { return _metaObject->defaultPropertyName(); }
@@ -2036,20 +2029,18 @@ void CppQmlTypes::reload(Engine *interpreter)
     }
 }
 
-QList<QmlObjectValue *> CppQmlTypes::typesForImport(const QString &packageName, int majorVersion, int minorVersion) const
+QList<QmlObjectValue *> CppQmlTypes::typesForImport(const QString &packageName, ComponentVersion version) const
 {
     QMap<QString, QmlObjectValue *> objectValuesByName;
 
     foreach (QmlObjectValue *qmlObjectValue, _importedTypes.value(packageName)) {
-        if (qmlObjectValue->majorVersion() < majorVersion ||
-            (qmlObjectValue->majorVersion() == majorVersion && qmlObjectValue->minorVersion() <= minorVersion)) {
+        if (qmlObjectValue->version() <= version) {
             // we got a candidate.
             const QString typeName = qmlObjectValue->className();
             QmlObjectValue *previousCandidate = objectValuesByName.value(typeName, 0);
             if (previousCandidate) {
                 // check if our new candidate is newer than the one we found previously
-                if (qmlObjectValue->majorVersion() > previousCandidate->majorVersion() ||
-                    (qmlObjectValue->majorVersion() == previousCandidate->majorVersion() && qmlObjectValue->minorVersion() > previousCandidate->minorVersion())) {
+                if (previousCandidate->version() < qmlObjectValue->version()) {
                     // the new candidate has a higher version no. than the one we found previously, so replace it
                     objectValuesByName.insert(typeName, qmlObjectValue);
                 }
@@ -2080,8 +2071,7 @@ QmlObjectValue *CppQmlTypes::typeForImport(const QString &qualifiedName) const
 
         if (previousCandidate) {
             // check if our new candidate is newer than the one we found previously
-            if (qmlObjectValue->majorVersion() > previousCandidate->majorVersion() ||
-                (qmlObjectValue->majorVersion() == previousCandidate->majorVersion() && qmlObjectValue->minorVersion() > previousCandidate->minorVersion())) {
+            if (previousCandidate->version() < qmlObjectValue->version()) {
                 // the new candidate has a higher version no. than the one we found previously, so replace it
                 previousCandidate = qmlObjectValue;
             }
diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h
index 55705801685..69ad2427a81 100644
--- a/src/libs/qmljs/qmljsinterpreter.h
+++ b/src/libs/qmljs/qmljsinterpreter.h
@@ -32,6 +32,7 @@
 
 #include <qmljs/qmljsdocument.h>
 #include <qmljs/qmljs_global.h>
+#include <qmljs/qmljscomponentversion.h>
 #include <qmljs/parser/qmljsastfwd_p.h>
 
 #include <QtCore/QFileInfoList>
@@ -386,9 +387,6 @@ private:
 
 class QMLJS_EXPORT QmlObjectValue: public ObjectValue
 {
-public:
-    static const int NoVersion;
-
 public:
     QmlObjectValue(const FakeMetaObject *metaObject, Engine *engine);
     virtual ~QmlObjectValue();
@@ -397,8 +395,7 @@ public:
     const Value *propertyValue(const FakeMetaProperty &prop) const;
 
     QString packageName() const;
-    int majorVersion() const;
-    int minorVersion() const;
+    ComponentVersion version() const;
     QString defaultPropertyName() const;
     QString propertyType(const QString &propertyName) const;
     bool isListProperty(const QString &name) const;
@@ -540,7 +537,7 @@ class QMLJS_EXPORT CppQmlTypes
 public:
     void reload(Interpreter::Engine *interpreter);
 
-    QList<Interpreter::QmlObjectValue *> typesForImport(const QString &prefix, int majorVersion, int minorVersion) const;
+    QList<Interpreter::QmlObjectValue *> typesForImport(const QString &prefix, ComponentVersion version) const;
     Interpreter::QmlObjectValue *typeForImport(const QString &qualifiedName) const;
 
     bool hasPackage(const QString &package) const;
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp
index b3304892f13..d9656d21dbb 100644
--- a/src/libs/qmljs/qmljslink.cpp
+++ b/src/libs/qmljs/qmljslink.cpp
@@ -249,8 +249,7 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A
     }
 
     const QString packageName = Bind::toString(import->importUri, '.');
-    int majorVersion = QmlObjectValue::NoVersion;
-    int minorVersion = QmlObjectValue::NoVersion;
+    ComponentVersion version;
 
     if (import->versionToken.isValid()) {
         const QString versionString = doc->source().mid(import->versionToken.offset, import->versionToken.length);
@@ -260,8 +259,9 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A
                   tr("expected two numbers separated by a dot"));
             return;
         } else {
-            majorVersion = versionString.left(dotIdx).toInt();
-            minorVersion = versionString.mid(dotIdx + 1).toInt();
+            const int majorVersion = versionString.left(dotIdx).toInt();
+            const int minorVersion = versionString.mid(dotIdx + 1).toInt();
+            version = ComponentVersion(majorVersion, minorVersion);
         }
     } else {
         error(doc, locationFromRange(import->firstSourceLocation(), import->lastSourceLocation()),
@@ -271,7 +271,7 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A
 
     // if the package is in the meta type system, use it
     if (engine()->cppQmlTypes().hasPackage(packageName)) {
-        foreach (QmlObjectValue *object, engine()->cppQmlTypes().typesForImport(packageName, majorVersion, minorVersion)) {
+        foreach (QmlObjectValue *object, engine()->cppQmlTypes().typesForImport(packageName, version)) {
             namespaceObject->setProperty(object->className(), object);
         }
         return;
@@ -295,9 +295,8 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A
                 if (importedTypes.contains(component.typeName))
                     continue;
 
-                if (component.majorVersion > majorVersion
-                    || (component.majorVersion == majorVersion
-                        && component.minorVersion > minorVersion))
+                ComponentVersion componentVersion(component.majorVersion, component.minorVersion);
+                if (version < componentVersion)
                     continue;
 
                 importedTypes.insert(component.typeName);
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index cf5dd941500..6e45efb7f89 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -215,14 +215,14 @@ public:
         const Interpreter::QmlObjectValue * qmlValue = dynamic_cast<const Interpreter::QmlObjectValue *>(value);
         if (qmlValue) {
             typeName = qmlValue->packageName() + QLatin1String("/") + qmlValue->className();
-            majorVersion = qmlValue->majorVersion();
-            minorVersion = qmlValue->minorVersion();
+            majorVersion = qmlValue->version().major();
+            minorVersion = qmlValue->version().minor();
         } else if (value) {
             for (UiQualifiedId *iter = astTypeNode; iter; iter = iter->next)
                 if (!iter->next && iter->name)
                     typeName = iter->name->asString();
-            majorVersion = Interpreter::QmlObjectValue::NoVersion;
-            minorVersion = Interpreter::QmlObjectValue::NoVersion;
+            majorVersion = ComponentVersion::NoVersion;
+            minorVersion = ComponentVersion::NoVersion;
         }
     }
 
-- 
GitLab