diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp index 02903718dc7..f32306f9b23 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp @@ -47,11 +47,11 @@ namespace ProjectExplorer { namespace Internal { -AbstractMsvcToolChain::AbstractMsvcToolChain(const QByteArray &id, +AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId, Detection d, const Abi &abi, const QString& vcvarsBat) : - ToolChain(id, d), + ToolChain(typeId, d), m_lastEnvironment(Utils::Environment::systemEnvironment()), m_abi(abi), m_vcvarsBat(vcvarsBat) @@ -62,8 +62,8 @@ AbstractMsvcToolChain::AbstractMsvcToolChain(const QByteArray &id, Q_ASSERT(!m_vcvarsBat.isEmpty()); } -AbstractMsvcToolChain::AbstractMsvcToolChain(const QByteArray &id, Detection d) : - ToolChain(id, d), +AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId, Detection d) : + ToolChain(typeId, d), m_lastEnvironment(Utils::Environment::systemEnvironment()) { } diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.h b/src/plugins/projectexplorer/abstractmsvctoolchain.h index 8797d69945f..c7017b7a999 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.h +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.h @@ -44,8 +44,8 @@ namespace Internal { class PROJECTEXPLORER_EXPORT AbstractMsvcToolChain : public ToolChain { public: - explicit AbstractMsvcToolChain(const QByteArray &id, Detection d, const Abi &abi, const QString& vcvarsBat); - explicit AbstractMsvcToolChain(const QByteArray &id, Detection d); + explicit AbstractMsvcToolChain(Core::Id typeId, Detection d, const Abi &abi, const QString& vcvarsBat); + explicit AbstractMsvcToolChain(Core::Id typeId, Detection d); Abi targetAbi() const override; diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 343a6109333..80b3bde2f3c 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -248,8 +248,8 @@ GccToolChain::GccToolChain(Detection d) : ToolChain(Constants::GCC_TOOLCHAIN_ID, d) { } -GccToolChain::GccToolChain(const QByteArray &id, Detection d) : - ToolChain(id, d) +GccToolChain::GccToolChain(Core::Id typeId, Detection d) : + ToolChain(typeId, d) { } void GccToolChain::setCompilerCommand(const FileName &path) diff --git a/src/plugins/projectexplorer/gcctoolchain.h b/src/plugins/projectexplorer/gcctoolchain.h index 8cf7029e988..d63c71e508d 100644 --- a/src/plugins/projectexplorer/gcctoolchain.h +++ b/src/plugins/projectexplorer/gcctoolchain.h @@ -57,7 +57,7 @@ class LinuxIccToolChainFactory; class PROJECTEXPLORER_EXPORT GccToolChain : public ToolChain { public: - GccToolChain(const QByteArray &id, Detection d); + GccToolChain(Core::Id typeId, Detection d); QString type() const override; QString typeDisplayName() const override; Abi targetAbi() const override; diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 2c8be620b6c..75082a69402 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -36,6 +36,7 @@ #include "task.h" #include +#include #include #include @@ -56,20 +57,14 @@ class ToolChainPrivate public: typedef ToolChain::Detection Detection; - explicit ToolChainPrivate(const QByteArray &id, Detection d) : + explicit ToolChainPrivate(Core::Id typeId, Detection d) : + m_id(QUuid::createUuid().toByteArray()), + m_typeId(typeId), m_detection(d) - { - m_id = createId(id); - } - - static QByteArray createId(const QByteArray &id) - { - QByteArray newId = id.left(id.indexOf(':')); - newId.append(':' + QUuid::createUuid().toByteArray()); - return newId; - } + { } QByteArray m_id; + Core::Id m_typeId; Detection m_detection; mutable QString m_displayName; }; @@ -84,12 +79,12 @@ public: // -------------------------------------------------------------------------- -ToolChain::ToolChain(const QByteArray &id, Detection d) : - d(new Internal::ToolChainPrivate(id, d)) +ToolChain::ToolChain(Core::Id typeId, Detection d) : + d(new Internal::ToolChainPrivate(typeId, d)) { } ToolChain::ToolChain(const ToolChain &other) : - d(new Internal::ToolChainPrivate(other.d->m_id, ManualDetection)) + d(new Internal::ToolChainPrivate(other.d->m_typeId, ManualDetection)) { // leave the autodetection bit at false. d->m_displayName = QCoreApplication::translate("ProjectExplorer::ToolChain", "Clone of %1") @@ -137,6 +132,11 @@ Utils::FileName ToolChain::suggestedDebugger() const return ToolChainManager::defaultDebugger(targetAbi()); } +Core::Id ToolChain::typeId() const +{ + return d->m_typeId; +} + bool ToolChain::canClone() const { return true; @@ -147,11 +147,8 @@ bool ToolChain::operator == (const ToolChain &tc) const if (this == &tc) return true; - const QByteArray thisId = id().left(id().indexOf(':')); - const QByteArray tcId = tc.id().left(tc.id().indexOf(':')); - // We ignore displayname - return thisId == tcId && isAutoDetected() == tc.isAutoDetected(); + return typeId() == tc.typeId() && isAutoDetected() == tc.isAutoDetected(); } /*! @@ -163,7 +160,8 @@ bool ToolChain::operator == (const ToolChain &tc) const QVariantMap ToolChain::toMap() const { QVariantMap result; - result.insert(QLatin1String(ID_KEY), QString::fromUtf8(id())); + QString idToSave = d->m_typeId.toString() + QLatin1Char(':') + QString::fromUtf8(id()); + result.insert(QLatin1String(ID_KEY), idToSave); result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName()); result.insert(QLatin1String(AUTODETECT_KEY), isAutoDetected()); @@ -192,8 +190,14 @@ void ToolChain::setDetection(ToolChain::Detection de) bool ToolChain::fromMap(const QVariantMap &data) { d->m_displayName = data.value(QLatin1String(DISPLAY_NAME_KEY)).toString(); + // make sure we have new style ids: - d->m_id = data.value(QLatin1String(ID_KEY)).toByteArray(); + const QString id = data.value(QLatin1String(ID_KEY)).toString(); + int pos = id.indexOf(QLatin1Char(':')); + QTC_ASSERT(pos > 0, return false); + d->m_typeId = Core::Id::fromString(id.left(pos)); + d->m_id = id.mid(pos).toUtf8(); + const bool autoDetect = data.value(QLatin1String(AUTODETECT_KEY), false).toBool(); d->m_detection = autoDetect ? AutoDetectionFromSettings : ManualDetection; @@ -262,11 +266,6 @@ QByteArray ToolChainFactory::idFromMap(const QVariantMap &data) return data.value(QLatin1String(ID_KEY)).toByteArray(); } -void ToolChainFactory::idToMap(QVariantMap &data, const QString id) -{ - data.insert(QLatin1String(ID_KEY), id); -} - void ToolChainFactory::autoDetectionToMap(QVariantMap &data, bool detected) { data.insert(QLatin1String(AUTODETECT_KEY), detected); diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index dd31161a017..8d6f23dc45d 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -83,6 +83,7 @@ public: virtual Utils::FileName suggestedDebugger() const; virtual QString type() const = 0; + Core::Id typeId() const; virtual QString typeDisplayName() const = 0; virtual Abi targetAbi() const = 0; @@ -157,7 +158,7 @@ public: virtual QVariantMap toMap() const; virtual QList validateKit(const Kit *k) const; protected: - explicit ToolChain(const QByteArray &id, Detection d); + explicit ToolChain(Core::Id typeId, Detection d); explicit ToolChain(const ToolChain &); void toolChainUpdated(); @@ -191,7 +192,6 @@ public: virtual ToolChain *restore(const QVariantMap &data); static QByteArray idFromMap(const QVariantMap &data); - static void idToMap(QVariantMap &data, const QString id); static void autoDetectionToMap(QVariantMap &data, bool detected); protected: diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index f59050c2d2d..22615ae7e27 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -299,7 +299,19 @@ ToolChain *ToolChainManager::findToolChain(const QByteArray &id) if (id.isEmpty()) return 0; - return Utils::findOrDefault(d->m_toolChains, Utils::equal(&ToolChain::id, id)); + ToolChain *tc = Utils::findOrDefault(d->m_toolChains, Utils::equal(&ToolChain::id, id)); + + // Compatibility with versions 3.5 and earlier: + if (!tc) { + const int pos = id.indexOf(':'); + if (pos < 0) + return tc; + + const QByteArray shortId = id.mid(pos + 1); + + tc = Utils::findOrDefault(d->m_toolChains, Utils::equal(&ToolChain::id, shortId)); + } + return tc; } FileName ToolChainManager::defaultDebugger(const Abi &abi)