diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 1e0f8f73055..d84a7b69abd 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -58,6 +58,8 @@ namespace ProjectExplorer { +const char KITINFORMATION_ID_V1[] = "PE.Profile.ToolChain"; +const char KITINFORMATION_ID_V2[] = "PE.Profile.ToolChains"; const char KITINFORMATION_ID_V3[] = "PE.Profile.ToolChainsV3"; // -------------------------------------------------------------------------- @@ -387,6 +389,65 @@ Tasks ToolChainKitAspect::validate(const Kit *k) const void ToolChainKitAspect::upgrade(Kit *k) { QTC_ASSERT(k, return); + + const Utils::Id oldIdV1 = KITINFORMATION_ID_V1; + const Utils::Id oldIdV2 = KITINFORMATION_ID_V2; + + // upgrade <=4.1 to 4.2 (keep old settings around for now) + { + const QVariant oldValue = k->value(oldIdV1); + const QVariant value = k->value(oldIdV2); + if (value.isNull() && !oldValue.isNull()) { + QVariantMap newValue; + if (oldValue.type() == QVariant::Map) { + // Used between 4.1 and 4.2: + newValue = oldValue.toMap(); + } else { + // Used up to 4.1: + newValue.insert(Deprecated::Toolchain::languageId(Deprecated::Toolchain::Cxx), oldValue.toString()); + + const Utils::Id typeId = DeviceTypeKitAspect::deviceTypeId(k); + if (typeId == Constants::DESKTOP_DEVICE_TYPE) { + // insert default C compiler which did not exist before + newValue.insert(Deprecated::Toolchain::languageId(Deprecated::Toolchain::C), + defaultToolChainIds().value(Utils::Id(Constants::C_LANGUAGE_ID))); + } + } + k->setValue(oldIdV2, newValue); + k->setSticky(oldIdV2, k->isSticky(oldIdV1)); + } + } + + // upgrade 4.2 to 4.3 (keep old settings around for now) + { + const QVariant oldValue = k->value(oldIdV2); + const QVariant value = k->value(ToolChainKitAspect::id()); + if (value.isNull() && !oldValue.isNull()) { + QVariantMap newValue = oldValue.toMap(); + QVariantMap::iterator it = newValue.find(Deprecated::Toolchain::languageId(Deprecated::Toolchain::C)); + if (it != newValue.end()) + newValue.insert(Utils::Id(Constants::C_LANGUAGE_ID).toString(), it.value()); + it = newValue.find(Deprecated::Toolchain::languageId(Deprecated::Toolchain::Cxx)); + if (it != newValue.end()) + newValue.insert(Utils::Id(Constants::CXX_LANGUAGE_ID).toString(), it.value()); + k->setValue(ToolChainKitAspect::id(), newValue); + k->setSticky(ToolChainKitAspect::id(), k->isSticky(oldIdV2)); + } + } + + // upgrade 4.3-temporary-master-state to 4.3: + { + const QVariantMap valueMap = k->value(ToolChainKitAspect::id()).toMap(); + QVariantMap result; + for (const QString &key : valueMap.keys()) { + const int pos = key.lastIndexOf('.'); + if (pos >= 0) + result.insert(key.mid(pos + 1), valueMap.value(key)); + else + result.insert(key, valueMap.value(key)); + } + k->setValue(ToolChainKitAspect::id(), result); + } } void ToolChainKitAspect::fix(Kit *k) diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 1739fc5e890..69355e44130 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -44,6 +44,7 @@ using namespace Utils; static const char ID_KEY[] = "ProjectExplorer.ToolChain.Id"; static const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ToolChain.DisplayName"; static const char AUTODETECT_KEY[] = "ProjectExplorer.ToolChain.Autodetect"; +static const char LANGUAGE_KEY_V1[] = "ProjectExplorer.ToolChain.Language"; // For QtCreator <= 4.2 static const char LANGUAGE_KEY_V2[] = "ProjectExplorer.ToolChain.LanguageV2"; // For QtCreator > 4.2 namespace ProjectExplorer { @@ -86,8 +87,41 @@ public: ToolChain::HeaderPathsCache m_headerPathsCache; }; -} // Internal +// Deprecated used from QtCreator <= 4.2 + +Utils::Id fromLanguageV1(int language) +{ + switch (language) + { + case Deprecated::Toolchain::C : + return Utils::Id(Constants::C_LANGUAGE_ID); + case Deprecated::Toolchain::Cxx: + return Utils::Id(Constants::CXX_LANGUAGE_ID); + case Deprecated::Toolchain::None: + default: + return Utils::Id(); + } +} + +} // namespace Internal + +namespace Deprecated { +namespace Toolchain { +QString languageId(Language l) +{ + switch (l) { + case Language::None: + return QStringLiteral("None"); + case Language::C: + return QStringLiteral("C"); + case Language::Cxx: + return QStringLiteral("Cxx"); + }; + return QString(); +} +} // namespace Toolchain +} // namespace Deprecated /*! \class ProjectExplorer::ToolChain @@ -219,6 +253,15 @@ QVariantMap ToolChain::toMap() const result.insert(QLatin1String(ID_KEY), idToSave); result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName()); result.insert(QLatin1String(AUTODETECT_KEY), isAutoDetected()); + // + int oldLanguageId = -1; + if (language() == ProjectExplorer::Constants::C_LANGUAGE_ID) + oldLanguageId = 1; + else if (language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID) + oldLanguageId = 2; + if (oldLanguageId >= 0) + result.insert(LANGUAGE_KEY_V1, oldLanguageId); + // result.insert(QLatin1String(LANGUAGE_KEY_V2), language().toSetting()); if (!d->m_targetAbiKey.isEmpty()) result.insert(d->m_targetAbiKey, d->m_targetAbi.toString()); @@ -328,6 +371,8 @@ bool ToolChain::fromMap(const QVariantMap &data) d->m_language = Utils::Id::fromString(langId.mid(pos + 1)); else d->m_language = Utils::Id::fromString(langId); + } else if (data.contains(LANGUAGE_KEY_V1)) { // Import from old settings + d->m_language = Internal::fromLanguageV1(data.value(QLatin1String(LANGUAGE_KEY_V1)).toInt()); } if (!d->m_language.isValid()) diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index a2d5494f87b..6c85293433b 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -51,6 +51,18 @@ namespace ProjectExplorer { namespace Internal { class ToolChainPrivate; } +namespace Deprecated { +// Deprecated in 4.3: +namespace Toolchain { +enum Language { + None = 0, + C, + Cxx +}; +QString languageId(Language l); +} // namespace Toolchain +} // namespace Deprecated + class ToolChainConfigWidget; class ToolChainFactory; class Kit;