diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-07-18 17:22:26 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-07-21 17:15:12 +0200 |
commit | 434ee46f8121d8a16a4e94dd6fedace56f799adf (patch) | |
tree | 8cbddc76ef8beaa8fb71643d9257007ec30c69e4 /src | |
parent | 6baa546e2e3403ab51cf46baeefbe0658b0f45ca (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.cpp | 20 | ||||
-rw-r--r-- | src/lib/corelib/corelib.qbs | 4 | ||||
-rw-r--r-- | src/lib/corelib/language/itemreaderastvisitor.cpp | 22 | ||||
-rw-r--r-- | src/lib/corelib/language/itemreaderastvisitor.h | 8 | ||||
-rw-r--r-- | src/lib/corelib/language/language.pri | 2 | ||||
-rw-r--r-- | src/lib/corelib/tools/tools.pri | 6 | ||||
-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 |