aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2014-07-18 17:22:26 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-07-21 17:15:12 +0200
commit434ee46f8121d8a16a4e94dd6fedace56f799adf (patch)
tree8cbddc76ef8beaa8fb71643d9257007ec30c69e4 /src
parent6baa546e2e3403ab51cf46baeefbe0658b0f45ca (diff)
add a simple Version class
This class replaces the Version struct in setup-qt and the ImportVersion class of the loader. Change-Id: Ic65eaf62de44ce0c082fe805431463defce1fe3b Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/app/qbs-setup-qt/setupqt.cpp20
-rw-r--r--src/lib/corelib/corelib.qbs4
-rw-r--r--src/lib/corelib/language/itemreaderastvisitor.cpp22
-rw-r--r--src/lib/corelib/language/itemreaderastvisitor.h8
-rw-r--r--src/lib/corelib/language/language.pri2
-rw-r--r--src/lib/corelib/tools/tools.pri6
-rw-r--r--src/lib/corelib/tools/version.cpp (renamed from src/lib/corelib/language/importversion.cpp)88
-rw-r--r--src/lib/corelib/tools/version.h (renamed from src/lib/corelib/language/importversion.h)48
8 files changed, 135 insertions, 63 deletions
diff --git a/src/app/qbs-setup-qt/setupqt.cpp b/src/app/qbs-setup-qt/setupqt.cpp
index 567ba3920..eabe889e6 100644
--- a/src/app/qbs-setup-qt/setupqt.cpp
+++ b/src/app/qbs-setup-qt/setupqt.cpp
@@ -35,6 +35,7 @@
#include <tools/hostosinfo.h>
#include <tools/profile.h>
#include <tools/settings.h>
+#include <tools/version.h>
#include <QByteArrayMatcher>
#include <QCoreApplication>
@@ -48,20 +49,10 @@
namespace qbs {
using Internal::HostOsInfo;
using Internal::Tr;
+using Internal::Version;
const QString qmakeExecutableName = QLatin1String("qmake" QTC_HOST_EXE_SUFFIX);
-struct Version
-{
- Version()
- : majorVersion(0), minorVersion(0), patchLevel(0)
- {}
-
- int majorVersion;
- int minorVersion;
- int patchLevel;
-};
-
static QStringList collectQmakePaths()
{
QStringList qmakePaths;
@@ -154,7 +145,8 @@ static Version extractVersion(const QString &versionString)
{
Version v;
const QStringList parts = versionString.split(QLatin1Char('.'), QString::SkipEmptyParts);
- const QList<int *> vparts = QList<int *>() << &v.majorVersion << &v.minorVersion << &v.patchLevel;
+ const QList<int *> vparts
+ = QList<int *>() << &v.majorVersionRef() << &v.minorVersionRef() << &v.patchLevelRef();
const int c = qMin(parts.count(), vparts.count());
for (int i = 0; i < c; ++i)
*vparts[i] = parts.at(i).toInt();
@@ -187,7 +179,7 @@ QtEnvironment SetupQt::fetchEnvironment(const QString &qmakePath)
const Version qtVersion = extractVersion(qtEnvironment.qtVersion);
QString mkspecsBaseSrcPath;
- if (qtVersion.majorVersion >= 5) {
+ if (qtVersion.majorVersion() >= 5) {
qtEnvironment.mkspecBasePath
= pathQueryValue(queryOutput, "QT_HOST_DATA") + QLatin1String("/mkspecs");
mkspecsBaseSrcPath
@@ -219,7 +211,7 @@ QtEnvironment SetupQt::fetchEnvironment(const QString &qmakePath)
qtEnvironment.qtConfigItems = configVariableItems(qconfigContent, QLatin1String("QT_CONFIG"));
// retrieve the mkspec
- if (qtVersion.majorVersion >= 5) {
+ if (qtVersion.majorVersion() >= 5) {
const QString mkspecName = QString::fromLocal8Bit(queryOutput.value("QMAKE_XSPEC"));
qtEnvironment.mkspecName = mkspecName;
qtEnvironment.mkspecPath = qtEnvironment.mkspecBasePath + QLatin1Char('/') + mkspecName;
diff --git a/src/lib/corelib/corelib.qbs b/src/lib/corelib/corelib.qbs
index f258e3bb5..9107314d7 100644
--- a/src/lib/corelib/corelib.qbs
+++ b/src/lib/corelib/corelib.qbs
@@ -199,8 +199,6 @@ QbsLibrary {
"functiondeclaration.h",
"identifiersearch.cpp",
"identifiersearch.h",
- "importversion.cpp",
- "importversion.h",
"item.cpp",
"item.h",
"itemdeclaration.cpp",
@@ -324,6 +322,8 @@ QbsLibrary {
"shellutils.cpp",
"shellutils.h",
"weakpointer.h"
+ "version.cpp",
+ "version.h"
]
}
Group {
diff --git a/src/lib/corelib/language/itemreaderastvisitor.cpp b/src/lib/corelib/language/itemreaderastvisitor.cpp
index dce00cdfe..690a944db 100644
--- a/src/lib/corelib/language/itemreaderastvisitor.cpp
+++ b/src/lib/corelib/language/itemreaderastvisitor.cpp
@@ -52,7 +52,7 @@ namespace Internal {
ItemReaderASTVisitor::ItemReaderASTVisitor(ItemReader *reader, ItemReaderResult *result)
: m_reader(reader)
, m_readerResult(result)
- , m_languageVersion(ImportVersion::fromString(reader->builtins()->languageVersion()))
+ , m_languageVersion(readImportVersion(reader->builtins()->languageVersion()))
, m_file(FileContext::create())
, m_item(0)
, m_sourceValue(0)
@@ -424,6 +424,22 @@ bool ItemReaderASTVisitor::visit(AST::FunctionDeclaration *ast)
return false;
}
+Version ItemReaderASTVisitor::readImportVersion(const QString &str, const CodeLocation &location)
+{
+ QStringList lst = str.split(QLatin1Char('.'));
+ if (Q_UNLIKELY(lst.count() < 1 || lst.count() > 2))
+ throw ErrorInfo(Tr::tr("Wrong number of components in import version."), location);
+ Version v;
+ int *parts[] = {&v.majorVersionRef(), &v.minorVersionRef(), 0};
+ for (int i = 0; i < lst.count(); ++i) {
+ bool ok;
+ *parts[i] = lst.at(i).toInt(&ok);
+ if (Q_UNLIKELY(!ok))
+ throw ErrorInfo(Tr::tr("Cannot parse import version."), location);
+ }
+ return v;
+}
+
bool ItemReaderASTVisitor::visitStatement(AST::Statement *statement)
{
QBS_CHECK(statement);
@@ -482,8 +498,8 @@ void ItemReaderASTVisitor::checkImportVersion(const AST::SourceLocation &version
if (!versionToken.length)
return;
const QString importVersionString = m_file->content().mid(versionToken.offset, versionToken.length);
- const ImportVersion importVersion
- = ImportVersion::fromString(importVersionString, toCodeLocation(versionToken));
+ const Version importVersion = readImportVersion(importVersionString,
+ toCodeLocation(versionToken));
if (Q_UNLIKELY(importVersion != m_languageVersion))
throw ErrorInfo(Tr::tr("Incompatible qbs version %1. This is qbs %2.").arg(
importVersionString, m_reader->builtins()->languageVersion()),
diff --git a/src/lib/corelib/language/itemreaderastvisitor.h b/src/lib/corelib/language/itemreaderastvisitor.h
index 5d12aac35..b92de888e 100644
--- a/src/lib/corelib/language/itemreaderastvisitor.h
+++ b/src/lib/corelib/language/itemreaderastvisitor.h
@@ -30,10 +30,12 @@
#ifndef QBS_ITEMREADERASTVISITOR_H
#define QBS_ITEMREADERASTVISITOR_H
-#include "importversion.h"
#include "item.h"
#include "filecontext.h"
+
#include <parser/qmljsastvisitor_p.h>
+#include <tools/version.h>
+
#include <QHash>
namespace qbs {
@@ -59,6 +61,8 @@ public:
bool visit(QbsQmlJS::AST::FunctionDeclaration *ast);
private:
+ static Version readImportVersion(const QString &str,
+ const CodeLocation &location = CodeLocation());
bool visitStatement(QbsQmlJS::AST::Statement *statement);
CodeLocation toCodeLocation(const QbsQmlJS::AST::SourceLocation &location) const;
void checkDuplicateBinding(Item *item, const QStringList &bindingName,
@@ -77,7 +81,7 @@ private:
ItemReader *m_reader;
ItemReaderResult *m_readerResult;
- const ImportVersion m_languageVersion;
+ const Version m_languageVersion;
FileContextPtr m_file;
QHash<QStringList, QString> m_typeNameToFile;
Item *m_item;
diff --git a/src/lib/corelib/language/language.pri b/src/lib/corelib/language/language.pri
index 9a68d241d..83829d61a 100644
--- a/src/lib/corelib/language/language.pri
+++ b/src/lib/corelib/language/language.pri
@@ -12,7 +12,6 @@ HEADERS += \
$$PWD/forward_decls.h \
$$PWD/functiondeclaration.h \
$$PWD/identifiersearch.h \
- $$PWD/importversion.h \
$$PWD/item.h \
$$PWD/itemdeclaration.h \
$$PWD/itemobserver.h \
@@ -44,7 +43,6 @@ SOURCES += \
$$PWD/filecontextbase.cpp \
$$PWD/filetags.cpp \
$$PWD/identifiersearch.cpp \
- $$PWD/importversion.cpp \
$$PWD/item.cpp \
$$PWD/itemdeclaration.cpp \
$$PWD/itempool.cpp \
diff --git a/src/lib/corelib/tools/tools.pri b/src/lib/corelib/tools/tools.pri
index ea7a07b56..ed959daeb 100644
--- a/src/lib/corelib/tools/tools.pri
+++ b/src/lib/corelib/tools/tools.pri
@@ -27,7 +27,8 @@ HEADERS += \
$$PWD/weakpointer.h \
$$PWD/qbs_export.h \
$$PWD/qbsassert.h \
- $$PWD/qttools.h
+ $$PWD/qttools.h \
+ $$PWD/version.h
SOURCES += \
$$PWD/buildgraphlocker.cpp \
@@ -50,7 +51,8 @@ SOURCES += \
$$PWD/cleanoptions.cpp \
$$PWD/setupprojectparameters.cpp \
$$PWD/qbsassert.cpp \
- $$PWD/qttools.cpp
+ $$PWD/qttools.cpp \
+ $$PWD/version.cpp
win32 {
SOURCES += $$PWD/filetime_win.cpp
diff --git a/src/lib/corelib/language/importversion.cpp b/src/lib/corelib/tools/version.cpp
index 848775016..b755ad52e 100644
--- a/src/lib/corelib/language/importversion.cpp
+++ b/src/lib/corelib/tools/version.cpp
@@ -27,50 +27,84 @@
**
****************************************************************************/
-#include "importversion.h"
-#include <logging/translator.h>
-#include <tools/error.h>
-#include <QStringList>
+#include "version.h"
namespace qbs {
namespace Internal {
-ImportVersion::ImportVersion()
- : m_major(0), m_minor(0)
+Version::Version(int major, int minor, int patch, int buildNr)
+ : m_major(major), m_minor(minor), m_patch(patch), m_build(buildNr)
{
}
-ImportVersion ImportVersion::fromString(const QString &str, const CodeLocation &location)
+int Version::majorVersion() const
{
- QStringList lst = str.split(QLatin1Char('.'));
- if (Q_UNLIKELY(lst.count() < 1 || lst.count() > 2))
- throw ErrorInfo(Tr::tr("Wrong number of components in import version."), location);
- ImportVersion v;
- int *parts[] = {&v.m_major, &v.m_minor, 0};
- for (int i = 0; i < lst.count(); ++i) {
- if (!parts[i])
- break;
- bool ok;
- *parts[i] = lst.at(i).toInt(&ok);
- if (Q_UNLIKELY(!ok))
- throw ErrorInfo(Tr::tr("Cannot parse import version."), location);
- }
- return v;
+ return m_major;
}
-bool ImportVersion::operator <(const ImportVersion &rhs) const
+void Version::setMajorVersion(int major)
{
- return m_major < rhs.m_major || (m_major == rhs.m_major && m_minor < rhs.m_minor);
+ m_major = major;
}
-bool ImportVersion::operator ==(const ImportVersion &rhs) const
+int Version::minorVersion() const
{
- return m_major == rhs.m_major && m_minor == rhs.m_minor;
+ return m_minor;
}
-bool ImportVersion::operator !=(const ImportVersion &rhs) const
+void Version::setMinorVersion(int minor)
{
- return !operator ==(rhs);
+ m_minor = minor;
+}
+int Version::patchLevel() const
+{
+ return m_patch;
+}
+
+void Version::setPatchLevel(int patch)
+{
+ m_patch = patch;
+}
+
+int Version::buildNumber() const
+{
+ return m_build;
+}
+
+void Version::setBuildNumber(int nr)
+{
+ m_build = nr;
+}
+
+QString Version::toString() const
+{
+ QString s;
+ if (m_build)
+ s.sprintf("%d.%d.%d-d", m_major, m_minor, m_patch, m_build);
+ else
+ s.sprintf("%d.%d.%d", m_major, m_minor, m_patch);
+ return s;
+}
+
+int compare(const Version &lhs, const Version &rhs)
+{
+ if (lhs.m_major < rhs.m_major)
+ return -1;
+ if (lhs.m_major > rhs.m_major)
+ return 1;
+ if (lhs.m_minor < rhs.m_minor)
+ return -1;
+ if (lhs.m_minor > rhs.m_minor)
+ return 1;
+ if (lhs.m_patch < rhs.m_patch)
+ return -1;
+ if (lhs.m_patch > rhs.m_patch)
+ return 1;
+ if (lhs.m_build < rhs.m_build)
+ return -1;
+ if (lhs.m_build > rhs.m_build)
+ return 1;
+ return 0;
}
} // namespace Internal
diff --git a/src/lib/corelib/language/importversion.h b/src/lib/corelib/tools/version.h
index 034258793..8243d9091 100644
--- a/src/lib/corelib/language/importversion.h
+++ b/src/lib/corelib/tools/version.h
@@ -27,32 +27,58 @@
**
****************************************************************************/
-#ifndef QBS_IMPORTVERSION_H
-#define QBS_IMPORTVERSION_H
+#ifndef QBS_VERSION_H
+#define QBS_VERSION_H
-#include <tools/codelocation.h>
+#include "qbs_export.h"
+#include <QString>
namespace qbs {
namespace Internal {
-class ImportVersion
+class QBS_EXPORT Version
{
+ friend int compare(const Version &lhs, const Version &rhs);
public:
- ImportVersion();
+ explicit Version(int majorVersion = 0, int minorVersion = 0, int patchLevel = 0,
+ int buildNr = 0);
- static ImportVersion fromString(const QString &str,
- const CodeLocation &location = CodeLocation());
+ bool isValid() const { return m_major || m_minor || m_patch || m_build; }
- bool operator <(const ImportVersion &rhs) const;
- bool operator ==(const ImportVersion &rhs) const;
- bool operator !=(const ImportVersion &rhs) const;
+ int &majorVersionRef() { return m_major; }
+ int majorVersion() const;
+ void setMajorVersion(int majorVersion);
+
+ int &minorVersionRef() { return m_minor; }
+ int minorVersion() const;
+ void setMinorVersion(int minorVersion);
+
+ int &patchLevelRef() { return m_patch; }
+ int patchLevel() const;
+ void setPatchLevel(int patchLevel);
+
+ int &buildNumberRef() { return m_build; }
+ int buildNumber() const;
+ void setBuildNumber(int nr);
+
+ QString toString() const;
private:
int m_major;
int m_minor;
+ int m_patch;
+ int m_build;
};
+int compare(const Version &lhs, const Version &rhs);
+inline bool operator==(const Version &lhs, const Version &rhs) { return compare(lhs, rhs) == 0; }
+inline bool operator!=(const Version &lhs, const Version &rhs) { return !operator==(lhs, rhs); }
+inline bool operator<(const Version &lhs, const Version &rhs) { return compare(lhs, rhs) < 0; }
+inline bool operator>(const Version &lhs, const Version &rhs) { return compare(lhs, rhs) > 0; }
+inline bool operator<=(const Version &lhs, const Version &rhs) { return !operator>(lhs, rhs); }
+inline bool operator>=(const Version &lhs, const Version &rhs) { return !operator<(lhs, rhs); }
+
} // namespace Internal
} // namespace qbs
-#endif // QBS_IMPORTVERSION_H
+#endif // QBS_VERSION_H